GIS开源库shapeLib的使用方法
生活随笔
收集整理的這篇文章主要介紹了
GIS开源库shapeLib的使用方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)自:http://www.cnblogs.com/liongis/archive/2012/10/23/2736015.html
? ? 近期研究了一下GIS開源庫shapeLib讀寫ArcGIS數(shù)據(jù)的API函數(shù),先整理一下,將各個API的用法介紹一下。
分為兩個模塊,shape API和DBF API,前者的讀取.shp文件的空間幾何信息,后者讀取.dbf文件的屬性信息。
Shape API:
Shape Types (shape類型)
shape文件的類型定義如下:
#define SHPT_NULL 02D Shape Types (pre ArcView 3.x):#define SHPT_POINT 1 Points#define SHPT_ARC 3 Arcs (Polylines, possible in parts)#define SHPT_POLYGON 5 Polygons (possible in parts)#define SHPT_MULTIPOINT 8 MultiPoint (related points)3D Shape Types (may include "measure" values for vertices):#define SHPT_POINTZ 11 #define SHPT_ARCZ 13#define SHPT_POLYGONZ 15#define SHPT_MULTIPOINTZ 182D + Measure Types:#define SHPT_POINTM 21#define SHPT_ARCM 23#define SHPT_POLYGONM 25#define SHPT_MULTIPOINTM 28Complex (TIN-like) with Z, and Measure:#define SHPT_MULTIPATCH 31SHPObject ?(shape文件中包含的要素對象)
typedef struct{int nSHPType; //Shape Type (SHPT_* - see list above) 要素類型int nShapeId; //Shape Number (-1 is unknown/unassigned) IDint nParts; //# of Parts (0 implies single part with no info) 要素有幾個部分組成int *panPartStart; //Start Vertex of part 要素部分的起始點int *panPartType; //Part Type (SHPP_RING if not SHPT_MULTIPATCH) 各個部分的類型int nVertices; //Vertex list double *padfX; double *padfY;double *padfZ; //(all zero if not provided)double *padfM; //(all zero if not provided)double dfXMin; //Bounds in X, Y, Z and M dimensionsdouble dfYMin;double dfZMin;double dfMMin;double dfXMax;double dfYMax;double dfZMax;double dfMMax;} SHPObject;SHPOpen() ?
SHPHandle SHPOpen( const char * pszShapeFile, const char * pszAccess );pszShapeFile: //shape文件的全路徑pszAccess: //打開方式 "rb" (read-only binary) and "rb+" (read/write binary)//打開shape文件,操作完必須調(diào)用后面的關(guān)閉。
SHPGetInfo() ? //得到shape對象的信息
void SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,double * padfMinBound, double * padfMaxBound );hSHP: // shape文件的句柄 The handle previously returned by SHPOpen() or SHPCreate().pnEntities: A pointer to an integer into which the number ofentities/structures should be placed. May be NULL.pnShapetype: A pointer to an integer into which the shapetypeof this file should be placed. Shapefiles may containeither SHPT_POINT, SHPT_ARC, SHPT_POLYGON or SHPT_MULTIPOINT entities. This may be NULL.padfMinBound: The X, Y, Z and M minimum values will be placed intothis four entry array. This may be NULL.padfMaxBound: The X, Y, Z and M maximum values will be placed intothis four entry array. This may be NULL.SHPReadObject() ?//讀取每條記錄中的信息
SHPObject *SHPReadObject( SHPHandle hSHP, int iShape );hSHP: The handle previously returned by SHPOpen() or SHPCreate().iShape: The entity number of the shape to read. Entity numbers are between 0 and nEntities-1 (as returnedby SHPGetInfo()).SHPClose()
void SHPClose( SHPHandle hSHP );SHPCreate() ?//創(chuàng)建一個shape文件
SHPHandle SHPCreate( const char * pszShapeFile, int nShapeType );pszShapeFile: //創(chuàng)建文件的名稱nShapeType: //類型,參加上面定義的類型SHPCreateSimpleObject() ? //創(chuàng)建簡單要素對象,一般調(diào)用此方法
SHPObject * SHPCreateSimpleObject( int nSHPType, int nVertices, double *padfX, double * padfY, double *padfZ, );nSHPType: The SHPT_ type of the object to be created, suchas SHPT_POINT, or SHPT_POLYGON.nVertices: The number of vertices being passed in padfX, padfY, and padfZ. padfX: An array of nVertices X coordinates of the verticesfor this object.padfY: An array of nVertices Y coordinates of the verticesfor this object.padfZ: An array of nVertices Z coordinates of the verticesfor this object. This may be NULL in which casethey are all assumed to be zero.SHPCreateObject() ?//創(chuàng)建復雜對象,參數(shù)中包含所有信息
SHPObject * SHPCreateObject( int nSHPType, int iShape,int nParts, int * panPartStart, int * panPartType,int nVertices, double *padfX, double * padfY, double *padfZ, double *padfM );nSHPType: The SHPT_ type of the object to be created, suchas SHPT_POINT, or SHPT_POLYGON.iShape: The shapeid to be recorded with this shape.nParts: The number of parts for this object. If this iszero for ARC, or POLYGON type objects, a single zero valued part will be created internally.panPartStart: The list of zero based start vertices for the rings(parts) in this object. The first should always bezero. This may be NULL if nParts is 0.panPartType: The type of each of the parts. This is only meaningfulfor MULTIPATCH files. For all other cases this maybe NULL, and will be assumed to be SHPP_RING.nVertices: The number of vertices being passed in padfX, padfY, and padfZ. padfX: An array of nVertices X coordinates of the verticesfor this object.padfY: An array of nVertices Y coordinates of the verticesfor this object.padfZ: An array of nVertices Z coordinates of the verticesfor this object. This may be NULL in which casethey are all assumed to be zero.padfM: An array of nVertices M (measure values) of the vertices for this object. This may be NULL in which case they are all assumed to be zero.SHPComputeExtents() ?//重新計算記錄的取值范圍
void SHPComputeExtents( SHPObject * psObject );psObject: An existing shape object to be updated in place.SHPWriteObject() ?//向shape文件中添加一條記錄,只有先添加了記錄,才能添加屬性信息
int SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject *psObject );hSHP: The handle previously returned by SHPOpen("r+") or SHPCreate().iShape: The entity number of the shape to write. A value of-1 should be used for new shapes. psObject: The shape to write to the file. This should havebeen created with SHPCreateObject(), or SHPCreateSimpleObject().SHPDestroyObject() ?//刪除對象
void SHPDestroyObject( SHPObject *psObject );psObject: The object to deallocate.SHPRewindObject()
int SHPRewindObject( SHPHandle hSHP, SHPObject *psObject );hSHP: The shapefile (not used at this time).psObject: The object to deallocate. This function will reverse any rings necessary in order to enforce the shapefile restrictions on the required order of inner and outer rings in the Shapefile specification. It returns TRUE if a change is made and FALSE if no change is made. Only polygon objects will be affected though any object may be passed.前面介紹了shape API,接下來介紹 dBF API
DBFOpen()
DBFHandle DBFOpen( const char * pszDBFFile, const char * pszAccess );pszDBFFile: The name of the xBase (.dbf) file to access.pszAccess: The fopen() style access string. At this time only"rb" (read-only binary) and "rb+" (read/write binary) should be used.DBFCreate()
DBFHandle DBFCreate( const char * pszDBFFile );pszDBFFile: The name of the xBase (.dbf) file to create. //如果要創(chuàng)建一個完整的shape文件,首先要創(chuàng)建.shap文件,還要創(chuàng)建.dbf文件,兩者缺一不可。DBFGetFieldCount() ?//得到字段的個數(shù)
int DBFGetFieldCount( DBFHandle hDBF );hDBF: The access handle for the file to be queried, as returnedby DBFOpen(), or DBFCreate().DBFGetRecordCount()
//得到記錄的個數(shù),應該和shape文件中的object的個數(shù)對應
int DBFGetRecordCount( DBFHandle hDBF );hDBF: The access handle for the file to be queried, as returned byDBFOpen(), or DBFCreate().DBFGetFieldIndex() ?//通過字段名稱得到字段的編號
int DBFGetFieldIndex( DBFHandle hDBF, const char *pszFieldName );hDBF: The access handle for the file to be queried, as returned byDBFOpen(), or DBFCreate().DBFGetFieldInfo() ?//得到字段的信息,包括類型、長度等
DBFFieldType DBFGetFieldInfo( DBFHandle hDBF, int iField, char * pszFieldName,int * pnWidth, int * pnDecimals );hDBF: The access handle for the file to be queried, as returned byDBFOpen(), or DBFCreate().iField: The field to be queried. This should be a number between 0 and n-1, where n is the number fields on the file, asreturned by DBFGetFieldCount().pszFieldName: If this pointer is not NULL the name of the requested fieldwill be written to this location. The pszFieldName buffer should be at least 12 character is size in order to holdthe longest possible field name of 11 characters plus a terminating zero character.pnWidth: If this pointer is not NULL, the width of the requested fieldwill be returned in the int pointed to by pnWidth. This isthe width in characters. pnDecimals: If this pointer is not NULL, the number of decimal placesprecision defined for the field will be returned. This iszero for integer fields, or non-numeric fields.DBFAddField() ?//向DBF表中添加一個新的屬性字段
int DBFAddField( DBFHandle hDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals );hDBF: The access handle for the file to be updated, as returned byDBFOpen(), or DBFCreate().pszFieldName: The name of the new field. At most 11 character will be used.In order to use the xBase file in some packages it may benecessary to avoid some special characters in the field namessuch as spaces, or arithmetic operators.eType: One of FTString, FTInteger or FTDouble in order to establishthe type of the new field. Note that some valid xBase fieldtypes cannot be created such as date fields.nWidth: The width of the field to be created. For FTString fields thisestablishes the maximum length of string that can be stored.For FTInteger this establishes the number of digits of thelargest number that canbe represented. For FTDouble fields this in combinationwith the nDecimals value establish the size, and precisionof the created field.nDecimals: The number of decimal places to reserve for FTDouble fields.For all other field types this should be zero. For instancewith nWidth=7, and nDecimals=3 numbers would be formattedsimilarly to `123.456'.DBFReadIntegerAttribute()
int DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );hDBF: The access handle for the file to be queried, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) from which the field valueshould be read.iField: The field within the selected record that should be read.DBFReadDoubleAttribute()
double DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );hDBF: The access handle for the file to be queried, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) from which the field valueshould be read.iField: The field within the selected record that should be read.DBFReadStringAttribute()
const char *DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );hDBF: The access handle for the file to be queried, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) from which the field valueshould be read.iField: The field within the selected record that should be read.DBFIsAttributeNULL()
int DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );hDBF: The access handle for the file to be queried, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) from which the field valueshould be read.iField: The field within the selected record that should be read.DBFWriteIntegerAttribute
int DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField,int nFieldValue );hDBF: The access handle for the file to be written, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) to which the field valueshould be written.iField: The field within the selected record that should be written.nFieldValue: The integer value that should be written.DBFWriteDoubleAttribute()
int DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,double dFieldValue );hDBF: The access handle for the file to be written, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) to which the field valueshould be written.iField: The field within the selected record that should be written.dFieldValue: The floating point value that should be written. The DBFWriteDoubleAttribute() function is used to write a value to a numeric field (FTInteger, or FTDouble). If the write succeeds the value TRUE will be returned, otherwise FALSE will be returned. If the value is too large to fit in the field, it will be truncated and FALSE returned.?
DBFWriteStringAttribute()
int DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,const char * pszFieldValue );hDBF: The access handle for the file to be written, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) to which the field valueshould be written.iField: The field within the selected record that should be written.pszFieldValue: The string to be written to the field. The DBFWriteStringAttribute() function is used to write a value to a string field (FString). If the write succeeds the value TRUE willbe returned, otherwise FALSE will be returned. If the value is too large to fit in the field, it will be truncated and FALSE returned.?
DBFWriteNULLAttribute()
int DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );hDBF: The access handle for the file to be written, as returned byDBFOpen(), or DBFCreate().iShape: The record number (shape number) to which the field valueshould be written.iField: The field within the selected record that should be written. The DBFWriteNULLAttribute() function is used to clear the indicated field to a NULL value. In the .dbf file this is represented by setting the entire field to spaces. If the write succeeds the value TRUE willbe returned, otherwise FALSE will be returned.?
DBFClose()
void DBFClose( DBFHandle hDBF );hDBF: The access handle for the file to be closed. The DBFClose() function will close the indicated xBase file (opened with DBFOpen(), or DBFCreate()), flushing out all information to the file on disk, and recovering any resources associated with having the file open. The file handle (hDBF) should not be used again with the DBF API after calling DBFClose().?
DBFGetNativeFieldType()
char DBFGetNativeFieldType( DBFHandle hDBF, int iField );hDBF: The access handle for the file.iField: The field index to query. This function returns the DBF type code of the indicated field. It will be one of:?
- 'C' (String)
- 'D' (Date)
- 'F' (Float)
- 'N' (Numeric, with or without decimal)
- 'L' (Logical)
- 'M' (Memo: 10 digits .DBT block ptr)
- ' ' (field out of range)
總結(jié)
以上是生活随笔為你收集整理的GIS开源库shapeLib的使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: _WIN32_WCE有什么用
- 下一篇: Xshell显示中文乱码问题