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

article/2025/10/7 23:52:51

本文将简单介绍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文件的常见目录如下图所示:

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

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

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

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

<project xmlns="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配置设置

// 指定文件的名字和路径
String strVectorFile = "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文件为例
String strDriverName = "ESRI Shapefile";
// 创建一个文件,根据strDriverName扩展名自动判断驱动类型org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);if (oDriver == null) {System.out.println(strDriverName + " 驱动不可用!\n");return;
}
DataSource dataSource = oDriver.Open(strVectorFile);

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

//Layer layer = dataSource.GetLayer("test");
Layer layer = dataSource.GetLayer(0);for(int i = 0;i<dataSource.GetLayerCount();i++) {Layer layerIdx = dataSource.GetLayer(i);System.out.println("图层名称:<==>" + layerIdx.GetName());
}String layerName = layer.GetName();
System.out.println("图层名称:" + layerName);
SpatialReference spatialReference = 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]);

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

FeatureDefn featureDefn = layer.GetLayerDefn();int fieldCount = featureDefn.GetFieldCount();Map<String,String> fieldMap = new HashMap<String,String>();
for (int i = 0; i < fieldCount; i++) {FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);// 得到属性字段类型int fieldType = fieldDefn.GetFieldType();String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);// 得到属性字段名称String fieldName = 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 (int i = 0; i < featureCount; i++) {Feature feature = layer.GetFeature(i);Object[] arr = fieldMap.values().toArray();for (int k = 0; k < arr.length; k++) {String fvalue = feature.GetFieldAsString(arr[k].toString());System.out.println(" 属性名称:" + arr[k].toString() + ",属性值:" + fvalue);}
}

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


http://chatgpt.dhexx.cn/article/gLAadS2Z.shtml

相关文章

全国矢量shp数据:行政区划,县界,道路,河流....都可下载

前段时间我们分享过一次全国矢量数据&#xff0c;包含道路&#xff0c;水系&#xff0c;铁路等等 不过第二天我们就把文章删除了 以至于后台不少留言问为啥删除 主要原因是数据精度稍微有点差&#xff08;部分数据偏差过大&#xff09; 不过 今天我们来重新分享 这次本着授…

为什么不太建议你通过 Python 去找工作?

有小伙伴问&#xff1a;我是一名大专生&#xff0c;学校把 Python 做为主语言教给我们&#xff0c;但是我也去了解过&#xff0c;其实 Python 门槛挺高的&#xff0c;所以我在自学 Java&#xff0c;但是我现在并不清楚到底要不要全心的去学 Java&#xff0c;学校里的课程也越来…

学Python真的好找工作吗?资深程序员为你解答

找工作难不难&#xff0c;主要还是看你自身的经验以及个人能力&#xff0c;如果决定学的话就要仔细去学习&#xff0c;而不是分散学习&#xff0c;这样既浪费了你的学习时间&#xff0c;又没有学到东西&#xff0c;尤其是大三即将毕业的同学,你只有其实不到一年的时间去学习,正…

【转行python】:简要说说python最好找工作的三个方向

前言 目前来说python最好找工作的三个方向&#xff1a;爬虫、数据分析和web开发。 之前我跟一些转行成功的朋友交流过&#xff0c;有一个朋友印象深刻&#xff0c;跟大家聊一下&#xff0c;朋友A某211研究生毕业&#xff0c;毕业后到了一家航空相关的企业上班&#xff0c;上了…

学Python好找工作吗?需要满足Python岗位哪些要求?

学Python好找工作吗&#xff1f;需要满足哪些要求&#xff1f;随着Python的火爆&#xff0c;国内Python的岗位也随之增多&#xff0c;只要技术能力强项目经验充足&#xff0c;找到工作不是问题。即使是一些二线城市&#xff0c;Python的薪资待遇也比较好。 一、学Python好找工作…

学习Python编程好找工作吗?

说起编程语言&#xff0c;不少人都会推荐学习Python&#xff0c;但很多人对Python不太了解&#xff0c;所以比较好奇“学习Python编程是否好找工作”&#xff0c;关于这个问题&#xff0c;小编通过下文为大家详细解答一下。 从市场情况来讲&#xff0c;Python职位比较多&…

学Python真的好找工作吗?工作多年的程序员为你解答

找工作难不难&#xff0c;主要还是看你自身的经验以及个人能力&#xff0c;如果决定学的话就要仔细去学习&#xff0c;而不是分散学习&#xff0c;这样既浪费了你的学习时间&#xff0c;又没有学到东西&#xff0c;尤其是大三即将毕业的同学,你只有其实不到一年的时间去学习,正…

Python虽然很火,为啥找工作这么难

知乎有人提了这么个问题&#xff0c;Python这么火&#xff0c;为啥找工作这么难呢? 这两年因为第三波人工智能热潮让 Python火了一把&#xff0c;让中小学生、非程序员(产品经理、运营)都加入到了学习Python的行列&#xff0c;那之前Python火吗? 虽然和Java、C这些大佬有差距…

