读取shapefile文件 (读取shapefile格式的文件的方法 使用C)
编号:1221 分类:互联网资讯 阅读: 时间:2024-02-02

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

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

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

另外一种方法,就是使用各个地理信息系统(GIS)的组件支持来完成Shapefile的读取,比如基于ArcGISSilverlightAPI的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)
{ 读取shapefile文件
shapeFileReader.Read(shapeFile, dbfFile);
}
else
{
MessageBox.Show("请将.dbf和.shp文件同时拖放到地图上!");
return;
}
IList lstGraphics = new List ();
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();
projectTask.ProjectAsync(lstGraphics, myMap.SpatialReference);
}

网址推荐 网址推荐