SHP的常识介绍及C++算法与C#算法实现.doc_第1页
SHP的常识介绍及C++算法与C#算法实现.doc_第2页
SHP的常识介绍及C++算法与C#算法实现.doc_第3页
SHP的常识介绍及C++算法与C#算法实现.doc_第4页
SHP的常识介绍及C++算法与C#算法实现.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

shp文件的读取首先了解一下shp文件的一些简单知识Shapefile文件是美国环境系统研究所(ESRI)所研制的GIS文件系统格式文件,是工业标准的矢量数据文件。 Shapefile将空间特征表中的非拓扑几何对象和属性信息存储在数据集中,特征表中的几何对象存为以坐标点集表示的图形文件SHP文件,Shapefile文件并不含拓扑(Topological)数据结构。一个Shape文件包括三个文件:一个主文件(*.shp),一个索引文件(*.shx),和一个dBASE(*.dbf)表。主文件是一个直接存取,变长度记录的文件,其中每个记录描述构成一个地理特征(Feature)的所有vertices坐标值。在索引文件中,每条记录包含对应主文件记录距离主文件头开始的偏移量,dBASE表包含SHP文件中每一个Feature的特征属性,表中几何记录和属性数据之间的一一对应关系是基于记录数目的ID。在dBASE文件中的属性记录必须和主文件中的记录顺序是相同的。图形数据和属性数据通过索引号建立一一对应的关系Shapefile中坐标文件(.shp)由固定长度的文件头和接着的变长度空间数据记录组成。文件头由100字节的说明信息组成的,主要说明文件的长度、Shape类型、整个Shape图层的范围等等,这些信息构成了空间数据的元数据。在导入空间数据时首先要读入文件头获取Shape文件的基本信息,并以此信息为基础建立相应的元数据表。而变长度空间数据记录是由固定长度的记录头和变长度记录内容组成,其记录结构基本类似,每条记录都有记录头和记录内容组成(空间坐标对)。记录头的内容包括记录号(Record Number)和坐标记录长度(Content Length)两个记录项,Shapefile文件中的记录号都是从1开始的,坐标记录长度是按16位字来衡量的。记录内容包括目标的几何类型(ShapeType)和具体的坐标记录(X,Y),记录内容因要素几何类型的不同,其具体的内容和格式都有所不同。对于具体的记录主要包括空Shape记录,点记录,线记录和多边形记录。属性文件(.dbf)用于记录属性信息。它是一个标准的DBF文件,也是由头文件和实体信息两部分构成。其中文件头部分的长度是不定长的,它主要对DBF文件作了一些总体说明,其中最主要的是对这个DBF文件的记录项的信息进行了详细的描述,比如对每个记录项的名称,数据类型,长度等信息都有具体的说明。属性文件的实体信息部分就是一条条属性记录,每条记录都是由若干个记录项构成,因此只要依次循环读取每条记录就可以了。索引文件(.shx)主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的文件头的偏移量。通过索引文件可以很方便地在坐标文件中定位到指定目标地坐标信息。索引文件也是由文件头和实体信息两部分构成的,其中文件头部分是一个长度固定(100 bytes)的记录段,其内容与坐标文件的文件头基本一致。它的实体信息以记录为基本单位,每一条记录包括偏移量(Offset)和记录段长度(Content Length)两个记录项。接下来我们再看一下代码(c+):SHP文件的读取view plain1. FeatureClass*CGISMapDoc:ImportShapeFileData(FILE*fpShp,FILE*fpDbf)2. 3. /读Shp文件头开始4. intfileCode=-1;5. intfileLength=-1;6. intversion=-1;7. intshapeType=-1;8. fread(&fileCode,sizeof(int),1,fpShp);9. fileCode=ReverseBytes(fileCode);10. 11. if(fileCode!=9994)12. 13. CStringstrTemp;14. strTemp.Format(WARNINGfilecode%d,fileCode);15. AfxMessageBox(strTemp);16. 17. 18. for(inti=0;im_pDataSource-GetUniqueID();42. FeatureClass*pShpDataSet=0;43. /根据目标类型创建相应的图层DataSet。44. switch(shapeType)45. 46. case1:47. pShpDataSet=(FeatureClass*)&(m_pDataSource-CreateDataSet(uniqueID,POINTDATASET,layerName);48. break;49. case3:50. case23:51. pShpDataSet=(FeatureClass*)&(m_pDataSource-CreateDataSet(uniqueID,LINEDATASET,layerName);52. break;53. case5:54. pShpDataSet=(FeatureClass*)&(m_pDataSource-CreateDataSet(uniqueID,POLYGONDATASET,layerName);55. break;56. 57. 58. if(pShpDataSet=0)return0;59. 60. /读DBF文件头-begin-61. structDBFHeader62. 63. charm_nValid;64. charm_aDate3;65. charm_nNumRecords4;66. charm_nHeaderBytes2;67. charm_nRecordBytes2;68. charm_nReserved13;69. charm_nReserved213;70. charm_nReserved34;71. dbfheader;72. 73. structDBFFIELDDescriptor74. 75. charm_sName10;/应该为charm_sName1176. charm_nType;77. charm_nAddress4;78. charm_nFieldLength;79. charm_nFieldDecimal;80. charm_nReserved12;81. charm_nWorkArea;82. charm_nReserved22;83. charm_nSetFieldsFlag;84. charm_nReserved38;85. ;86. 87. fread(&dbfheader,sizeof(DBFHeader),1,fpDbf);88. /*intrecordsNum=*(int*)dbfheader.m_nNumRecords);89. intheadLen=*(short*)dbfheader.m_nHeaderBytes);90. inteveryRecordLen=*(short*)dbfheader.m_nRecordBytes);91. 92. if(recordsNum=0|headLen=0|everyRecordLen=0)93. return0;94. 95. intfieldCount=(headLen-1-sizeof(DBFHeader)/sizeof(DBFFIELDDescriptor);96. 97. DBFFIELDDescriptor*pFields=newDBFFIELDDescriptorfieldCount;98. for(i=0;iGetFields();114. DBFFIELDDescriptorfield;115. BYTEendByte=;116. charfieldName12;117. intfieldDecimal,fieldLen,everyRecordLen=0;118. while(!feof(fpDbf)119. 120. fread(&endByte,sizeof(BYTE),1,fpDbf);121. if(endByte=0x0D)break;122. fread(&field,sizeof(DBFFIELDDescriptor),1,fpDbf);123. 124. fieldName0=endByte;125. for(i=0;iGetFields();168. Feature*pFeature=newFeature(recordNumber,1,&featureFields);169. 170. intpointShapeType;171. fread(&pointShapeType,sizeof(int),1,fpShp);172. doublexValue,yValue;173. fread(&xValue,sizeof(double),1,fpShp);174. fread(&yValue,sizeof(double),1,fpShp);175. 176. GeoPoint*pNewGeoPoint=newGeoPoint(xValue,yValue);177. pFeature-SetBound(xValue,yValue,0,0);178. pFeature-SetGeometry(pNewGeoPoint);179. this-LoadAttributeData(pFeature,fpDbf,everyRecordLen);180. pShpDataSet-AddRow(pFeature);181. 182. break;183. /读取点目标结束184. 185. case3:/003186. /读取线目标开始187. 188. Fields&featureFields=pShpDataSet-GetFields();189. Feature*pFeature=newFeature(recordNumber,1,&featureFields);190. 191. intarcShapeType;192. fread(&arcShapeType,sizeof(int),1,fpShp);193. 194. doubleobjMinX,objMinY,objMaxX,objMaxY;195. fread(&objMinX,sizeof(double),1,fpShp);196. fread(&objMinY,sizeof(double),1,fpShp);197. fread(&objMaxX,sizeof(double),1,fpShp);198. fread(&objMaxY,sizeof(double),1,fpShp);199. 200. GeoPolyline*pNewGeoLine=newGeoPolyline();201. doublewidth=objMaxX-objMinX;202. doubleheight=objMaxY-objMinY;203. pFeature-SetBound(objMinX,objMinY,width,height);204. 205. intnumParts,numPoints;206. fread(&numParts,sizeof(int),1,fpShp);207. fread(&numPoints,sizeof(int),1,fpShp);208. /存储各段线的起点索引209. int*startOfPart=newintnumParts;210. for(inti=0;iSetPointsCount(numParts);219. 220. for(i=0;iGetPoints(i);223. intcurPosIndex=startOfParti;224. intnextPosIndex=0;225. intcurPointCount=0;226. if(i=numParts-1)227. curPointCount=numPoints-curPosIndex;228. else229. 230. nextPosIndex=startOfParti+1;231. curPointCount=nextPosIndex-curPosIndex;232. 233. points.SetPointCount(curPointCount);234. /加载一条线段的坐标235. for(intiteratorPoint=0;iteratorPointSetGeometry(pNewGeoLine);247. this-LoadAttributeData(pFeature,fpDbf,everyRecordLen);248. pShpDataSet-AddRow(pFeature);249. 250. break;251. /读取线目标结束252. 253. case5:/005254. /读取面目标开始255. 256. Fields&featureFields=pShpDataSet-GetFields();257. Feature*pFeature=newFeature(recordNumber,1,&featureFields);258. intpolygonShapeType;259. fread(&polygonShapeType,sizeof(int),1,fpShp);260. if(polygonShapeType!=5)261. AfxMessageBox(Error:Attempttoloadnonpolygonshapeaspolygon.);262. 263. doubleobjMinX,objMinY,objMaxX,objMaxY;264. fread(&objMinX,sizeof(double),1,fpShp);265. fread(&objMinY,sizeof(double),1,fpShp);266. fread(&objMaxX,sizeof(double),1,fpShp);267. fread(&objMaxY,sizeof(double),1,fpShp);268. 269. GeoPolygon*pNewGeoPolygon=newGeoPolygon();270. doublewidth=objMaxX-objMinX;271. doubleheight=objMaxY-objMinY;272. pFeature-SetBound(objMinX,objMinY,width,height);273. 274. intnumParts,numPoints;275. fread(&numParts,sizeof(int),1,fpShp);276. fread(&numPoints,sizeof(int),1,fpShp);277. /存储各个面的起点索引278. int*startOfPart=newintnumParts;279. for(inti=0;iSetPointsCount(numParts);288. 289. for(i=0;iGetPoints(i);292. intcurPosIndex=startOfParti;293. intnextPosIndex=0;294. intcurPointCount=0;295. if(i=numParts-1)296. curPointCount=numPoints-curPosIndex;297. else298. 299. nextPosIndex=startOfParti+1;300. curPointCount=nextPosIndex-curPosIndex;301. 302. points.SetPointCount(curPointCount);303. /加载一个面(多边形)的坐标304. for(intiteratorPoint=0;iteratorPointSetGeometry(pNewGeoPolygon);316. this-LoadAttributeData(pFeature,fpDbf,everyRecordLen);317. pShpDataSet-AddRow(pFeature);318. 319. break;320. /读取面目标结束321. 322. case23:/027323. /读取Measure形线目标开始324. 325. Fields&featureFields=pShpDataSet-GetFields();326. Feature*pFeature=newFeature(recordNumber,1,&featureFields);327. intarcMShapeType;328. fread(&arcMShapeType,sizeof(int),1,fpShp);329. 330. doubleobjMinX,objMinY,objMaxX,objMaxY;331. fread(&objMinX,sizeof(double),1,fpShp);332. fread(&objMinY,sizeof(double),1,fpShp);333. fread(&objMaxX,sizeof(double),1,fpShp);334. fread(&objMaxY,sizeof(double),1,fpShp);335. 336. GeoPolyline*pNewGeoLine=newGeoPolyline();337. doublewidth=objMaxX-objMinX;338. doubleheight=objMaxY-objMinY;339. pFeature-SetBound(objMinX,objMinY,width,height);340. 341. intnumParts,numPoints;342. fread(&numParts,sizeof(int),1,fpShp);343. fread(&numPoints,sizeof(int),1,fpShp);344. /存储各段线的起点索引345. int*startOfPart=newintnumParts;346. for(inti=0;iSetPointsCount(numParts);355. 356. for(i=0;iGetPoints(i);359. intcurPosIndex=startOfParti;360. intnextPosIndex=0;361. intcurPointCount=0;362. if(i=numParts-1)363. curPointCount=numPoints-curPosIndex;364. else365. 366. nextPosIndex=startOfParti+1;367. curPointCount=nextPosIndex-curPosIndex;368. 369. points.SetPointCount(curPointCount);370. /加载一条线段的坐标371. for(intiteratorPoint=0;iteratorPointSetGeometry(pNewGeoLine);389. this-LoadAttributeData(pFeature,fpDbf,everyRecordLen);390. pShpDataSet-AddRow(pFeature);391. 392. break;393. /读取Measure形线目标结束394. 395. 396. returnpShpDataSet;397. 一下为C#算法:直接读取SHAPE文件 2011-01-14 16:01转载!using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论