C++中怎么读取shapefile格式的文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中怎么读取shapefile格式的文件相关的知识,希望对你有一定的参考价值。

Shapefile文件是美国环境系统研究所(ESRI)所研制的GIS文件系统格式文件,是工业标准的矢量数据文件。

一个Shape文件包括三个文件:一个主文件(*.shp),一个索引文件(*.shx),和一个dBASE(*.dbf)表。主文件是一个直接存取,变长度记录的文件,其中每个记录描述构成一个地理特征(Feature)的所有vertices坐标值。在索引文件中,每条记录包含对应主文件记录距离主文件头开始的偏移量,dBASE表包含SHP文件中每一个Feature的特征属性,表中几何记录和属性数据之间的一一对应关系是基于记录数目的ID。在dBASE文件中的属性记录必须和主文件中的记录顺序是相同的。图形数据和属性数据通过索引号建立一一对应的关系。

在了解了文件格式之后,你可以使用任何一种C++的文件读取方法来读取并解析Shapefile(OpenFile、fopen、CFile、ifstream都是可以的),但文件的格式解析需要大量的自定义代码,这里篇幅限制就不一一列举了。


另外一种方法,就是使用各个地理信息系统(GIS)的组件支持来完成Shapefile的读取,比如基于ArcGIS  Silverlight  API的WebGIS系统,就可以很方便的类似数据库一样完成信息的提取:

       //获取拖放到地图上的文件信息  
       IDataObject dataObject = e.Data as IDataObject;  
       FileInfo[] files = dataObject.GetData(DataFormats.FileDrop) as FileInfo[];  
   
       //判断拖放的文件是否为.shp和.dbf  
       FileInfo shapeFile = null;  
       FileInfo dbfFile = null;  
       foreach (FileInfo fi in files)  
         
           if (fi.Extension.ToLower() == ".shp") shapeFile = fi;  
           if (fi.Extension.ToLower() == ".dbf") dbfFile = fi;  
         
   
       // 读取Shapefile数据   
       ShapeFile shapeFileReader = new ShapeFile();  
       if (shapeFile != null && dbfFile != null)  
         
           shapeFileReader.Read(shapeFile, dbfFile);  
         
       else  
         
           MessageBox.Show("请将.dbf和.shp文件同时拖放到地图上!");  
           return;  
         
   
       IList<Graphic> lstGraphics = new List<Graphic>();  
       foreach (ShapeFileRecord record in shapeFileReader.Records)  
         
           //将从Shapefile中读取的记录转换为Graphic  
           Graphic graphic = record.ToPointGraphic();  
           if (graphic != null) lstGraphics.Add(graphic);  
         
   
       // 如果空间参考不一致,可能需要投影  
       if (lstGraphics.Count > 0)  
         
           GeometryService projectTask = new GeometryService("http://localhost/arcgis/rest/services/Geometry/GeometryServer");  
           projectTask.ProjectCompleted += new EventHandler<GraphicsEventArgs>(projectTask_ProjectCompleted);  
           projectTask.Failed += new EventHandler<TaskFailedEventArgs>(projectTask_Failed);  
   
           //将平面坐标转换为经纬度  
           projectTask.ProjectAsync(lstGraphics, myMap.SpatialReference);  
       

参考技术A 首先你需要知道文件的格式,是二进制文件还是文本文件。
ifstream fin("input.dat"); //读取文本文件
ifstream fin("input.dat", ios::binary); //读取二进制文件
读写操作:
ifstream fin("data.dat", iso::binary);
int a;
float b[4];
fin.read(((char *)(&a)), sizeof(int));
fin.read(((char *)(b)), sizeof(float)*4);
fin.close();

ofstream fout("data.dat", iso::binary);
int a = 3;
float b[4] = 0.1, 0.2, 0.3, 0.4;
fout.write(((char *)(&a)), sizeof(int));
fout.write(((char *)(b)), sizeof(float)*4);
fout.close();
参考技术B 都可以用fopen,fread()和CFile file.read()

ArcGIS微课1000例0019:什么是Shapefile文件?Shapefile文件之全解

文章目录


ESRI Shapefile(shp),或简称shapefile,是美国环境系统研究所公司(ESRI)开发的一种空间数据开放格式。该文件格式已经成为了地理信息软件界的一个开放标准,这表明ESRI公司在全球的地理信息系统市场的重要性。Shapefile也是一种重要的交换格式,它能够在ESRI与其他公司的产品之间进行数据互操作。

Shapefile文件用于描述几何体对象:点,折线与多边形。例如,Shapefile文件可以存储井、河流、湖泊等空间对象的几何位置。除了几何位置,shp文件也可以存储这些空间对象的属性,例如一条河流的名字,一个城市的温度等等。

以上是关于C++中怎么读取shapefile格式的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何用python读取arcgis中shapefile文件的属性表?可以输出为excel格式吗

GIS开发Esri Shapefile(.shp)矢量数据文件读取(C++Python)

如何用python读取arcgis中shapefile文件的属性表

JAVA用geotools读取shape格式文件

地理空间云怎么找矢量图

从多个文件夹中读取 shapefile