gis利器之Gdal(二)shp数据读取

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 本文首先简单介绍了空间数据shp数据的基本知识,其常见的文件组成形式。使用qgis软件对数据进行常规预览,最后重点介绍了使用gdal对矢量信息进行读取,​包括空间信息和属性信息

     本文将简单介绍shp数据的基本知识,以java语言为例,介绍如何基于java调用gdal完成对shp数据的解析,主要包括空间信息解析、属性信息解析、空间参考信息解析,bbox信息解析等等。

     shp文件是一种矢量图形存储文件,可以用于记录矢量数据的空间位置及属性信息。shp是arcgis的常见数据格式,当前,现在许多的开源库也是可以解析的,包括本文要介绍的gdal和geotools都是具备这种能力的。

     SHP文件是一种比较原始的矢量数据存储方式,它仅仅能够存储几何体的位置数据,而无法在一个文件之中同时存储这些几何体的属性数据。因此,SHP文件还必须附带一个二维表用于存储文件中每个几何体的属性信息。SHP文件中许多几何体能够代表复杂的地理事物,并为他们提供强大而精确的计算能力。

     SHP文件指的是一种文件存储的方法,实际上该种文件格式是由多个文件组成的。其中,要组成一个SHP文件,有三个文件是必不可少的,它们分别是".shp", ".shx"与 ".dbf" 文件。表示同一数据的一组文件其文件名前缀应该相同。例如,存储一个关于湖的几何与属性数据,就必须有lake.shp,lake.shx与 lake.dbf三个文件。而其中“真正”的Shapefile的后缀为shp,然而仅有这个文件数据是不完整的,必须要把其他两个附带上才能构成一组完整的地理数据。除了这三个必需的文件以外,还有八个可选的文件,使用它们可以增强空间数据的表达能力。所有的文件名都必须遵循MS DOS的8.3文件名标准(文件前缀名8个字符,后缀名3个字符,如shapefil.shp),以方便与一些老的应用程序保持兼容性,尽管现在许多新的程序都能够支持长文件名。此外,所有的文件都必须位于同一个目录之中。

     shp文件的常见目录如下图所示:

image.png

使用QGIS打开shp数据后可以看到空间信息和属性信息如下:

image.png

image.png

这里看到的乱码,设置好编码后即可。

下面使用gdal解析以上信息。

第一步、新建maven工程,pom.xml配置如下:

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yelang</groupId><artifactId>gdal_demo1</artifactId><version>0.0.1-SNAPSHOT</version><name>gdal_demo1</name><description>gdal的第一次试验</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>3.4.3</version><scope>system</scope><systemPath>${project.basedir}/lib/gdal.jar</systemPath></dependency><dependency><groupId>net.sf.ucanaccess</groupId><artifactId>ucanaccess</artifactId><version>4.0.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies></project>

第二步、ogr全局注册和gdal配置设置

// 指定文件的名字和路径StringstrVectorFile="F:\\vector_data\\道路中心线.shp";
// 注册所有的驱动ogr.RegisterAll();
// 为了支持中文路径,请添加下面这句代码gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
// 为了使属性表字段支持中文,请添加下面这句gdal.SetConfigOption("SHAPE_ENCODING", "CP936");

以上设置,不管是操作shp还是其它矢量数据,基本上是必需流程,采用RegisterAll()注册驱动,使用SetConfigOption进行关键参数设置。

第三步、获取shp驱动,打开shp文件。

// 读取数据,这里以ESRI的shp文件为例StringstrDriverName="ESRI Shapefile";
// 创建一个文件,根据strDriverName扩展名自动判断驱动类型org.gdal.ogr.DriveroDriver=ogr.GetDriverByName(strDriverName);
if (oDriver==null) {
System.out.println(strDriverName+" 驱动不可用!\n");
return;
}
DataSourcedataSource=oDriver.Open(strVectorFile);

第四步、获取图层、空间参考、图层范围

//Layer layer = dataSource.GetLayer("test");Layerlayer=dataSource.GetLayer(0);
for(inti=0;i<dataSource.GetLayerCount();i++) {
LayerlayerIdx=dataSource.GetLayer(i);
System.out.println("图层名称:<==>"+layerIdx.GetName());
}
StringlayerName=layer.GetName();
System.out.println("图层名称:"+layerName);
SpatialReferencespatialReference=layer.GetSpatialRef();
//System.out.println(spatialReference);System.out.println("空间参考坐标系:"+spatialReference.GetAttrValue("AUTHORITY", 0)
+spatialReference.GetAttrValue("AUTHORITY", 1));
double[] layerExtent=layer.GetExtent();
System.out.println("图层范围:minx:"+layerExtent[0] +",maxx:"+layerExtent[1] +",miny:"+layerExtent[2] +",maxy:"+layerExtent[3]);

