1 #ifndef _SHAPEFILE_H_INCLUDED
2 #define _SHAPEFILE_H_INCLUDED
3 
4 /******************************************************************************
5  * $Id: shapefil.h,v 1.2 2004-09-27 01:13:58 robertl Exp $
6  *
7  * Project:  Shapelib
8  * Purpose:  Primary include file for Shapelib.
9  * Author:   Frank Warmerdam, warmerdam@pobox.com
10  *
11  ******************************************************************************
12  * Copyright (c) 1999, Frank Warmerdam
13  *
14  * This software is available under the following "MIT Style" license,
15  * or at the option of the licensee under the LGPL (see LICENSE.LGPL).  This
16  * option is discussed in more detail in shapelib.html.
17  *
18  * --
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining a
21  * copy of this software and associated documentation files (the "Software"),
22  * to deal in the Software without restriction, including without limitation
23  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
24  * and/or sell copies of the Software, and to permit persons to whom the
25  * Software is furnished to do so, subject to the following conditions:
26  *
27  * The above copyright notice and this permission notice shall be included
28  * in all copies or substantial portions of the Software.
29  *
30  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
31  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
33  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
34  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
35  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
36  * DEALINGS IN THE SOFTWARE.
37  ******************************************************************************
38  *
39  * $Log: not supported by cvs2svn $
40  * Revision 1.1  2004/09/20 17:22:55  robertl
41  * Bring in shapefil.h.
42  *
43  * Revision 1.26  2002/09/29 00:00:08  warmerda
44  * added FTLogical and logical attribute read/write calls
45  *
46  * Revision 1.25  2002/05/07 13:46:30  warmerda
47  * added DBFWriteAttributeDirectly().
48  *
49  * Revision 1.24  2002/04/10 16:59:54  warmerda
50  * added SHPRewindObject
51  *
52  * Revision 1.23  2002/01/15 14:36:07  warmerda
53  * updated email address
54  *
55  * Revision 1.22  2002/01/15 14:32:00  warmerda
56  * try to improve SHPAPI_CALL docs
57  *
58  * Revision 1.21  2001/11/01 16:29:55  warmerda
59  * move pabyRec into SHPInfo for thread safety
60  *
61  * Revision 1.20  2001/07/20 13:06:02  warmerda
62  * fixed SHPAPI attribute for SHPTreeFindLikelyShapes
63  *
64  * Revision 1.19  2001/05/31 19:20:13  warmerda
65  * added DBFGetFieldIndex()
66  *
67  * Revision 1.18  2001/05/31 18:15:40  warmerda
68  * Added support for NULL fields in DBF files
69  *
70  * Revision 1.17  2001/05/23 13:36:52  warmerda
71  * added use of SHPAPI_CALL
72  *
73  * Revision 1.16  2000/09/25 14:15:59  warmerda
74  * added DBFGetNativeFieldType()
75  *
76  * Revision 1.15  2000/02/16 16:03:51  warmerda
77  * added null shape support
78  *
79  * Revision 1.14  1999/11/05 14:12:05  warmerda
80  * updated license terms
81  *
82  * Revision 1.13  1999/06/02 18:24:21  warmerda
83  * added trimming code
84  *
85  * Revision 1.12  1999/06/02 17:56:12  warmerda
86  * added quad'' subnode support for trees
87  *
88  * Revision 1.11  1999/05/18 19:11:11  warmerda
89  * Added example searching capability
90  *
91  * Revision 1.10  1999/05/18 17:49:38  warmerda
92  * added initial quadtree support
93  *
94  * Revision 1.9  1999/05/11 03:19:28  warmerda
95  * added new Tuple api, and improved extension handling - add from candrsn
96  *
97  * Revision 1.8  1999/03/23 17:22:27  warmerda
98  * Added extern "C" protection for C++ users of shapefil.h.
99  *
100  * Revision 1.7  1998/12/31 15:31:07  warmerda
101  * Added the TRIM_DBF_WHITESPACE and DISABLE_MULTIPATCH_MEASURE options.
102  *
103  * Revision 1.6  1998/12/03 15:48:15  warmerda
104  * Added SHPCalculateExtents().
105  *
106  * Revision 1.5  1998/11/09 20:57:16  warmerda
107  * Altered SHPGetInfo() call.
108  *
109  * Revision 1.4  1998/11/09 20:19:33  warmerda
110  * Added 3D support, and use of SHPObject.
111  *
112  * Revision 1.3  1995/08/23 02:24:05  warmerda
113  * Added support for reading bounds.
114  *
115  * Revision 1.2  1995/08/04  03:17:39  warmerda
116  * Added header.
117  *
118  */
119 
120 #include <stdio.h>
121 
122 #ifdef USE_DBMALLOC
123 #include <dbmalloc.h>
124 #endif
125 
126 #ifdef __cplusplus
127 extern "C" {
128 #endif
129 
130 /************************************************************************/
131 /*                        Configuration options.                        */
132 /************************************************************************/
133 
134 /* -------------------------------------------------------------------- */
135 /*      Should the DBFReadStringAttribute() strip leading and           */
136 /*      trailing white space?                                           */
137 /* -------------------------------------------------------------------- */
138 #define TRIM_DBF_WHITESPACE
139 
140 /* -------------------------------------------------------------------- */
141 /*      Should we write measure values to the Multipatch object?        */
142 /*      Reportedly ArcView crashes if we do write it, so for now it     */
143 /*      is disabled.                                                    */
144 /* -------------------------------------------------------------------- */
145 #define DISABLE_MULTIPATCH_MEASURE
146 
147 /* -------------------------------------------------------------------- */
148 /*      SHPAPI_CALL                                                     */
149 /*                                                                      */
150 /*      The following two macros are present to allow forcing           */
151 /*      various calling conventions on the Shapelib API.                */
152 /*                                                                      */
153 /*      To force __stdcall conventions (needed to call Shapelib         */
154 /*      from Visual Basic and/or Dephi I believe) the makefile could    */
155 /*      be modified to define:                                          */
156 /*                                                                      */
157 /*        /DSHPAPI_CALL=__stdcall                                       */
158 /*                                                                      */
159 /*      If it is desired to force export of the Shapelib API without    */
160 /*      using the shapelib.def file, use the following definition.      */
161 /*                                                                      */
162 /*        /DSHAPELIB_DLLEXPORT                                          */
163 /*                                                                      */
164 /*      To get both at once it will be necessary to hack this           */
165 /*      include file to define:                                         */
166 /*                                                                      */
167 /*        #define SHPAPI_CALL __declspec(dllexport) __stdcall           */
168 /*        #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall        */
169 /*                                                                      */
170 /*      The complexity of the situtation is partly caused by the        */
171 /*      peculiar requirement of Visual C++ that __stdcall appear        */
172 /*      after any "*"'s in the return value of a function while the     */
173 /*      __declspec(dllexport) must appear before them.                  */
174 /* -------------------------------------------------------------------- */
175 
176 #ifdef SHAPELIB_DLLEXPORT
177 #  define SHPAPI_CALL __declspec(dllexport)
178 #  define SHPAPI_CALL1(x)  __declspec(dllexport) x
179 #endif
180 
181 #ifndef SHPAPI_CALL
182 #  define SHPAPI_CALL
183 #endif
184 
185 #ifndef SHPAPI_CALL1
186 #  define SHPAPI_CALL1(x)      x SHPAPI_CALL
187 #endif
188 
189 /************************************************************************/
190 /*                             SHP Support.                             */
191 /************************************************************************/
192 typedef	struct
193 {
194     FILE        *fpSHP;
195     FILE	*fpSHX;
196 
197     int		nShapeType;				/* SHPT_* */
198 
199     int		nFileSize;				/* SHP file */
200 
201     int         nRecords;
202     int		nMaxRecords;
203     int		*panRecOffset;
204     int		*panRecSize;
205 
206     double	adBoundsMin[4];
207     double	adBoundsMax[4];
208 
209     int		bUpdated;
210 
211     unsigned char *pabyRec;
212     int         nBufSize;
213 } SHPInfo;
214 
215 typedef SHPInfo * SHPHandle;
216 
217 /* -------------------------------------------------------------------- */
218 /*      Shape types (nSHPType)                                          */
219 /* -------------------------------------------------------------------- */
220 #define SHPT_NULL	0
221 #define SHPT_POINT	1
222 #define SHPT_ARC	3
223 #define SHPT_POLYGON	5
224 #define SHPT_MULTIPOINT	8
225 #define SHPT_POINTZ	11
226 #define SHPT_ARCZ	13
227 #define SHPT_POLYGONZ	15
228 #define SHPT_MULTIPOINTZ 18
229 #define SHPT_POINTM	21
230 #define SHPT_ARCM	23
231 #define SHPT_POLYGONM	25
232 #define SHPT_MULTIPOINTM 28
233 #define SHPT_MULTIPATCH 31
234 
235 
236 /* -------------------------------------------------------------------- */
237 /*      Part types - everything but SHPT_MULTIPATCH just uses           */
238 /*      SHPP_RING.                                                      */
239 /* -------------------------------------------------------------------- */
240 
241 #define SHPP_TRISTRIP	0
242 #define SHPP_TRIFAN	1
243 #define SHPP_OUTERRING	2
244 #define SHPP_INNERRING	3
245 #define SHPP_FIRSTRING	4
246 #define SHPP_RING	5
247 
248 /* -------------------------------------------------------------------- */
249 /*      SHPObject - represents on shape (without attributes) read       */
250 /*      from the .shp file.                                             */
251 /* -------------------------------------------------------------------- */
252 typedef struct
253 {
254     int		nSHPType;
255 
256     int		nShapeId; /* -1 is unknown/unassigned */
257 
258     int		nParts;
259     int		*panPartStart;
260     int		*panPartType;
261 
262     int		nVertices;
263     double	*padfX;
264     double	*padfY;
265     double	*padfZ;
266     double	*padfM;
267 
268     double	dfXMin;
269     double	dfYMin;
270     double	dfZMin;
271     double	dfMMin;
272 
273     double	dfXMax;
274     double	dfYMax;
275     double	dfZMax;
276     double	dfMMax;
277 } SHPObject;
278 
279 /* -------------------------------------------------------------------- */
280 /*      SHP API Prototypes                                              */
281 /* -------------------------------------------------------------------- */
282 SHPHandle SHPAPI_CALL
283       SHPOpen( const char * pszShapeFile, const char * pszAccess );
284 SHPHandle SHPAPI_CALL
285       SHPCreate( const char * pszShapeFile, int nShapeType );
286 void SHPAPI_CALL
287       SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,
288                   double * padfMinBound, double * padfMaxBound );
289 
290 SHPObject SHPAPI_CALL1(*)
291       SHPReadObject( SHPHandle hSHP, int iShape );
292 int SHPAPI_CALL
293       SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject );
294 
295 void SHPAPI_CALL
296       SHPDestroyObject( SHPObject * psObject );
297 void SHPAPI_CALL
298       SHPComputeExtents( SHPObject * psObject );
299 SHPObject SHPAPI_CALL1(*)
300       SHPCreateObject( int nSHPType, int nShapeId,
301                        int nParts, int * panPartStart, int * panPartType,
302                        int nVertices, const double * padfX, const double * padfY,
303                        const double * padfZ, const double * padfM );
304 SHPObject SHPAPI_CALL1(*)
305       SHPCreateSimpleObject( int nSHPType, int nVertices,
306                              const double * padfX, const double * padfY, const double * padfZ );
307 
308 int SHPAPI_CALL
309       SHPRewindObject( SHPHandle hSHP, SHPObject * psObject );
310 
311 void SHPAPI_CALL
312       SHPClose( SHPHandle hSHP );
313 
314 const char SHPAPI_CALL1(*)
315       SHPTypeName( int nSHPType );
316 const char SHPAPI_CALL1(*)
317       SHPPartTypeName( int nPartType );
318 
319 /* -------------------------------------------------------------------- */
320 /*      Shape quadtree indexing API.                                    */
321 /* -------------------------------------------------------------------- */
322 
323 /* this can be two or four for binary or quad tree */
324 #define MAX_SUBNODE	4
325 
326 typedef struct shape_tree_node
327 {
328     /* region covered by this node */
329     double	adfBoundsMin[4];
330     double	adfBoundsMax[4];
331 
332     /* list of shapes stored at this node.  The papsShapeObj pointers
333        or the whole list can be NULL */
334     int		nShapeCount;
335     int		*panShapeIds;
336     SHPObject   **papsShapeObj;
337 
338     int		nSubNodes;
339     struct shape_tree_node *apsSubNode[MAX_SUBNODE];
340 
341 } SHPTreeNode;
342 
343 typedef struct
344 {
345     SHPHandle   hSHP;
346 
347     int		nMaxDepth;
348     int		nDimension;
349 
350     SHPTreeNode	*psRoot;
351 } SHPTree;
352 
353 SHPTree SHPAPI_CALL1(*)
354       SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth,
355                      double *padfBoundsMin, double *padfBoundsMax );
356 void    SHPAPI_CALL
357       SHPDestroyTree( SHPTree * hTree );
358 
359 int	SHPAPI_CALL
360       SHPWriteTree( SHPTree *hTree, const char * pszFilename );
361 SHPTree SHPAPI_CALL
362       SHPReadTree( const char * pszFilename );
363 
364 int	SHPAPI_CALL
365       SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject );
366 int	SHPAPI_CALL
367       SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject );
368 int	SHPAPI_CALL
369       SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId );
370 
371 void 	SHPAPI_CALL
372       SHPTreeTrimExtraNodes( SHPTree * hTree );
373 
374 int    SHPAPI_CALL1(*)
375       SHPTreeFindLikelyShapes( SHPTree * hTree,
376                                double * padfBoundsMin,
377                                double * padfBoundsMax,
378                                int * );
379 int     SHPAPI_CALL
380       SHPCheckBoundsOverlap( double *, double *, double *, double *, int );
381 
382 /************************************************************************/
383 /*                             DBF Support.                             */
384 /************************************************************************/
385 typedef	struct
386 {
387     FILE	*fp;
388 
389     int         nRecords;
390 
391     int		nRecordLength;
392     int		nHeaderLength;
393     int		nFields;
394     int		*panFieldOffset;
395     int		*panFieldSize;
396     int		*panFieldDecimals;
397     char	*pachFieldType;
398 
399     char	*pszHeader;
400 
401     int		nCurrentRecord;
402     int		bCurrentRecordModified;
403     char	*pszCurrentRecord;
404 
405     int		bNoHeader;
406     int		bUpdated;
407 } DBFInfo;
408 
409 typedef DBFInfo * DBFHandle;
410 
411 typedef enum {
412   FTString,
413   FTInteger,
414   FTDouble,
415   FTLogical,
416   FTInvalid
417 } DBFFieldType;
418 
419 #define XBASE_FLDHDR_SZ       32
420 
421 DBFHandle SHPAPI_CALL
422       DBFOpen( const char * pszDBFFile, const char * pszAccess );
423 DBFHandle SHPAPI_CALL
424       DBFCreate( const char * pszDBFFile );
425 
426 int	SHPAPI_CALL
427       DBFGetFieldCount( DBFHandle psDBF );
428 int	SHPAPI_CALL
429       DBFGetRecordCount( DBFHandle psDBF );
430 int	SHPAPI_CALL
431       DBFAddField( DBFHandle hDBF, const char * pszFieldName,
432                    DBFFieldType eType, int nWidth, int nDecimals );
433 
434 DBFFieldType SHPAPI_CALL
435       DBFGetFieldInfo( DBFHandle psDBF, int iField,
436                        char * pszFieldName, int * pnWidth, int * pnDecimals );
437 
438 int SHPAPI_CALL
439       DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName);
440 
441 int 	SHPAPI_CALL
442       DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
443 double 	SHPAPI_CALL
444       DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
445 const char SHPAPI_CALL1(*)
446       DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
447 const char SHPAPI_CALL1(*)
448       DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField );
449 int     SHPAPI_CALL
450       DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
451 
452 int SHPAPI_CALL
453       DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField,
454                                 int nFieldValue );
455 int SHPAPI_CALL
456       DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,
457                                double dFieldValue );
458 int SHPAPI_CALL
459       DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,
460                                const char * pszFieldValue );
461 int SHPAPI_CALL
462      DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );
463 
464 int SHPAPI_CALL
465      DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField,
466 			       const char lFieldValue);
467 int SHPAPI_CALL
468      DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField,
469                                void * pValue );
470 const char SHPAPI_CALL1(*)
471       DBFReadTuple(DBFHandle psDBF, int hEntity );
472 int SHPAPI_CALL
473       DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple );
474 
475 DBFHandle SHPAPI_CALL
476       DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename );
477 
478 void	SHPAPI_CALL
479       DBFClose( DBFHandle hDBF );
480 char    SHPAPI_CALL
481       DBFGetNativeFieldType( DBFHandle hDBF, int iField );
482 
483 #ifdef __cplusplus
484 }
485 #endif
486 
487 #endif /* ndef _SHAPEFILE_H_INCLUDED */
488