学Python找工作你起码要会这些

要想通过自学Python并找到第一份工作应该做好以下几方面的事情&#xff1a; 第一&#xff1a;掌握Python的Web开发。 虽然Python目前在大数据、机器学习领域有大量的应用&#xff0c;但是掌握Python的Web开发依然是很有必要的&#xff0c;毕竟在生产环境下&#xff0c;Python…

对于你学了python是否可以找工作。

‘’’ Date: 2022-04-22 13:50:12 LastEditors: YuanPangZi LastEditTime: 2022-04-22 13:50:14 FilePath: \python_base\0_node_base\python_des.py ‘’’ 学python能找工作吗&#xff1f;需要计算机基础吗&#xff1f; 答案是**肯定的** 学python找工作这个事情 现在pyth…

Python虽然很火,为啥找工作这么难?

前几天看到某论坛有人提了这么个问题&#xff0c;Python这么火&#xff0c;为啥找工作这么难呢? 这两年因为第三波人工智能热潮让 Python火了一把&#xff0c;让中小学生、非程序员(产品经理、运营)都加入到了学习Python的行列&#xff0c;那之前Python火吗? 虽然和Java、C这…

扎心“我学了六个月 Python,怎么还是会找不到工作”

在编程界&#xff0c;Python是一种神奇的存在。有人认为&#xff0c;只有用Python才能优雅写代码&#xff0c;提高代码效率&#xff1b;但另一部分人恨不能把Python喷成筛子。那么&#xff0c;Python到底有没有用&#xff0c;为什么用Python找不到工作&#xff1f; Python到底能…

python这么火找不到工作_python工作太难找,python找不到工作原因。

python工作难找&#xff0c;是目前python发展的必然历程&#xff0c;因为python市场虽然有点火&#xff0c;但是市场却没有那么多的python职位提供。python专家急需&#xff0c;python新手却胜任不了。python基础岗位又太少了。我们一起来看一下。 1、python的工作难找原因之一…

Python学到什么程度才可以去找工作?掌握这4点足够了!

大家在学习Python的时候&#xff0c;有人会问“Python要学到什么程度才能出去找工作”&#xff0c;对于在Python培训机构学习Python的同学来说这都不是问题&#xff0c;因为按照Python课程大纲来&#xff0c;一般都不会有什么问题&#xff0c;而对于自学Python来说&#xff0c;…

去年那些口口声声说“学Python找不到工作”的人,今年为何被打脸?

最近在网上看到了一件比较有意思的事情&#xff0c;就是伴随着Python在TIOBE排行榜上多次超越了Java登上第2名的时候&#xff0c;去年口口声声说"不推荐学Python&#xff0c;学Python找不到工作"的一些博主&#xff0c;居然出现了剧情大转变&#xff0c;居然公然承认…

为什么我不建议你通过 Python 去找工作?

二哥&#xff0c;你好&#xff0c;我是一名大专生&#xff0c;学校把 Python 做为主语言教给我们&#xff0c;但是我也去了解过&#xff0c;其实 Python 门槛挺高的&#xff0c;所以我在自学 Java&#xff0c;但是我现在并不清楚到底要不要全心的去学 Java&#xff0c;学校里的…

学python为何不好找工作呢?

随着人工智能的大火&#xff0c;越来越多的人选择去学习Python编程语言&#xff0c;但是总会在网上看到有人吐槽学完Python找不到工作。 为什么会出现这种情况呢? 为什么会出现这种学习完Python编程语言却无法找到工作的情况呢? 虽然Python是一个当前十分热门的编程语言&am…

自学python能不能找到工作,学会了python好找工作吗

python学到什么程度可以就业 Python可以从事的岗位有很多&#xff0c;就业岗位不同&#xff0c;需要具备的技能不同&#xff0c;具体要求如下&#xff1a;阶段一&#xff1a;Python开发基础Python全栈开发与人工智能之Python开发基础知识学习内容包括&#xff1a;Python基础语…

学Python容易找工作嘛?

答案肯定是不难找啦&#xff0c;说不好找的只是在为自己没有学好再找借口&#xff0c;然后大喊“我待资本如初恋&#xff0c;资本虐我千百遍”&#xff01; 北上广作为流动人口最多的城市&#xff0c;我们就来看看这三个城市的Python岗位。这仅仅是在一个平台搜索了Python跳出来…

应届生自学Python两个月,为什么找不到工作?

今天我们来看一个同龄小伙伴自学Python的困惑&#xff0c;他自学了2个月Python就想找一份好工作&#xff0c;但是四处碰壁。对于这样的难题&#xff0c;我们来看看前辈们是如何解决的。 如果你想要学好python最好加入一个组织&#xff0c;这样大家学习的话就比较方便&#xff…