image.png

第五步、获取图层属性信息

FeatureDefnfeatureDefn=layer.GetLayerDefn();
intfieldCount=featureDefn.GetFieldCount();
Map<String,String>fieldMap=newHashMap<String,String>();
for (inti=0; i<fieldCount; i++) {
FieldDefnfieldDefn=featureDefn.GetFieldDefn(i);
// 得到属性字段类型intfieldType=fieldDefn.GetFieldType();
StringfieldTypeName=fieldDefn.GetFieldTypeName(fieldType);
// 得到属性字段名称StringfieldName=fieldDefn.GetName();
fieldMap.put(fieldTypeName, fieldName);
}
System.out.println(fieldMap);

输出如下:

{Integer=OBJECTID, Real=SHAPE_Leng, String=GB, Date=Date_}

第六步、读取空间空间信息及属性列表

System.out.println(layer.GetFeature(1).GetGeometryRef().ExportToJson());
System.out.println(layer.GetFeature(2).GetGeometryRef().ExportToJson());
System.out.println(layer.GetFeature(3).GetGeometryRef().ExportToJson());
for (inti=0; i<featureCount; i++) {
Featurefeature=layer.GetFeature(i);
Object[] arr=fieldMap.values().toArray();
for (intk=0; k<arr.length; k++) {
Stringfvalue=feature.GetFieldAsString(arr[k].toString());
System.out.println(" 属性名称:"+arr[k].toString() +",属性值:"+fvalue);
    }
}

image.png

小结:本文首先简单介绍了空间数据shp数据的基本知识,其常见的文件组成形式。使用qgis软件对数据进行常规预览,最后重点介绍了使用gdal对矢量信息进行读取,包括空间信息和属性信息,希望本文对你有帮助。

目录
相关文章
|
存储 JSON 关系型数据库
基于GeoTools的GeoJson导入到PostGis实战
GeoJson是一种对各种地理数据结构进行编码的格式,基于json的地理空间信息数据交换格式。GeoJson对象可以用来表示几何,特征或者特征集合。支持地理点、线、面、多点、多线、多面及几何集合。GeoJson不是本文的重点,因此不再赘述。
1768 0
基于GeoTools的GeoJson导入到PostGis实战
|
定位技术
【gis】gdal 切分遥感 tif 格式图片
【gis】gdal 切分遥感 tif 格式图片
575 0
【gis】gdal 切分遥感 tif 格式图片
|
9天前
|
存储 算法 数据处理
Pandas高级数据处理:数据压缩与解压
本文介绍 Pandas 中的数据压缩与解压技术,探讨其在大数据集存储、远程传输和备份归档中的应用场景。Pandas 支持多种压缩格式(如 `.gzip`、`.bz2`、`.zip`),通过 `compression` 参数轻松实现数据的压缩与解压。文中还提供了常见问题的解决方案,如文件扩展名不匹配、内存不足和性能优化,并介绍了自动检测压缩格式和组合压缩加密的高级技巧。掌握这些功能可显著提升数据处理效率。
42 20
|
6月前
|
数据可视化 算法 数据挖掘
基于geopandas的空间数据分析-深入浅出分层设色
基于geopandas的空间数据分析-深入浅出分层设色
84 2
|
7月前
|
数据采集 消息中间件 数据可视化
无代码玩转GIS应用,我也在行
无代码玩转GIS应用,我也在行
56 0
|
9月前
|
人工智能 数据可视化 定位技术
【工具使用】QGIS导入csv文件进行数据可视化
【工具使用】QGIS导入csv文件进行数据可视化
363 0
|
API C++ Python
Fiona简介及Shapefile数据读取
用GDAL的Python绑定API书写程序有没有一种仍然在写C/C++的感觉,Fiona基于GDAL提供了更加Pythonic的读取空间矢量数据的API,参见:http://toblerity.org/fiona/index.html
130 0
|
存储 JSON 前端开发
GIS开发:GeoJSON文件压缩
GIS开发:GeoJSON文件压缩
750 0
|
算法 定位技术 Apache
GIS开发:echarts的GeoJSON文件压缩
GIS开发:echarts的GeoJSON文件压缩
442 0
|
数据可视化 定位技术 数据处理
使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化
使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化
869 0