shp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +34 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +28 -0
  6. data/README.md +30 -0
  7. data/Rakefile +23 -0
  8. data/ext/shp/base.hpp +113 -0
  9. data/ext/shp/dbf.cpp +381 -0
  10. data/ext/shp/dbf.hpp +44 -0
  11. data/ext/shp/extconf.rb +13 -0
  12. data/ext/shp/shape_object.cpp +58 -0
  13. data/ext/shp/shape_object.hpp +27 -0
  14. data/ext/shp/shapefile.cpp +299 -0
  15. data/ext/shp/shapefile.hpp +35 -0
  16. data/ext/shp/shapelib/.cvsignore +15 -0
  17. data/ext/shp/shapelib/ChangeLog +450 -0
  18. data/ext/shp/shapelib/HOWTO-RELEASE +16 -0
  19. data/ext/shp/shapelib/LICENSE.LGPL +483 -0
  20. data/ext/shp/shapelib/Makefile +113 -0
  21. data/ext/shp/shapelib/README +41 -0
  22. data/ext/shp/shapelib/README.tree +172 -0
  23. data/ext/shp/shapelib/contrib/.cvsignore +12 -0
  24. data/ext/shp/shapelib/contrib/Makefile +66 -0
  25. data/ext/shp/shapelib/contrib/ShapeFileII.pas +234 -0
  26. data/ext/shp/shapelib/contrib/Shape_PointInPoly.cpp +238 -0
  27. data/ext/shp/shapelib/contrib/Shape_PointInPoly_README.txt +59 -0
  28. data/ext/shp/shapelib/contrib/csv2shp.c +558 -0
  29. data/ext/shp/shapelib/contrib/dbfcat.c +166 -0
  30. data/ext/shp/shapelib/contrib/dbfinfo.c +106 -0
  31. data/ext/shp/shapelib/contrib/makefile.vc +34 -0
  32. data/ext/shp/shapelib/contrib/my_nan.h +46 -0
  33. data/ext/shp/shapelib/contrib/shpcat.c +100 -0
  34. data/ext/shp/shapelib/contrib/shpcentrd.c +159 -0
  35. data/ext/shp/shapelib/contrib/shpdata.c +129 -0
  36. data/ext/shp/shapelib/contrib/shpdxf.c +340 -0
  37. data/ext/shp/shapelib/contrib/shpfix.c +110 -0
  38. data/ext/shp/shapelib/contrib/shpgeo.c +1595 -0
  39. data/ext/shp/shapelib/contrib/shpgeo.h +154 -0
  40. data/ext/shp/shapelib/contrib/shpinfo.c +113 -0
  41. data/ext/shp/shapelib/contrib/shpproj.c +260 -0
  42. data/ext/shp/shapelib/contrib/shpsort.c +605 -0
  43. data/ext/shp/shapelib/contrib/shpsort.txt +44 -0
  44. data/ext/shp/shapelib/contrib/shpwkb.c +123 -0
  45. data/ext/shp/shapelib/contrib/tests/shpproj.sh +38 -0
  46. data/ext/shp/shapelib/dbfopen.c +2221 -0
  47. data/ext/shp/shapelib/makefile.vc +86 -0
  48. data/ext/shp/shapelib/makeshape.sh +21 -0
  49. data/ext/shp/shapelib/mkdist.sh +37 -0
  50. data/ext/shp/shapelib/mkinstalldirs +38 -0
  51. data/ext/shp/shapelib/mkrelease.sh +55 -0
  52. data/ext/shp/shapelib/safileio.c +286 -0
  53. data/ext/shp/shapelib/shapefil.h +647 -0
  54. data/ext/shp/shapelib/shapelib.def +46 -0
  55. data/ext/shp/shapelib/shpopen.c +2388 -0
  56. data/ext/shp/shapelib/shptree.c +1187 -0
  57. data/ext/shp/shapelib/shputils.c +1072 -0
  58. data/ext/shp/shapelib/stream1.out +1465 -0
  59. data/ext/shp/shapelib/stream1.sh +28 -0
  60. data/ext/shp/shapelib/stream2.out +530 -0
  61. data/ext/shp/shapelib/stream2.sh +11 -0
  62. data/ext/shp/shapelib/stream3.out +37 -0
  63. data/ext/shp/shapelib/web/.cvsignore +2 -0
  64. data/ext/shp/shapelib/web/codepage.html +403 -0
  65. data/ext/shp/shapelib/web/dbf_api.html +436 -0
  66. data/ext/shp/shapelib/web/index.html +235 -0
  67. data/ext/shp/shapelib/web/license.html +78 -0
  68. data/ext/shp/shapelib/web/manifest.html +87 -0
  69. data/ext/shp/shapelib/web/release.html +80 -0
  70. data/ext/shp/shapelib/web/shapelib-tools.html +352 -0
  71. data/ext/shp/shapelib/web/shp_api.html +376 -0
  72. data/ext/shp/shp.cpp +19 -0
  73. data/ext/shp/shp.hpp +47 -0
  74. data/lib/shp.rb +35 -0
  75. data/lib/shp/version.rb +3 -0
  76. data/shp.gemspec +23 -0
  77. data/spec/shp_spec.rb +127 -0
  78. metadata +176 -0
