shp 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +34 -0
- data/.travis.yml +4 -0
- data/Gemfile +3 -0
- data/LICENSE +28 -0
- data/README.md +30 -0
- data/Rakefile +23 -0
- data/ext/shp/base.hpp +113 -0
- data/ext/shp/dbf.cpp +381 -0
- data/ext/shp/dbf.hpp +44 -0
- data/ext/shp/extconf.rb +13 -0
- data/ext/shp/shape_object.cpp +58 -0
- data/ext/shp/shape_object.hpp +27 -0
- data/ext/shp/shapefile.cpp +299 -0
- data/ext/shp/shapefile.hpp +35 -0
- data/ext/shp/shapelib/.cvsignore +15 -0
- data/ext/shp/shapelib/ChangeLog +450 -0
- data/ext/shp/shapelib/HOWTO-RELEASE +16 -0
- data/ext/shp/shapelib/LICENSE.LGPL +483 -0
- data/ext/shp/shapelib/Makefile +113 -0
- data/ext/shp/shapelib/README +41 -0
- data/ext/shp/shapelib/README.tree +172 -0
- data/ext/shp/shapelib/contrib/.cvsignore +12 -0
- data/ext/shp/shapelib/contrib/Makefile +66 -0
- data/ext/shp/shapelib/contrib/ShapeFileII.pas +234 -0
- data/ext/shp/shapelib/contrib/Shape_PointInPoly.cpp +238 -0
- data/ext/shp/shapelib/contrib/Shape_PointInPoly_README.txt +59 -0
- data/ext/shp/shapelib/contrib/csv2shp.c +558 -0
- data/ext/shp/shapelib/contrib/dbfcat.c +166 -0
- data/ext/shp/shapelib/contrib/dbfinfo.c +106 -0
- data/ext/shp/shapelib/contrib/makefile.vc +34 -0
- data/ext/shp/shapelib/contrib/my_nan.h +46 -0
- data/ext/shp/shapelib/contrib/shpcat.c +100 -0
- data/ext/shp/shapelib/contrib/shpcentrd.c +159 -0
- data/ext/shp/shapelib/contrib/shpdata.c +129 -0
- data/ext/shp/shapelib/contrib/shpdxf.c +340 -0
- data/ext/shp/shapelib/contrib/shpfix.c +110 -0
- data/ext/shp/shapelib/contrib/shpgeo.c +1595 -0
- data/ext/shp/shapelib/contrib/shpgeo.h +154 -0
- data/ext/shp/shapelib/contrib/shpinfo.c +113 -0
- data/ext/shp/shapelib/contrib/shpproj.c +260 -0
- data/ext/shp/shapelib/contrib/shpsort.c +605 -0
- data/ext/shp/shapelib/contrib/shpsort.txt +44 -0
- data/ext/shp/shapelib/contrib/shpwkb.c +123 -0
- data/ext/shp/shapelib/contrib/tests/shpproj.sh +38 -0
- data/ext/shp/shapelib/dbfopen.c +2221 -0
- data/ext/shp/shapelib/makefile.vc +86 -0
- data/ext/shp/shapelib/makeshape.sh +21 -0
- data/ext/shp/shapelib/mkdist.sh +37 -0
- data/ext/shp/shapelib/mkinstalldirs +38 -0
- data/ext/shp/shapelib/mkrelease.sh +55 -0
- data/ext/shp/shapelib/safileio.c +286 -0
- data/ext/shp/shapelib/shapefil.h +647 -0
- data/ext/shp/shapelib/shapelib.def +46 -0
- data/ext/shp/shapelib/shpopen.c +2388 -0
- data/ext/shp/shapelib/shptree.c +1187 -0
- data/ext/shp/shapelib/shputils.c +1072 -0
- data/ext/shp/shapelib/stream1.out +1465 -0
- data/ext/shp/shapelib/stream1.sh +28 -0
- data/ext/shp/shapelib/stream2.out +530 -0
- data/ext/shp/shapelib/stream2.sh +11 -0
- data/ext/shp/shapelib/stream3.out +37 -0
- data/ext/shp/shapelib/web/.cvsignore +2 -0
- data/ext/shp/shapelib/web/codepage.html +403 -0
- data/ext/shp/shapelib/web/dbf_api.html +436 -0
- data/ext/shp/shapelib/web/index.html +235 -0
- data/ext/shp/shapelib/web/license.html +78 -0
- data/ext/shp/shapelib/web/manifest.html +87 -0
- data/ext/shp/shapelib/web/release.html +80 -0
- data/ext/shp/shapelib/web/shapelib-tools.html +352 -0
- data/ext/shp/shapelib/web/shp_api.html +376 -0
- data/ext/shp/shp.cpp +19 -0
- data/ext/shp/shp.hpp +47 -0
- data/lib/shp.rb +35 -0
- data/lib/shp/version.rb +3 -0
- data/shp.gemspec +23 -0
- data/spec/shp_spec.rb +127 -0
- metadata +176 -0
@@ -0,0 +1,113 @@
|
|
1
|
+
|
2
|
+
PREFIX = /usr/local
|
3
|
+
CFLAGS = -g -Wall -fPIC
|
4
|
+
#CFLAGS = -g -DUSE_CPL
|
5
|
+
#CC = g++
|
6
|
+
|
7
|
+
LIBOBJ = shpopen.o dbfopen.o safileio.o shptree.o
|
8
|
+
SHPBIN = shpcreate shpadd shpdump shprewind dbfcreate dbfadd dbfdump \
|
9
|
+
shptreedump
|
10
|
+
|
11
|
+
default: all
|
12
|
+
|
13
|
+
all: $(SHPBIN) shptest lib
|
14
|
+
|
15
|
+
shpopen.o: shpopen.c shapefil.h
|
16
|
+
$(CC) $(CFLAGS) -c shpopen.c
|
17
|
+
|
18
|
+
shptree.o: shptree.c shapefil.h
|
19
|
+
$(CC) $(CFLAGS) -c shptree.c
|
20
|
+
|
21
|
+
dbfopen.o: dbfopen.c shapefil.h
|
22
|
+
$(CC) $(CFLAGS) -c dbfopen.c
|
23
|
+
|
24
|
+
safileio.o: safileio.c shapefil.h
|
25
|
+
$(CC) $(CFLAGS) -c safileio.c
|
26
|
+
|
27
|
+
shpcreate: shpcreate.c shpopen.o safileio.o
|
28
|
+
$(CC) $(CFLAGS) shpcreate.c shpopen.o safileio.o $(LINKOPT) -o shpcreate
|
29
|
+
|
30
|
+
shpadd: shpadd.c shpopen.o safileio.o
|
31
|
+
$(CC) $(CFLAGS) shpadd.c shpopen.o safileio.o $(LINKOPT) -o shpadd
|
32
|
+
|
33
|
+
shpdump: shpdump.c shpopen.o safileio.o
|
34
|
+
$(CC) $(CFLAGS) shpdump.c shpopen.o safileio.o $(LINKOPT) -o shpdump
|
35
|
+
|
36
|
+
shprewind: shprewind.c shpopen.o safileio.o
|
37
|
+
$(CC) $(CFLAGS) shprewind.c shpopen.o safileio.o $(LINKOPT) -o shprewind
|
38
|
+
|
39
|
+
dbfcreate: dbfcreate.c dbfopen.o safileio.o
|
40
|
+
$(CC) $(CFLAGS) dbfcreate.c dbfopen.o safileio.o $(LINKOPT) -o dbfcreate
|
41
|
+
|
42
|
+
dbfadd: dbfadd.c dbfopen.o safileio.o
|
43
|
+
$(CC) $(CFLAGS) dbfadd.c dbfopen.o safileio.o $(LINKOPT) -o dbfadd
|
44
|
+
|
45
|
+
dbfdump: dbfdump.c dbfopen.o safileio.o
|
46
|
+
$(CC) $(CFLAGS) dbfdump.c dbfopen.o safileio.o $(LINKOPT) -o dbfdump
|
47
|
+
|
48
|
+
shptest: shptest.c shpopen.o safileio.o
|
49
|
+
$(CC) $(CFLAGS) shptest.c shpopen.o safileio.o $(LINKOPT) -o shptest
|
50
|
+
|
51
|
+
shputils: shputils.c shpopen.o safileio.o dbfopen.o
|
52
|
+
$(CC) $(CFLAGS) shputils.c shpopen.o safileio.o dbfopen.o $(LINKOPT) -o shputils
|
53
|
+
|
54
|
+
shptreedump: shptreedump.c shptree.o shpopen.o safileio.o
|
55
|
+
$(CC) $(CFLAGS) shptreedump.c shptree.o shpopen.o safileio.o $(LINKOPT) \
|
56
|
+
-o shptreedump
|
57
|
+
|
58
|
+
clean:
|
59
|
+
rm -f *.o shptest $(SHPBIN) libshp.a
|
60
|
+
|
61
|
+
test: test2 test3
|
62
|
+
|
63
|
+
#
|
64
|
+
# Note this stream only works if example data is accessable.
|
65
|
+
# Fetch ftp://gdal.velocet.ca/pub/outgoing/shape_eg_data.zip
|
66
|
+
#
|
67
|
+
test1:
|
68
|
+
@./stream1.sh > s1.out
|
69
|
+
@if test "`diff s1.out stream1.out`" = '' ; then \
|
70
|
+
echo "******* Stream 1 Succeeded *********"; \
|
71
|
+
rm s1.out; \
|
72
|
+
else \
|
73
|
+
echo "******* Stream 1 Failed *********"; \
|
74
|
+
diff s1.out stream1.out; \
|
75
|
+
fi
|
76
|
+
|
77
|
+
test2:
|
78
|
+
@./stream2.sh > s2.out
|
79
|
+
@if test "`diff s2.out stream2.out`" = '' ; then \
|
80
|
+
echo "******* Stream 2 Succeeded *********"; \
|
81
|
+
rm s2.out; \
|
82
|
+
rm test*.s??; \
|
83
|
+
else \
|
84
|
+
echo "******* Stream 2 Failed *********"; \
|
85
|
+
diff s2.out stream2.out; \
|
86
|
+
fi
|
87
|
+
|
88
|
+
test3:
|
89
|
+
@./makeshape.sh > s3.out
|
90
|
+
@if test "`diff s3.out stream3.out`" = '' ; then \
|
91
|
+
echo "******* Stream 3 Succeeded *********"; \
|
92
|
+
rm s3.out; \
|
93
|
+
rm test.*; \
|
94
|
+
else \
|
95
|
+
echo "******* Stream 3 Failed *********"; \
|
96
|
+
diff s3.out stream3.out; \
|
97
|
+
fi
|
98
|
+
|
99
|
+
|
100
|
+
lib: libshp.a
|
101
|
+
|
102
|
+
libshp.a: $(LIBOBJ)
|
103
|
+
ar r libshp.a $(LIBOBJ)
|
104
|
+
|
105
|
+
lib_install: libshp.a
|
106
|
+
cp libshp.a $(PREFIX)/lib
|
107
|
+
cp shapefil.h $(PREFIX)/include
|
108
|
+
|
109
|
+
bin_install: $(SHPBIN)
|
110
|
+
cp $(SHPBIN) $(PREFIX)/bin
|
111
|
+
|
112
|
+
install: lib_install bin_install
|
113
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
Please read shapelib.html.
|
3
|
+
|
4
|
+
Building on Unix
|
5
|
+
----------------
|
6
|
+
|
7
|
+
1) Edit Makefile, and set CFLAGS, and CC macros as required for the
|
8
|
+
target system. Often the defaults will work fine.
|
9
|
+
|
10
|
+
2) type "make"
|
11
|
+
|
12
|
+
The result should be:
|
13
|
+
|
14
|
+
Core shapelib support.
|
15
|
+
shpopen.o
|
16
|
+
dbfopen.o
|
17
|
+
safileio.o
|
18
|
+
shptree.o
|
19
|
+
libshp.a
|
20
|
+
|
21
|
+
Utility/demonstration programs:
|
22
|
+
shpcreate, shpdump, shpadd, dbfcreate, dbfdump, dbfadd, shptreedump
|
23
|
+
|
24
|
+
3) To test type:
|
25
|
+
make test
|
26
|
+
|
27
|
+
4) To libshp.a and the test binaries in /usr/local:
|
28
|
+
make install
|
29
|
+
|
30
|
+
|
31
|
+
Building on Windows
|
32
|
+
-------------------
|
33
|
+
|
34
|
+
If you have run the VC++ VCVARS32.BAT, you should be able to type the
|
35
|
+
following in a command window to build the code and executables:
|
36
|
+
|
37
|
+
C:> nmake /f makefile.vc
|
38
|
+
|
39
|
+
Otherwise create your own VC++ project. There aren't many files to deal with
|
40
|
+
here!
|
41
|
+
|
@@ -0,0 +1,172 @@
|
|
1
|
+
Venkat,
|
2
|
+
|
3
|
+
I have completed the planned Shapefile quadtree mechanism. The additions
|
4
|
+
to the traditional Shapelib are found in shptree.c (functions supporting
|
5
|
+
quad tree searching and query). There are also some new prototypes for
|
6
|
+
the tree stuff in shapefil.h ... including some prototypes for functions
|
7
|
+
you don't require and hence that I haven't implemented at this time.
|
8
|
+
|
9
|
+
I have also prepared a demonstration program using the API. That is
|
10
|
+
the ``shpdumptree'' program, with the source code in shpdumptree.c. The
|
11
|
+
shpdumptree program has two functions. One is to dump an ASCII rendering
|
12
|
+
of the internal quadtree, and the other is example use of a quad tree
|
13
|
+
searching function.
|
14
|
+
|
15
|
+
Dumping the Tree
|
16
|
+
----------------
|
17
|
+
|
18
|
+
The tree dumping is done as shown below. The "-maxdepth" commandline
|
19
|
+
switch can be used to control the maximum depth, otherwise it internally
|
20
|
+
computes a ``reasonable depth'' to use based on the number of structures
|
21
|
+
in the shapefile.
|
22
|
+
|
23
|
+
warmerda@gdal[207]% shptreedump -maxdepth 6 eg_data/polygon.shp
|
24
|
+
( SHPTreeNode
|
25
|
+
Min = (471127.19,4751545.00)
|
26
|
+
Max = (489292.31,4765610.50)
|
27
|
+
Shapes(0):
|
28
|
+
( SHPTreeNode
|
29
|
+
Min = (471127.19,4751545.00)
|
30
|
+
Max = (481118.01,4765610.50)
|
31
|
+
Shapes(0):
|
32
|
+
( SHPTreeNode
|
33
|
+
Min = (471127.19,4751545.00)
|
34
|
+
Max = (481118.01,4759281.03)
|
35
|
+
Shapes(0):
|
36
|
+
( SHPTreeNode
|
37
|
+
Min = (471127.19,4751545.00)
|
38
|
+
Max = (476622.14,4759281.03)
|
39
|
+
Shapes(0):
|
40
|
+
( SHPTreeNode
|
41
|
+
Min = (471127.19,4751545.00)
|
42
|
+
Max = (476622.14,4755799.81)
|
43
|
+
Shapes(0):
|
44
|
+
( SHPTreeNode
|
45
|
+
Min = (471127.19,4751545.00)
|
46
|
+
Max = (474149.41,4755799.81)
|
47
|
+
Shapes(6): 395 397 402 404 405 422
|
48
|
+
)
|
49
|
+
( SHPTreeNode
|
50
|
+
Min = (473599.92,4751545.00)
|
51
|
+
Max = (476622.14,4755799.81)
|
52
|
+
Shapes(10): 392 394 403 413 414 417 426 433 434 447
|
53
|
+
)
|
54
|
+
)
|
55
|
+
...
|
56
|
+
|
57
|
+
A structure like the following represents one node in the tree. In
|
58
|
+
this case it cover the region of 473599.92 < X < 476622.14,and
|
59
|
+
4751545.0 < Y < 4755799.81. There are ten shapes within this region
|
60
|
+
who's shapeids are 392, 394 ... 447. This node has no children nodes.
|
61
|
+
|
62
|
+
( SHPTreeNode
|
63
|
+
Min = (473599.92,4751545.00)
|
64
|
+
Max = (476622.14,4755799.81)
|
65
|
+
Shapes(10): 392 394 403 413 414 417 426 433 434 447
|
66
|
+
)
|
67
|
+
|
68
|
+
The heirarchy of indentation is intended to show the parent, child
|
69
|
+
relationship between nodes, with the tree being deeper the further to the
|
70
|
+
right you go.
|
71
|
+
|
72
|
+
The `-v' flag to the program can be used to expand the report to include
|
73
|
+
the full information about shapes, not just their shapeid. This can result
|
74
|
+
in a report looking more like this:
|
75
|
+
|
76
|
+
...
|
77
|
+
( SHPTreeNode
|
78
|
+
Min = (478095.78,4751545.00)
|
79
|
+
Max = (481118.01,4755799.81)
|
80
|
+
Shapes(3):
|
81
|
+
( Shape
|
82
|
+
ShapeId = 448
|
83
|
+
Min = (479988.09,4753300.00)
|
84
|
+
Max = (480705.59,4754236.50)
|
85
|
+
Vertex[0] = (480136.59,4754174.50)
|
86
|
+
Vertex[1] = (480229.97,4754182.00)
|
87
|
+
Vertex[2] = (480370.09,4754200.50)
|
88
|
+
Vertex[3] = (480695.12,4754236.50)
|
89
|
+
Vertex[4] = (480687.97,4754129.50)
|
90
|
+
Vertex[5] = (480650.47,4754075.50)
|
91
|
+
Vertex[6] = (480520.62,4753948.00)
|
92
|
+
Vertex[7] = (480490.00,4753900.00)
|
93
|
+
Vertex[8] = (480499.78,4753840.50)
|
94
|
+
Vertex[9] = (480500.97,4753820.50)
|
95
|
+
Vertex[10] = (480534.75,4753660.50)
|
96
|
+
Vertex[11] = (480560.00,4753565.00)
|
97
|
+
Vertex[12] = (480574.91,4753550.50)
|
98
|
+
...
|
99
|
+
|
100
|
+
While it is possible to part the output of the shptreedump program, and
|
101
|
+
insert it into your database, my intention was that the shptreedump program
|
102
|
+
would serve as an example of how to pre-order traversal of the quad tree,
|
103
|
+
and collect the information you will need to insert into your database.
|
104
|
+
I would then expect you to write a new program based on shptreedump that
|
105
|
+
calls a C API for your database to insert objects instead of printing them
|
106
|
+
out. Alternatively there may be an ASCII format for loading tables that
|
107
|
+
you could modify the program to output.
|
108
|
+
|
109
|
+
Searching
|
110
|
+
---------
|
111
|
+
|
112
|
+
The other thing that you can do with the shptreedump program is to
|
113
|
+
perform a search on the quadtree. For instance the following shows
|
114
|
+
searching on a small region.
|
115
|
+
|
116
|
+
% shptreedump -search 471127 4751545 476622 4759281 eg_data/polygon.shp
|
117
|
+
Shape 17: not in area of interest, but fetched.
|
118
|
+
Shape 31: not in area of interest, but fetched.
|
119
|
+
Shape 52: not in area of interest, but fetched.
|
120
|
+
Shape 76: not in area of interest, but fetched.
|
121
|
+
Shape 82: not in area of interest, but fetched.
|
122
|
+
Shape 104: not in area of interest, but fetched.
|
123
|
+
Shape 124: not in area of interest, but fetched.
|
124
|
+
Shape 134: not in area of interest, but fetched.
|
125
|
+
Shape 139: not in area of interest, but fetched.
|
126
|
+
Shape 154: not in area of interest, but fetched.
|
127
|
+
Shape 175: not in area of interest, but fetched.
|
128
|
+
Shape 177: not in area of interest, but fetched.
|
129
|
+
Shape 185: not in area of interest, but fetched.
|
130
|
+
Shape 192: not in area of interest, but fetched.
|
131
|
+
Shape 196: appears to be in area of interest.
|
132
|
+
....
|
133
|
+
|
134
|
+
|
135
|
+
I have included this capability (and the SHPTreeFindLikelyShapes() function)
|
136
|
+
so that you can see a working example of how to search this quad tree.
|
137
|
+
Note that searching is a multi-stage affair.
|
138
|
+
|
139
|
+
First a pass is made over the quadtree, collecting the shapeids of all
|
140
|
+
shapes contained in a quadtree node for which the bounding rectangle overlaps
|
141
|
+
the search rectangle. This is all accomplished by SHPTreeFindLikelyShapes()
|
142
|
+
in shptree.c.
|
143
|
+
|
144
|
+
The second phase is to fetch the actual shapes, and verify if their bounding
|
145
|
+
box falls within the area of interest. This is necessary because the shape
|
146
|
+
will tend to have a significantly smaller bounding rectangle than the tree
|
147
|
+
node in which it is found. This can result ``false positives'' on the first
|
148
|
+
phase search, as indicated by teh ``not in area of interest, but fetched''
|
149
|
+
messages above. This stage is done in the SHPTreeNodeSearchAndDump()
|
150
|
+
function in shptreedump.c.
|
151
|
+
|
152
|
+
A possible third phase is to verify that the actualy line segments in the
|
153
|
+
shape actually cross the area of interest. I don't both with this as it
|
154
|
+
is complicated, and assuming that the drawing engine takes care of clipping
|
155
|
+
it is quite a bit easier to let it fall through.
|
156
|
+
|
157
|
+
Building
|
158
|
+
--------
|
159
|
+
|
160
|
+
I have added a makefile.vc to the shapelib distribution. After you have
|
161
|
+
unpacked the shapefile you should have a shapelib subdirectory. If you
|
162
|
+
cd to that directory, and enter ``nmake -f makefile.vc'' in a DOS window
|
163
|
+
you should be able to build everything with VC++ (assuming it is properly
|
164
|
+
installed and in your path).
|
165
|
+
|
166
|
+
You can also create a project in VC just including the files
|
167
|
+
shpopen.c, shptree.c and shptreedump.c, building as a Win32 console
|
168
|
+
application.
|
169
|
+
|
170
|
+
For your convenience I am including prebuild .obj files, and .exe files
|
171
|
+
in the distribution.
|
172
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
#LINKOPT = /usr/local/lib/libdbmalloc.a
|
3
|
+
#CFLAGS = -g
|
4
|
+
|
5
|
+
# Endian: define either _LITTLE_ENDIAN or _BIG_ENDIAN
|
6
|
+
ENDIAN = -D_LITTLE_ENDIAN
|
7
|
+
|
8
|
+
CFLAGS = -g -I.. -I$(HOME)/bld/include -DPROJ4 $(ENDIAN) -DDEBUG -DDEBUG2
|
9
|
+
|
10
|
+
SHPOBJ = ../shpopen.o ../dbfopen.o ../safileio.o
|
11
|
+
|
12
|
+
SHPGOBJ = ../shpopen.o ../dbfopen.o ../safileio.o shpgeo.o
|
13
|
+
|
14
|
+
GEOOBJ = ./shpgeo.o -lm -L$(HOME)/bld/lib -lproj
|
15
|
+
|
16
|
+
default: all
|
17
|
+
|
18
|
+
all: shpdxf shpproj dbfinfo shpcentrd shpdata shpwkb dbfinfo dbfcat shpinfo shpfix shpcat Shape_PointInPoly shpsort
|
19
|
+
|
20
|
+
clean:
|
21
|
+
rm -f shpdxf shpproj dbfinfo shpcentrd shpdata shpwkb dbfcat dbfinfo shpinfo shpfix shpcat *.o
|
22
|
+
|
23
|
+
shpgeo.o: shpgeo.c shpgeo.h
|
24
|
+
$(CC) $(CFLAGS) -c shpgeo.c
|
25
|
+
|
26
|
+
shpdxf: shpdxf.c $(SHPOBJ)
|
27
|
+
$(CC) $(CFLAGS) shpdxf.c ${SHPOBJ} $(LINKOPT) -o shpdxf
|
28
|
+
|
29
|
+
shpcentrd: shpcentrd.c $(SHPGOBJ)
|
30
|
+
$(CC) $(CFLAGS) shpcentrd.c ${SHPOBJ} $(LINKOPT) $(GEOOBJ) -o shpcentrd
|
31
|
+
|
32
|
+
shpdata: shpdata.c $(SHPGOBJ)
|
33
|
+
$(CC) $(CFLAGS) shpdata.c ${SHPOBJ} $(LINKOPT) $(GEOOBJ) -o shpdata
|
34
|
+
|
35
|
+
shpinfo: shpinfo.c $(SHPOBJ)
|
36
|
+
$(CC) $(CFLAGS) shpinfo.c ${SHPOBJ} $(LINKOPT) $(GEOOBJ) -o shpinfo
|
37
|
+
|
38
|
+
shpfix: shpfix.c $(SHPOBJ)
|
39
|
+
$(CC) $(CFLAGS) shpfix.c ${SHPOBJ} $(LINKOPT) -o shpfix
|
40
|
+
|
41
|
+
shpcat: shpcat.c $(SHPOBJ)
|
42
|
+
$(CC) $(CFLAGS) shpcat.c ${SHPOBJ} $(LINKOPT) -o shpcat
|
43
|
+
|
44
|
+
shpwkb: shpwkb.c $(SHPGOBJ)
|
45
|
+
$(CC) $(CFLAGS) shpwkb.c ${SHPOBJ} $(LINKOPT) $(GEOOBJ) -o shpwkb
|
46
|
+
|
47
|
+
shpproj: shpproj.c $(SHPGOBJ)
|
48
|
+
$(CC) $(CFLAGS) shpproj.c $(SHPOBJ) $(GEOOBJ) -lm -lproj $(LINKOPT) -o shpproj
|
49
|
+
|
50
|
+
shpsort: shpsort.c $(SHPOBJ)
|
51
|
+
$(CC) $(CFLAGS) shpsort.c ${SHPOBJ} $(LINKOPT) -lm -o shpsort
|
52
|
+
|
53
|
+
dbfinfo: dbfinfo.c $(SHPOBJ)
|
54
|
+
$(CC) $(CFLAGS) dbfinfo.c $(SHPOBJ) $(LINKOPT) -o dbfinfo
|
55
|
+
|
56
|
+
dbfcat: dbfcat.c $(SHPOBJ)
|
57
|
+
$(CC) $(CFLAGS) dbfcat.c $(SHPOBJ) $(LINKOPT) -o dbfcat
|
58
|
+
|
59
|
+
Shape_PointInPoly: Shape_PointInPoly.cpp $(SHPOBJ)
|
60
|
+
$(CXX) $(CFLAGS) Shape_PointInPoly.cpp $(SHPOBJ) $(LINKOPT) \
|
61
|
+
-o Shape_PointInPoly
|
62
|
+
|
63
|
+
check: testproj
|
64
|
+
|
65
|
+
testproj:
|
66
|
+
tests/shpproj.sh
|
@@ -0,0 +1,234 @@
|
|
1
|
+
{
|
2
|
+
/******************************************************************************
|
3
|
+
* $Id: ShapeFileII.pas,v 1.3 2003-05-14 20:04:51 warmerda Exp $
|
4
|
+
*
|
5
|
+
* Project: Shapelib
|
6
|
+
* Purpose: Delphi Pascal interface to Shapelib.
|
7
|
+
* Author: Kevin Meyer (Kevin@CyberTracker.co.za)
|
8
|
+
*
|
9
|
+
******************************************************************************
|
10
|
+
* Copyright (c) 2002, Keven Meyer (Kevin@CyberTracker.co.za)
|
11
|
+
*
|
12
|
+
* This software is available under the following "MIT Style" license,
|
13
|
+
* or at the option of the licensee under the LGPL (see LICENSE.LGPL). This
|
14
|
+
* option is discussed in more detail in shapelib.html.
|
15
|
+
*
|
16
|
+
* --
|
17
|
+
*
|
18
|
+
* Permission is hereby granted, free of charge, to any person obtaining a
|
19
|
+
* copy of this software and associated documentation files (the "Software"),
|
20
|
+
* to deal in the Software without restriction, including without limitation
|
21
|
+
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
22
|
+
* and/or sell copies of the Software, and to permit persons to whom the
|
23
|
+
* Software is furnished to do so, subject to the following conditions:
|
24
|
+
*
|
25
|
+
* The above copyright notice and this permission notice shall be included
|
26
|
+
* in all copies or substantial portions of the Software.
|
27
|
+
*
|
28
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
29
|
+
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
30
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
31
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
32
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
33
|
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
34
|
+
* DEALINGS IN THE SOFTWARE.
|
35
|
+
******************************************************************************
|
36
|
+
*
|
37
|
+
* $Log: ShapeFileII.pas,v $
|
38
|
+
* Revision 1.3 2003-05-14 20:04:51 warmerda
|
39
|
+
* Changed fpSHP and fpSHX to integer at suggestion of Ivan Lucena.
|
40
|
+
*
|
41
|
+
* Revision 1.2 2002/01/21 14:09:26 warmerda
|
42
|
+
* Fixed name.
|
43
|
+
*
|
44
|
+
* Revision 1.1 2002/01/17 14:30:37 warmerda
|
45
|
+
* New
|
46
|
+
*
|
47
|
+
*/
|
48
|
+
}
|
49
|
+
unit ShapeFileII;
|
50
|
+
|
51
|
+
interface
|
52
|
+
//uses { uses clause }
|
53
|
+
// ;
|
54
|
+
{ Set compiler to pack on byte boundaries only }
|
55
|
+
{$ALIGN OFF}
|
56
|
+
{$OVERFLOWCHECKS OFF}
|
57
|
+
{$J-}
|
58
|
+
const
|
59
|
+
SHPT_NULL = 0;
|
60
|
+
SHPT_POINT = 1;
|
61
|
+
SHPT_ARC = 3;
|
62
|
+
SHPT_POLYGON = 5;
|
63
|
+
SHPT_MULTIPOINT = 8;
|
64
|
+
SHPT_POINTZ = 11;
|
65
|
+
SHPT_ARCZ = 13;
|
66
|
+
SHPT_POLYGONZ = 15;
|
67
|
+
SHPT_MULTIPOINTZ = 18;
|
68
|
+
SHPT_POINTM = 21;
|
69
|
+
SHPT_ARCM = 23;
|
70
|
+
SHPT_POLYGONM = 25;
|
71
|
+
SHPT_MULTIPOINTM = 28;
|
72
|
+
SHPT_MULTIPATCH = 31;
|
73
|
+
XBASE_FLDHDR_SZ = 32;
|
74
|
+
szAccessBRW = 'rb+';
|
75
|
+
|
76
|
+
// *********************** SHP support ************************
|
77
|
+
|
78
|
+
type
|
79
|
+
SHPObject = record
|
80
|
+
nSHPType,
|
81
|
+
nShapeId,
|
82
|
+
nParts : LongWord;
|
83
|
+
panPartStart,
|
84
|
+
panPartType : array of LongWord;
|
85
|
+
nVertices : LongWord;
|
86
|
+
padfX, padfY, padfZ, padfM : array of double;
|
87
|
+
dfXMin, dfYMin, dfZMin, dfMMin : double;
|
88
|
+
dfXMax, dfYMax, dfZMax, dfMMax : double;
|
89
|
+
end;
|
90
|
+
SHPObjectHandle = ^SHPObject;
|
91
|
+
|
92
|
+
SHPBoundsArr = double;
|
93
|
+
|
94
|
+
SHPInfo = record
|
95
|
+
fpSHP,
|
96
|
+
fpSHX : integer;
|
97
|
+
|
98
|
+
nShapeType,
|
99
|
+
nFileSize,
|
100
|
+
nRecords,
|
101
|
+
nMaxRecords : LongWord;
|
102
|
+
panRecOffset,
|
103
|
+
panRecSize : array of LongWord;
|
104
|
+
adBoundsMin, adBoundsMax : SHPBoundsArr;
|
105
|
+
bUpdated : LongWord;
|
106
|
+
end;
|
107
|
+
SHPHandle = ^SHPInfo;
|
108
|
+
|
109
|
+
// *********************** DBF support ************************
|
110
|
+
|
111
|
+
DBFInfo = record
|
112
|
+
fp : FILE;
|
113
|
+
nRecords,
|
114
|
+
nRecordLength,
|
115
|
+
nHeaderLength,
|
116
|
+
nFields : LongWord;
|
117
|
+
|
118
|
+
panFieldOffset,
|
119
|
+
panFieldSize,
|
120
|
+
panFieldDecimals : array of LongWord;
|
121
|
+
|
122
|
+
pachFieldType : LongWord;
|
123
|
+
pszHeader : PChar;
|
124
|
+
nCurrentRecord,
|
125
|
+
bCurrentRecordModified : LongWord;
|
126
|
+
pszCurrentRecord : PChar;
|
127
|
+
|
128
|
+
bNoHeader,
|
129
|
+
bUpdated : LongWord;
|
130
|
+
end;
|
131
|
+
DBFHandle = ^DBFInfo;
|
132
|
+
|
133
|
+
DBFFieldType = (DBFTString, DBFTInteger, DBFTDouble, DBFTInvalid) ;
|
134
|
+
|
135
|
+
// *********************** SHP func declarations ************************
|
136
|
+
|
137
|
+
{$ALIGN ON}
|
138
|
+
|
139
|
+
function SHPOpen(pszShapeFile, pszAccess : PChar) : SHPHandle;cdecl;
|
140
|
+
procedure SHPGetInfo(hSHP : SHPHandle; var pnEntities, pnShapeType : LongWord; var padfMinBoud, padfMaxBound : SHPBoundsArr);cdecl;
|
141
|
+
procedure SHPClose(hSHP : SHPHandle);cdecl;
|
142
|
+
function SHPReadObject(hSHP : SHPHandle; iShape : LongWord): SHPObjectHandle;cdecl;
|
143
|
+
function SHPCreate(pszShapeFile : PChar; nShapeType : LongWord):SHPHandle;cdecl;
|
144
|
+
function SHPWriteObject(hSHP : SHPHandle; iShape : LongWord; psObject : SHPObjectHandle): LongWord;cdecl;
|
145
|
+
function SHPCreateSimpleObject(nSHPType, nVertices : LongWord; var padfX, padfY, padfZ : double):SHPObjectHandle;cdecl;
|
146
|
+
procedure SHPDestroy(psObject : SHPObjectHandle);cdecl;
|
147
|
+
|
148
|
+
procedure SHPComputeExtents(psObject : SHPObjectHandle);cdecl;
|
149
|
+
function SHPCreateObject(nSHPType, iShape, nParts : LongWord; var panPartStart, panPartType : LongWord; nVertices : LongWord; var padfX, padfY, padfZ, padfM : SHPBoundsArr): SHPObjectHandle;cdecl;
|
150
|
+
|
151
|
+
function SHPTypeStr(pnShapeType : LongWord): string;
|
152
|
+
|
153
|
+
// *********************** DBF func declarations ************************
|
154
|
+
|
155
|
+
function DBFOpen(pszDBFFile, pszAccess : PChar): DBFHandle;cdecl;
|
156
|
+
function DBFCreate(pszDBFFile : PChar): DBFHandle ;cdecl;
|
157
|
+
function DBFGetFieldCount(hDBF : DBFHandle) : LongWord ;cdecl;
|
158
|
+
function DBFGetRecordCount(hDBF : DBFHandle) : LongWord;cdecl;
|
159
|
+
function DBFGetFieldIndex(hDBF: DBFHandle; pszFieldName : PChar): LongWord;cdecl;
|
160
|
+
function DBFGetFieldInfo(hDBF : DBFHandle; iField : LongWord; pszFieldName : PChar;
|
161
|
+
var pnWidth, pnDecimals : LongWord): DBFFieldType;cdecl;
|
162
|
+
function DBFAddField(hDBF : DBFHandle; pszFieldName : PChar;
|
163
|
+
eType : DBFFieldType; nWidth, nDecimals : LongWord): LongWord;cdecl;
|
164
|
+
|
165
|
+
function DBFReadIntegerAttribute(hDBF : DBFHandle;iShape, iField : LongWord ): LongWord;cdecl;
|
166
|
+
function DBFReadDoubleAttribute(hDBF : DBFHandle; iShape, iField : LongWord ):double;cdecl;
|
167
|
+
function DBFReadStringAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : pchar;cdecl;
|
168
|
+
function DBFIsAttributeNULL(hDBF : DBFHandle; iShape, iField : LongWord ): LongWord;cdecl;
|
169
|
+
function DBFWriteIntegerAttribute(hDBF : DBFHandle;iShape, iField, nFieldValue : LongWord): LongWord;cdecl;
|
170
|
+
function DBFWriteDoubleAttribute(hDBF : DBFHandle;iShape, iField : LongWord;
|
171
|
+
dFieldValue : double): LongWord ;cdecl;
|
172
|
+
function DBFWriteStringAttribute(hDBF : DBFHandle;iShape, iField : LongWord;
|
173
|
+
pszFieldValue : PChar): LongWord ;cdecl;
|
174
|
+
function DBFWriteNULLAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : LongWord;cdecl;
|
175
|
+
procedure DBFClose(hDBF : DBFHandle);cdecl;
|
176
|
+
function DBFGetNativeFieldType(hDBF : DBFHandle; iField : LongWord) : Char;cdecl;
|
177
|
+
|
178
|
+
// *********************** SHP implementation ************************
|
179
|
+
implementation
|
180
|
+
// *****************************************************************************
|
181
|
+
function SHPCreateSimpleObject(nSHPType, nVertices : LongWord; var padfX, padfY, padfZ : double):SHPObjectHandle;external 'shapelib.dll' name 'SHPCreateSimpleObject';
|
182
|
+
function SHPOpen(pszShapeFile, pszAccess : PChar) : SHPHandle; external 'shapelib.dll' name 'SHPOpen';
|
183
|
+
procedure SHPGetInfo(hSHP : SHPHandle; var pnEntities, pnShapeType : LongWord; var padfMinBoud, padfMaxBound : SHPBoundsArr);external 'shapelib.dll' name 'SHPGetInfo';
|
184
|
+
procedure SHPClose(hSHP : SHPHandle);external 'shapelib.dll' name 'SHPClose';
|
185
|
+
function SHPReadObject(hSHP : SHPHandle; iShape : LongWord) : SHPObjectHandle;external 'shapelib.dll' name 'SHPReadObject';
|
186
|
+
function SHPCreate(pszShapeFile : PChar; nShapeType : LongWord):SHPHandle;external 'shapelib.dll' name 'SHPCreate';
|
187
|
+
function SHPWriteObject(hSHP : SHPHandle; iShape : LongWord; psObject : SHPObjectHandle): LongWord;cdecl;external 'shapelib.dll' name 'SHPWriteObject';
|
188
|
+
procedure SHPDestroy(psObject : SHPObjectHandle);external 'shapelib.dll' name 'SHPDestroyObject';
|
189
|
+
procedure SHPComputeExtents(psObject : SHPObjectHandle);external 'shapelib.dll' name 'SHPComputeExtents';
|
190
|
+
function SHPCreateObject(nSHPType, iShape, nParts : LongWord; var panPartStart, panPartType : LongWord; nVertices : LongWord; var padfX, padfY, padfZ, padfM : SHPBoundsArr): SHPObjectHandle;external 'shapelib.dll' name 'SHPCreateObject';
|
191
|
+
// *****************************************************************************
|
192
|
+
function SHPTypeStr(pnShapeType : LongWord): string;
|
193
|
+
begin
|
194
|
+
case pnShapeType of
|
195
|
+
SHPT_NULL : result := 'NULL';
|
196
|
+
SHPT_POINT : result := 'POINT';
|
197
|
+
SHPT_ARC : result := 'ARC';
|
198
|
+
SHPT_POLYGON : result := 'POLYGON';
|
199
|
+
SHPT_MULTIPOINT : result := 'MULTIPOINT';
|
200
|
+
SHPT_POINTZ : result := 'POINTZ';
|
201
|
+
SHPT_ARCZ : result := 'ARCZ';
|
202
|
+
SHPT_POLYGONZ : result := 'POLYGONZ';
|
203
|
+
SHPT_MULTIPOINTZ : result := 'MULTIPOINTZ';
|
204
|
+
SHPT_POINTM : result := 'POINTM';
|
205
|
+
SHPT_ARCM : result := 'ARCM';
|
206
|
+
SHPT_POLYGONM : result := 'POLYGONM';
|
207
|
+
SHPT_MULTIPOINTM : result := 'MULTIPOINTM';
|
208
|
+
SHPT_MULTIPATCH : result := 'MULTIPATCH';
|
209
|
+
else
|
210
|
+
result := '--unknown--';
|
211
|
+
end;
|
212
|
+
end;
|
213
|
+
// *****************************************************************************
|
214
|
+
// *****************************************************************************
|
215
|
+
function DBFOpen(pszDBFFile, pszAccess : PChar): DBFHandle;external 'shapelib.dll';
|
216
|
+
function DBFCreate(pszDBFFile : PChar): DBFHandle ;external 'shapelib.dll';
|
217
|
+
function DBFGetFieldCount(hDBF : DBFHandle) : LongWord ;external 'shapelib.dll';
|
218
|
+
function DBFGetRecordCount(hDBF : DBFHandle) : LongWord;external 'shapelib.dll';
|
219
|
+
function DBFGetFieldIndex(hDBF: DBFHandle; pszFieldName : PChar): LongWord;external 'shapelib.dll';
|
220
|
+
function DBFGetFieldInfo(hDBF : DBFHandle; iField : LongWord; pszFieldName : PChar; var pnWidth, pnDecimals : LongWord): DBFFieldType;external 'shapelib.dll';
|
221
|
+
function DBFAddField(hDBF : DBFHandle; pszFieldName : PChar; eType : DBFFieldType; nWidth, nDecimals : LongWord): LongWord;external 'shapelib.dll';
|
222
|
+
function DBFReadIntegerAttribute(hDBF : DBFHandle;iShape, iField : LongWord ): LongWord;external 'shapelib.dll';
|
223
|
+
function DBFReadDoubleAttribute(hDBF : DBFHandle; iShape, iField : LongWord ):double;external 'shapelib.dll';
|
224
|
+
function DBFReadStringAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : pchar;external 'shapelib.dll';
|
225
|
+
function DBFIsAttributeNULL(hDBF : DBFHandle; iShape, iField : LongWord ): LongWord;external 'shapelib.dll';
|
226
|
+
function DBFWriteIntegerAttribute(hDBF : DBFHandle;iShape, iField, nFieldValue : LongWord): LongWord;external 'shapelib.dll';
|
227
|
+
function DBFWriteDoubleAttribute(hDBF : DBFHandle;iShape, iField : LongWord; dFieldValue : double): LongWord ;external 'shapelib.dll';
|
228
|
+
function DBFWriteStringAttribute(hDBF : DBFHandle;iShape, iField : LongWord; pszFieldValue : PChar): LongWord ;external 'shapelib.dll';
|
229
|
+
function DBFWriteNULLAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : LongWord;external 'shapelib.dll';
|
230
|
+
procedure DBFClose(hDBF : DBFHandle);external 'shapelib.dll';
|
231
|
+
function DBFGetNativeFieldType(hDBF : DBFHandle; iField : LongWord) : Char;external 'shapelib.dll';
|
232
|
+
// *****************************************************************************
|
233
|
+
|
234
|
+
end.
|