/********************************************************************** * $Id: wkb.h 2007-07-22 XingLin $ * * PostGIS - Spatial Types for PostgreSQL * http://postgis.refractions.net * Copyright 2001-2003 Refractions Research Inc. * * This is free software; you can redistribute and/or modify it under * the terms of the GNU General Public Licence. See the COPYING file. * ********************************************************************** * * PGRaster - Raster/Coverage Model for PostgreSQL/PostGIS * ********************************************************************** * * File Name: wkb.h * * Author: Xing Lin * * Create Date: 2007-07-22 * * Description: WKB Structure Definition * * Original Author: Xing Lin * * Maintainer: Xing Lin * * Last Update: 2007-07-22 * **********************************************************************/ #ifndef _WKB_H #define _WKB_H 1 #include /* * OGC WellKnownBinaryGeometry */ /* * 3d geometries are encode as in OGR by adding WKB3DOFFSET to the type. */ #define WKB3DOFFSET 0x80000000 #ifndef _BYTE #define _BYTE 1 typedef unsigned char byte; #endif #ifndef _UINT32 #define _UINT32 1 typedef uint32_t _uint32; #endif #pragma pack(1) //#pragma warning(disable:4200) // ignore zero-sized array in struct/union typedef struct tagWKSEnvelope { double maxX; double maxY; double minX; double minY; } WKSEnvelope; typedef struct _tagWKSPoint { double X; double Y; } WKSPoint; typedef struct { _uint32 numPoints; WKSPoint points[0]; } WKSLinearRing; typedef struct { byte byteOrder; _uint32 wkbType; } WKBObject; typedef struct { byte byteOrder; _uint32 wkbType; WKSPoint point; } WKBPoint; typedef struct { byte byteOrder; _uint32 wkbType; _uint32 numPoints; WKSPoint points[0]; } WKBLineString; typedef struct { byte byteOrder; _uint32 wkbType; _uint32 numRings; //WKSLinearRing rings[0]; } WKBPolygon; typedef struct { byte byteOrder; _uint32 wkbType; _uint32 num_wkbPoints; WKBPoint WKBPoints[0]; } WKBMultiPoint; typedef struct { byte byteOrder; _uint32 wkbType; _uint32 num_wkbLineStrings; // WKBLineString WKBLineStrings[0]; } WKBMultiLineString; typedef struct { byte byteOrder; _uint32 wkbType; _uint32 num_wkbPolygons; // WKBPolygon wkbPolygons[0]; } WKBMultiPolygon; typedef struct { byte byteOrder; _uint32 wkbType; _uint32 num_wkbGeometries; // WKBGeomertry wkbGeometries[0]; } WKBGeometryCollection; typedef struct tabWKBGeometry { union { WKBObject obj; WKBPoint point; WKBLineString linestring; WKBPolygon polygon; WKBMultiPoint mpoint; WKBMultiLineString mlinestring; WKBMultiPolygon mpolygon; WKBGeometryCollection collection; }; } WKBGeometry; //Buffer Size for WKT/WKB Transformation #ifndef WKT_BUFFER_SIZE #define WKT_UNIT_SIZE 12 #define WKT_BUFFER_SIZE 100000 #endif #define MBRSIZE sizeof(WKSEnvelope) #ifndef PI #define PI 3.14159265 #endif //GeometryType typedef enum tagwkbGeometryType { wkbNone = 0, wkbPoint = 1, wkbLineString = 2, wkbPolygon = 3, wkbMultiPoint = 4, wkbMultiLineString = 5, wkbMultiPolygon = 6, wkbGeometryCollection = 7, } wkbGeometryType; // wkbByteOrder enum wkbByteOrder { wkbXDR = 0, // Big Endian wkbNDR = 1 // Little Endian }; //MATH_ERROR_TOL #ifndef MATH_ERROR_TOL #define MATH_ERROR_TOL #define MATH_TOL 0.0000001 // normal tollerance #define MATH_TOL_SQ 0.0000001 // square root tol #define MATH_TOL_DIST MATH_TOL_SQ // square root tol #define MATH_TOL2 1.0e-12 // square tol (-16) #define MATH_TOL0 1.0e-6 // is zero tol (-8) #define MATH_TOL1_00 1.00000001 // #define MATH_TOL0_99 0.99999999 // #endif /* Functions prototype */ /* void dump_wkb(char *wkb); */ /* Some necessary functions for Creating WKBGeometry*/ // Calculate WKBGeometr's Size in Bytes long G_GetSize(const WKBGeometry* pObj); // (Deep) Clone WKBGeometry Object WKBGeometry* G_Clone(const WKBGeometry* pObj); // (Deep) Clone WKBPoint Object void G_WKSPointCpy(const WKSPoint* point,WKSPoint* pt); // Change WKSEnvelope to WKBPolygon WKBGeometry* G_MBRToGeometry(const WKSEnvelope* pMbr); // Create WKBPolygon::WKBGeometry from WKSPoints. WKBGeometry* G_CreatePolygon_Simple(long numPoints, const WKSPoint* points); // (Deep) Free Space taken by WKBGeometry Objects. void G_DestroyGeometry(WKBGeometry* pObj); WKSLinearRing* G_SeekFirstRing(const WKBGeometry* pObj); WKBGeometry* G_ToGeometry(void* pVal); WKBGeometry* G_SeekFirstGeometry(const WKBGeometry* pObj); WKBGeometry* G_SeekNextGeometry(const WKBGeometry* pObj); double T_DistanceSquare1(const WKSPoint* p1, const WKSPoint* p2); void G_ReCalcMBR_WKBGeometry1(const WKBGeometry* pObj, WKSEnvelope* pMbr); void G_ReCalcMBR_WKSPoint(long numPoints, const WKSPoint* points, WKSEnvelope* pMbr); void G_ReCalcMBR_WKSLinearRing(const WKSLinearRing* pRing, WKSEnvelope* pMbr); WKSEnvelope* G_ExpandEnvelope(const WKSEnvelope* mbr1, WKSEnvelope* mbr2); int G_IsMultiGeometry(const WKBGeometry* pObj); /* Might Need Some WKT/WKB Conversion Tools. */ #pragma pack() #endif