@@ -0,0 +1,436 @@
1
+ <html>
2
+ <head>
3
+ <title>Attribute (.DBF) API</title>
4
+ </head>
5
+ <body>
6
+ <h1>Attribute (.DBF) API</h1>
7
+
8
+ The Attribute (DBF) API uses DBFHandle to represent a handle for access
9
+ to one .dbf file. The contents of the DBFHandle are visible (see shapefil.h)
10
+ but should be ignored by the application. It is intended that all information
11
+ be accessed by API functions. Note that there should be exactly one record
12
+ in the .dbf file for each shape in the .shp/.shx files. This constraint
13
+ must be maintained by the application.<p>
14
+
15
+ <!-------------------------------------------------------------------------->
16
+
17
+ <h2>DBFOpen()</h2>
18
+
19
+ <pre>
20
+ DBFHandle DBFOpen( const char * pszDBFFile, const char * pszAccess );
21
+
22
+ pszDBFFile: The name of the xBase (.dbf) file to access.
23
+
24
+ pszAccess: The fopen() style access string. At this time only
25
+ "rb" (read-only binary) and "rb+" (read/write binary)
26
+ should be used.
27
+ </pre>
28
+
29
+ The DBFOpen() function should be used to establish access to an existing
30
+ xBase format table file. The returned DBFHandle is passed to other
31
+ access functions, and DBFClose() should be invoked to recover resources, and
32
+ flush changes to disk when complete. The DBFCreate() function should
33
+ called to create new xBase files. As a convenience, DBFOpen() can be
34
+ called with the name of a .shp or .shx file, and it will figure out the
35
+ name of the related .dbf file.<p>
36
+
37
+ <!-------------------------------------------------------------------------->
38
+
39
+ <h2>DBFCreate()</h2>
40
+
41
+ <pre>
42
+ DBFHandle DBFCreate( const char * pszDBFFile );
43
+
44
+ pszDBFFile: The name of the xBase (.dbf) file to create.
45
+ </pre>
46
+
47
+ The DBFCreate() function creates a new xBase format file with the given
48
+ name, and returns an access handle that can be used with other DBF functions.
49
+ The newly created file will have no fields, and no records. Fields should
50
+ be added with DBFAddField() before any records add written.
51
+
52
+ <!-------------------------------------------------------------------------->
53
+
54
+ <h2>DBFGetFieldCount()</h2>
55
+
56
+ <pre>
57
+ int DBFGetFieldCount( DBFHandle hDBF );
58
+
59
+ hDBF: The access handle for the file to be queried, as returned
60
+ by DBFOpen(), or DBFCreate().
61
+ </pre>
62
+
63
+ The DBFGetFieldCount() function returns the number of fields currently
64
+ defined for the indicated xBase file.
65
+
66
+ <!-------------------------------------------------------------------------->
67
+
68
+ <h2>DBFGetRecordCount()</h2>
69
+
70
+ <pre>
71
+ int DBFGetRecordCount( DBFHandle hDBF );
72
+
73
+ hDBF: The access handle for the file to be queried, as returned by
74
+ DBFOpen(), or DBFCreate().
75
+ </pre>
76
+
77
+ The DBFGetRecordCount() function returns the number of records that
78
+ exist on the xBase file currently. Note that with shape files one xBase
79
+ record exists for each shape in the .shp/.shx files.<p>
80
+
81
+ <!-------------------------------------------------------------------------->
82
+
83
+ <h2>DBFGetFieldIndex()</h2>
84
+
85
+ <pre>
86
+ int DBFGetFieldIndex( DBFHandle hDBF, const char *pszFieldName );
87
+
88
+ hDBF: The access handle for the file to be queried, as returned by
89
+ DBFOpen(), or DBFCreate().
90
+
91
+ pszFieldName: Name of the field to search for.
92
+ </pre>
93
+
94
+ Returns the index of the field matching this name, or -1 on failure. The
95
+ comparison is case insensitive. However, lengths must match exactly.<p>
96
+
97
+ <!-------------------------------------------------------------------------->
98
+
99
+ <h2>DBFGetFieldInfo()</h2>
100
+
101
+ <pre>
102
+ DBFFieldType DBFGetFieldInfo( DBFHandle hDBF, int iField, char * pszFieldName,
103
+ int * pnWidth, int * pnDecimals );
104
+
105
+ hDBF: The access handle for the file to be queried, as returned by
106
+ DBFOpen(), or DBFCreate().
107
+
108
+ iField: The field to be queried. This should be a number between
109
+ 0 and n-1, where n is the number fields on the file, as
110
+ returned by DBFGetFieldCount().
111
+
112
+ pszFieldName: If this pointer is not NULL the name of the requested field
113
+ will be written to this location. The pszFieldName buffer
114
+ should be at least 12 character is size in order to hold
115
+ the longest possible field name of 11 characters plus a
116
+ terminating zero character.
117
+
118
+ pnWidth: If this pointer is not NULL, the width of the requested field
119
+ will be returned in the int pointed to by pnWidth. This is
120
+ the width in characters.
121
+
122
+ pnDecimals: If this pointer is not NULL, the number of decimal places
123
+ precision defined for the field will be returned. This is
124
+ zero for integer fields, or non-numeric fields.
125
+ </pre>
126
+
127
+ The DBFGetFieldInfo() returns the type of the requested field, which is
128
+ one of the DBFFieldType enumerated values. As well, the field name, and
129
+ field width information can optionally be returned. The field type returned
130
+ does not correspond one to one with the xBase field types. For instance
131
+ the xBase field type for Date will just be returned as being FTInteger. <p>
132
+
133
+ <pre>
134
+ typedef enum {
135
+ FTString, /* fixed length string field */
136
+ FTInteger, /* numeric field with no decimals */
137
+ FTDouble, /* numeric field with decimals */
138
+ FTLogical, /* logical field. */
139
+ FTInvalid /* not a recognised field type */
140
+ } DBFFieldType;
141
+ </pre>
142
+
143
+ <!-------------------------------------------------------------------------->
144
+
145
+ <h2>DBFAddField()</h2>
146
+
147
+ <pre>
148
+ int DBFAddField( DBFHandle hDBF, const char * pszFieldName,
149
+ DBFFieldType eType, int nWidth, int nDecimals );
150
+
151
+ hDBF: The access handle for the file to be updated, as returned by
152
+ DBFOpen(), or DBFCreate().
153
+
154
+ pszFieldName: The name of the new field. At most 11 character will be used.
155
+ In order to use the xBase file in some packages it may be
156
+ necessary to avoid some special characters in the field names
157
+ such as spaces, or arithmetic operators.
158
+
159
+ eType: One of FTString, FTInteger or FTDouble in order to establish
160
+ the type of the new field. Note that some valid xBase field
161
+ types cannot be created such as date fields.
162
+
163
+ nWidth: The width of the field to be created. For FTString fields this
164
+ establishes the maximum length of string that can be stored.
165
+ For FTInteger this establishes the number of digits of the
166
+ largest number that can
167
+ be represented. For FTDouble fields this in combination
168
+ with the nDecimals value establish the size, and precision
169
+ of the created field.
170
+
171
+ nDecimals: The number of decimal places to reserve for FTDouble fields.
172
+ For all other field types this should be zero. For instance
173
+ with nWidth=7, and nDecimals=3 numbers would be formatted
174
+ similarly to `123.456'.
175
+ </pre>
176
+
177
+ The DBFAddField() function is used to add new fields to an existing xBase
178
+ file opened with DBFOpen(), or created with DBFCreate(). Note that fields
179
+ can only be added to xBase files with no records, though this is limitation
180
+ of this API, not of the file format.<p>
181
+
182
+ The DBFAddField() return value is the field number of the new field, or
183
+ -1 if the addition of the field failed.<p>
184
+
185
+ <!-------------------------------------------------------------------------->
186
+
187
+ <h2>DBFReadIntegerAttribute()</h2>
188
+
189
+ <pre>
190
+ int DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
191
+
192
+ hDBF: The access handle for the file to be queried, as returned by
193
+ DBFOpen(), or DBFCreate().
194
+
195
+ iShape: The record number (shape number) from which the field value
196
+ should be read.
197
+
198
+ iField: The field within the selected record that should be read.
199
+ </pre>
200
+
201
+ The DBFReadIntegerAttribute() will read the value of one field and return
202
+ it as an integer. This can be used even with FTString fields, though the
203
+ returned value will be zero if not interpretable as a number.<p>
204
+
205
+ <!-------------------------------------------------------------------------->
206
+
207
+ <h2>DBFReadDoubleAttribute()</h2>
208
+
209
+ <pre>
210
+ double DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
211
+
212
+ hDBF: The access handle for the file to be queried, as returned by
213
+ DBFOpen(), or DBFCreate().
214
+
215
+ iShape: The record number (shape number) from which the field value
216
+ should be read.
217
+
218
+ iField: The field within the selected record that should be read.
219
+ </pre>
220
+
221
+ The DBFReadDoubleAttribute() will read the value of one field and return
222
+ it as a double. This can be used even with FTString fields, though the
223
+ returned value will be zero if not interpretable as a number.<p>
224
+
225
+ <!-------------------------------------------------------------------------->
226
+
227
+ <h2>DBFReadStringAttribute()</h2>
228
+
229
+ <pre>
230
+ const char *DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
231
+
232
+ hDBF: The access handle for the file to be queried, as returned by
233
+ DBFOpen(), or DBFCreate().
234
+
235
+ iShape: The record number (shape number) from which the field value
236
+ should be read.
237
+
238
+ iField: The field within the selected record that should be read.
239
+ </pre>
240
+
241
+ The DBFReadStringAttribute() will read the value of one field and return
242
+ it as a string. This function may be used on any field type (including
243
+ FTInteger and FTDouble) and will return the string representation stored
244
+ in the .dbf file. The returned pointer is to an internal buffer
245
+ which is only valid untill the next DBF function call. It's contents may
246
+ be copied with normal string functions such as strcpy(), or strdup(). If
247
+ the TRIM_DBF_WHITESPACE macro is defined in shapefil.h (it is by default)
248
+ then all leading and trailing space (ASCII 32) characters will be stripped
249
+ before the string is returned.<p>
250
+
251
+ <!-------------------------------------------------------------------------->
252
+
253
+ <h2>DBFIsAttributeNULL()</h2>
254
+
255
+ <pre>
256
+ int DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
257
+
258
+ hDBF: The access handle for the file to be queried, as returned by
259
+ DBFOpen(), or DBFCreate().
260
+
261
+ iShape: The record number (shape number) from which the field value
262
+ should be read.
263
+
264
+ iField: The field within the selected record that should be read.
265
+ </pre>
266
+
267
+ This function will return TRUE if the indicated field is NULL valued
268
+ otherwise FALSE. Note that NULL fields are represented in the .dbf file
269
+ as having all spaces in the field. Reading NULL fields will result in
270
+ a value of 0.0 or an empty string with the other DBFRead*Attribute()
271
+ functions.<p>
272
+
273
+ <!-------------------------------------------------------------------------->
274
+
275
+ <h2>DBFWriteIntegerAttribute</h2>
276
+
277
+ <pre>
278
+ int DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField,
279
+ int nFieldValue );
280
+
281
+ hDBF: The access handle for the file to be written, as returned by
282
+ DBFOpen(), or DBFCreate().
283
+
284
+ iShape: The record number (shape number) to which the field value
285
+ should be written.
286
+
287
+ iField: The field within the selected record that should be written.
288
+
289
+ nFieldValue: The integer value that should be written.
290
+ </pre>
291
+
292
+ The DBFWriteIntegerAttribute() function is used to write a value to a numeric
293
+ field (FTInteger, or FTDouble). If the write succeeds the value TRUE will
294
+ be returned, otherwise FALSE will be returned. If the value is too large to
295
+ fit in the field, it will be truncated and FALSE returned.<p>
296
+
297
+ <!-------------------------------------------------------------------------->
298
+
299
+ <h2>DBFWriteDoubleAttribute()</h2>
300
+
301
+ <pre>
302
+ int DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,
303
+ double dFieldValue );
304
+
305
+ hDBF: The access handle for the file to be written, as returned by
306
+ DBFOpen(), or DBFCreate().
307
+
308
+ iShape: The record number (shape number) to which the field value
309
+ should be written.
310
+
311
+ iField: The field within the selected record that should be written.
312
+
313
+ dFieldValue: The floating point value that should be written.
314
+ </pre>
315
+
316
+ The DBFWriteDoubleAttribute() function is used to write a value to a numeric
317
+ field (FTInteger, or FTDouble). If the write succeeds the value TRUE will
318
+ be returned, otherwise FALSE will be returned. If the value is too large to
319
+ fit in the field, it will be truncated and FALSE returned.<p>
320
+
321
+ <!-------------------------------------------------------------------------->
322
+
323
+ <h2>DBFWriteStringAttribute()</h2>
324
+
325
+ <pre>
326
+ int DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,
327
+ const char * pszFieldValue );
328
+
329
+ hDBF: The access handle for the file to be written, as returned by
330
+ DBFOpen(), or DBFCreate().
331
+
332
+ iShape: The record number (shape number) to which the field value
333
+ should be written.
334
+
335
+ iField: The field within the selected record that should be written.
336
+
337
+ pszFieldValue: The string to be written to the field.
338
+ </pre>
339
+
340
+ The DBFWriteStringAttribute() function is used to write a value to a string
341
+ field (FString). If the write succeeds the value TRUE willbe returned,
342
+ otherwise FALSE will be returned. If the value is too large to
343
+ fit in the field, it will be truncated and FALSE returned.<p>
344
+
345
+ <!-------------------------------------------------------------------------->
346
+
347
+ <h2>DBFWriteNULLAttribute()</h2>
348
+
349
+ <pre>
350
+ int DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );
351
+
352
+ hDBF: The access handle for the file to be written, as returned by
353
+ DBFOpen(), or DBFCreate().
354
+
355
+ iShape: The record number (shape number) to which the field value
356
+ should be written.
357
+
358
+ iField: The field within the selected record that should be written.
359
+ </pre>
360
+
361
+ The DBFWriteNULLAttribute() function is used to clear the indicated field
362
+ to a NULL value. In the .dbf file this is represented by setting the entire
363
+ field to spaces. If the write succeeds the value TRUE willbe returned,
364
+ otherwise FALSE will be returned.<p>
365
+
366
+ <!-------------------------------------------------------------------------->
367
+
368
+ <h2>DBFClose()</h2>
369
+
370
+ <pre>
371
+ void DBFClose( DBFHandle hDBF );
372
+
373
+ hDBF: The access handle for the file to be closed.
374
+ </pre>
375
+
376
+ The DBFClose() function will close the indicated xBase file (opened with
377
+ DBFOpen(), or DBFCreate()), flushing out all information to the file on
378
+ disk, and recovering any resources associated with having the file open.
379
+ The file handle (hDBF) should not be used again with the DBF API after
380
+ calling DBFClose().<p>
381
+
382
+ <!-------------------------------------------------------------------------->
383
+
384
+ <h2>DBFIsRecordDeleted()</h2>
385
+
386
+ <pre>
387
+ int DBFIsRecordDeleted( DBFHandle hDBF, int iShape );
388
+
389
+ hDBF: The access handle for the file to be checked.
390
+ iShape: The record index to check.
391
+ </pre>
392
+
393
+ Returns TRUE (non-zero) if the record is marked for deletion, otherwise
394
+ it returns FALSE.<p>
395
+
396
+ <!-------------------------------------------------------------------------->
397
+
398
+ <h2>DBFMarkRecordDeleted()</h2>
399
+
400
+ <pre>
401
+ int DBFMarkRecordDeleted( DBFHandle hDBF, int iShape, int bIsDeleted );
402
+
403
+ hDBF: The access handle for the file.
404
+ iShape: The record index to update.
405
+ bIsDeleted: TRUE to mark record deleted, or FALSE to undelete it.
406
+ </pre>
407
+
408
+ Returns TRUE on success, or FALSE on error.<p>
409
+
410
+ <!-------------------------------------------------------------------------->
411
+
412
+ <h2>DBFGetNativeFieldType()</h2>
413
+
414
+ <pre>
415
+ char DBFGetNativeFieldType( DBFHandle hDBF, int iField );
416
+
417
+ hDBF: The access handle for the file.
418
+ iField: The field index to query.
419
+
420
+ </pre>
421
+
422
+ This function returns the DBF type code of the indicated field. It will
423
+ be one of:<p>
424
+
425
+ <ul>
426
+ <li> 'C' (String)
427
+ <li> 'D' (Date)
428
+ <li> 'F' (Float)
429
+ <li> 'N' (Numeric, with or without decimal)
430
+ <li> 'L' (Logical)
431
+ <li> 'M' (Memo: 10 digits .DBT block ptr)
432
+ <li> ' ' (field out of range)
433
+ </ul>
434
+
435
+ </body>
436
+ </html>
@@ -0,0 +1,235 @@
1
+ <html>
2
+ <head>
3
+ <title>Shapefile C Library V1.2</title>
4
+ <link href="http://www.maptools.org/maptools.css" rel="stylesheet" type="text/css">
5
+ </head>
6
+
7
+ <body>
8
+ <h1>Shapefile C Library V1.2</h1>
9
+
10
+ <h2>Purpose</h2>
11
+
12
+ The Shapefile C Library provides the ability to write simple C programs
13
+ for reading, writing and updating (to a limited extent) ESRI Shapefiles,
14
+ and the associated attribute file (.dbf).<p>
15
+
16
+ <h2>Supporting Information</h2>
17
+
18
+ <ul>
19
+ <li> <a href="shp_api.html">Shapefile API Docs</a>
20
+ <li> <a href="dbf_api.html">DBF/xBase API Docs</a>
21
+ <li> <a href="shapelib-tools.html">Shapefile Tools Docs</a>
22
+ <li> <a href="release.html">Release Notes</a>
23
+ <li> <a href="manifest.html">Shapelib File Manifest</a>
24
+ <li> <a href="license.html">Shapelib Licensing Terms</a>
25
+ </ul>
26
+
27
+ <h2>What is a Shapefile?</h2>
28
+
29
+ If you don't know, you probably don't need this library. The Shapefile
30
+ format is a working and interchange format promulagated by
31
+ <a href="http://www.esri.com/">ESRI</a> for simple vector data with attributes.
32
+ <p>
33
+
34
+ An excellent <a href="dl/shapefile.pdf">white paper</a> on the shapefile format
35
+ is available from ESRI,
36
+ but it is .pdf format, so you will need Adobe Acrobat to browse it.<p>
37
+
38
+ The file format actually consists of three files.<p>
39
+
40
+ <pre>
41
+ XXX.shp - holds the actual vertices.
42
+ XXX.shx - hold index data pointing to the structures in the .shp file.
43
+ XXX.dbf - holds the attributes in xBase (dBase) format.
44
+ </pre>
45
+
46
+ <h2>Download</h2>
47
+
48
+ Source code, and some other odds and ends can be downloaded from
49
+ <a href="http://download.osgeo.org/shapelib">http://download.osgeo.org/shapelib</a> or <a href="http://shapelib.maptools.org/dl">http://shapelib.maptools.org/dl</a>.<p>
50
+
51
+ Shapelib is available for anonymous CVS access:
52
+
53
+ <pre>
54
+ cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot login
55
+ Password: (hit enter)
56
+ cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot co shapelib
57
+ </pre>
58
+
59
+ <h2>Bugs, Maintainance and Support</h2>
60
+
61
+ This library is maintained by <a href="http://pobox.com/~warmerdam">Frank
62
+ Warmerdam</a>. Please send me bug reports, patches and suggestions for the
63
+ library via the <a href="http://bugzilla.maptools.org/enter_bug.cgi?product=Shapelib">maptools.org Bugzilla</a>. Shapelib bugs can also be
64
+ <a href="http://bugzilla.maptools.org/query.cgi?product=Shapelib">queried</a>.
65
+ <p>
66
+
67
+ Shapelib is hosted at
68
+ <a href="http://shapelib.maptools.org">shapelib.maptools.org</a>. A mailing
69
+ list for discussion of how to use shapelib, and announcing new releases
70
+ <a href="http://lists.maptools.org/mailman/listinfo/shapelib/">is
71
+ available</a>. To only find out about new releases of Shapelib select the
72
+ "<i>Subscribe to new releases</i>" option from the link at
73
+ <a href="http://freshmeat.net/projects/shapelib/">Freshmeat</a>.<p>
74
+
75
+ <h2>Credits</h2>
76
+
77
+ I didn't start this section anywhere near soon enough, so alot of earlier
78
+ contributors to Shapelib are lost in pre-history.
79
+
80
+ <ul>
81
+ <li> Bill Miller (NY-DOT) for shputils.c
82
+ <li> Carl Anderson for the contents of the contrib directory, and
83
+ the "tuple" additions to dbfopen.c.
84
+ <li> Andrea Giacomelli for patches for dbfopen.c.
85
+ <li> Doug Matthews for portability improvements.
86
+ <li> Jan-Oliver Wagner for convincing me to make it available under LGPL,
87
+ shared library support, and various other patches.
88
+ <li> Dennis Christopher (of Avenza) for testing and bug fixes.
89
+ <li> Miko Syrj� (of 3D-system Oy) for a record size bug fix.
90
+ <li> Steven Lime and Curtis Hill for help with NULL shapes.
91
+ <li> Jim Matthews for support of NULL attributes in dbf files.
92
+ <li> <a href="http://www.pcigeomatics.com/">PCI Geomatics</a> who let me
93
+ release a modified version of their shapefile code in the beginning and
94
+ who hosted shapelib for years.
95
+ </ul>
96
+
97
+ <h2>In Memorium</h2>
98
+
99
+ I would like to dedicate Shapelib to the memory of Sol Katz. While I never
100
+ met him in person, his generous contributions to the GIS community took
101
+ many forms, including free distribution of a variety of GIS translators
102
+ with source. The fact that he used this Shapelib in some of his utilities,
103
+ and thanked me was a great encouragement to me. I hope I can do his memory
104
+ honour by trying to contribute in a similar fashion.<p>
105
+
106
+ <h2>Portability</h2>
107
+
108
+ The Shapefile C Library should port easily to 32bit systems with ANSI C
109
+ compilers. It should work on 64 bit architectures (such as the DEC AXP).<p>
110
+
111
+ Care should also be taken to pass the binary access flag into SHPOpen()
112
+ and DBFOpen() when operating on systems with special text file translation
113
+ such as MSDOS.<p>
114
+
115
+ The shputils.c module is contributed, and may not take the same approach
116
+ to portability as the rest of the package.<p>
117
+
118
+ On Linux, and most unix systems it should be possible to build and
119
+ install shapefile support as a shared library using the "lib" and "lib_install"
120
+ targets of the Makefile. Note that this Makefile doesn't use autoconf
121
+ mechanisms and will generally require some hand tailoring for your environment.
122
+
123
+ <h2>Limitations</h2>
124
+
125
+ <ul>
126
+
127
+ <li> You can't modify the vertices of existing structures (though you
128
+ can update the attributes of existing structures, and create new
129
+ structures).<p>
130
+
131
+ <li> Not written in such a way as to be particularly fast. This is
132
+ particularly true of the 1.2 API. For applications more concerned with
133
+ speed it may be worth using the V1.1 API.<p>
134
+
135
+ <li> Doesn't set the last access time properly in the .dbf files.<p>
136
+
137
+ <li> There is no way to synchronize information to the file except to close it.
138
+ <p>
139
+
140
+ <li> Poor error checking and reporting.<p>
141
+
142
+ <li> Not professionally supported (well it can be, if you want to pay).<p>
143
+
144
+ <li> Some aspects of xBase files not supported, though I believe they are
145
+ not used by ESRI.<p>
146
+
147
+ <li> The application must keep the .dbf file in sync with the .shp/.shx
148
+ files through appropriate use of the DBF and SHP APIs.<p>
149
+
150
+ <li> No support for the undocumented .sbn/.sbx spatial index files.<p>
151
+
152
+ </ul>
153
+
154
+ <h2>Other Shapefile Resources</h2>
155
+
156
+ <ul>
157
+ <li> <a href="dl/shapefile.pdf">Shapefile Format Specifications (pdf)</a><p>
158
+
159
+ <li> <a href="http://www.clicketyclick.dk/databases/xbase/format/">Xbase (.dbf) File Format Description</a>. <p>
160
+
161
+ <li> <a href="codepage.html">Language ID / Code Page mappings</a><p>
162
+
163
+ <li> Shapelib is used within the multiformat
164
+ <a href="http://ogr.maptools.org/">OGR</a> library. If you are looking for a
165
+ high level C++ library with support for many geospatial vector formats you
166
+ might want to check it out.<p>
167
+
168
+ <li> Ari Jolma has produced an initial <b>perl</b> binding on top of shapelib,
169
+ which can be found at CPAN as Geo::ShapeFile under the
170
+ <a href="http://www.cpan.org/modules/by-module/Geo/">Geo</a> module.
171
+ <p>
172
+
173
+ <li> Bernhard Herzog has produced <b>python</b> bindings for Shapelib with
174
+ SWIG, available at <a href="http://ftp.intevation.de/users/bh/pyshapelib/">http://ftp.intevation.de/users/bh/pyshapelib</a>. A new version not using swig is
175
+ available as <a href="http://wald.intevation.org/plugins/scmsvn/viewcvs.php/trunk/thuban/libraries/pyshapelib/?root=thuban">part of Thuban</a>.<p>
176
+
177
+ <li> <a href="http://www.triplexware.huckfinn.de/shpapi.html">Delphi</a>
178
+ bindings for Shapelib courtesy of Alexander Weidauer.<p>
179
+
180
+ <li> Miguel Filgueiras has implemented
181
+ <a href="http://www.ncc.up.pt/gpsmanshp/">Tcl</a> bindings for Shapelib
182
+ as part of <a href="http://www.ncc.up.pt/gpsman/">GPSMan</a>.<p>
183
+
184
+ <li> David Gancarz has implemented a Microsoft
185
+ <a href="dl/contrib/DotNetArchive.zip">.NET wrapper</a> for
186
+ Shapelib. An example of using shapelib with VB6 is also icluded in the .NET wrapper project file.<p>
187
+
188
+ <li> Andrey Hristov (php at hristov dot com) has developed a PHP extension
189
+ based on Shapelib. It can be found in CVS at http://cvs.php.net/pecl/shp.<p>
190
+
191
+ <li> Toyoda Eizi has developed Ruby bindings found at
192
+ <a href="http://sourceforge.net/projects/ruby-shapelib">http://sourceforge.net/projects/ruby-shapelib</a>.<p>
193
+
194
+ <li> Davide Cesari has developed FORTRAN bindings that can be found at
195
+ <a href"http://www.webalice.it/o.drofa/davide/shapelib-fortran/">
196
+ http://www.webalice.it/o.drofa/davide/shapelib-fortran</a>.
197
+
198
+ <li> Jan-Oliver Wagner has implemented a commandline program
199
+ (<b>gen2shp</b>) for producing shapefiles from Arc/Info Generate format ASCII
200
+ files. He maintains a <a href="http://intevation.de/~jan/gen2shp">web page</a> for his work. <p>
201
+
202
+ <li> Tom Russo has implemented a shpcs2cs program, which reprojects shapefiles
203
+ using arguments similar to the PROJ.4 cs2cs program including datum conversion.
204
+ Use as an alternate to the contrib/shpproj which doesn't do datums. It is
205
+ available at the bottom of Tom's <a href="http://www.swcp.com/~russo/shape_web/">Xastir Shapefile Resources</a> page. <p>
206
+
207
+ <li>
208
+ Andrew Williamson's
209
+ <a href="http://www.geocities.com/SiliconValley/Haven/2295/useful.html">Useful
210
+ Scripts and Stuff</a> page for ArcView, which includes ShapeChecker.<p>
211
+
212
+ <li> The University of Bonn <a href="http://katla.giub.uni-bonn.de/sfjava/">
213
+ sf4java</a> project apparently includes Java classes for reading Shapefiles.<p>
214
+
215
+ <li> The <a href="http://gis.esri.com/arcscripts/details.cfm?CFGRIDKEY=628102085">ShapeIO2</a> Visual Basic libraries may be of interest to those wanting
216
+ VB access to Shapefiles. Also available <a href="http://shapelib.maptools.org/dl/contrib/ShapeIO2.zip">locally</a>.<p>
217
+
218
+ <li> The <a href="http://arcscripts.esri.com/details.asp?dbid=11810">ShapeFile Read/Write OCX</a> is another option for Visual Basic programmers.<p>
219
+
220
+ <li> <a href="http://www.casa.ucl.ac.uk/sanjay/software_isovistanalyst.htm">Isovist Analyst</a> is a sort-of-free isovist generating extension for
221
+ ArcView using shapelib.<p>
222
+
223
+ <li> <a href="http://www.obviously.com/gis/shpdiff/">shpdiff</a> utility
224
+ by Bryce Nesbitt.<p>
225
+
226
+ <li> <a href="http://www.aequometer.de/">Aequometer</a>: a program for
227
+ MS Excel to calculate the area of polygons and export as shapefiles.<p>
228
+
229
+ </ul>
230
+
231
+ </body>
232
+ </html>
233
+
234
+
235
+