使用Java基于GeoTools读取Shapefile矢量数据属性信息-以某市POI数据为例

前言

        在之前的博客中,我们讲过在GDAL中如何读取空间数据的属性和数据信息,也简单的讲过如何在GeoTools中读取Shapefile文件的属性信息和数据信息。对于空间矢量数据库,就像我们传统的二维数据库的表字段和表数据的关系,在研究表数据的存储和检索时,通常会配套进行空间表表结构的设计。众所周知,在关系型数据库中,关于数据库物理模型的建设至关重要,因此在空间数据存储也是同样的重要。

        本文主要研究使用Java开发语言基于GeoTools地理开发组件来进行空间矢量数据如Shapefile的属性信息的读取,文章首先介绍如何使用GeoTools来打开一个shp文件,在QGIS中展示原始数据的相关信息,然后讲解如何通过GeoTools获取shp文件的空间参考,接着讲解根据空间参考获取我们常见的空间参考编码和代号,其次讲解如何获取空间数据的属性字段。通过本文,您可以了解和掌握如何利用GeoTools来进行Shapefile的属性信息的读取。

一、空间数据说明

        最近开始研究POI数据,因此从互联网获取了POI数据,想实现POI数据的空间分布分析。具体使用POI数据来进行空间属性信息的读取演示。为了让大家对POI数据有一定的了解,这里对POI数据进行一个介绍。

1、空间参考

        这里使用的POI数据是2020年形成长沙市的POI数据,时间过去4年,在时间上有一定的时效性不足,但是不影响我们的学习使用。我们使用Qgis软件打开上面的POI信息之后,我们可以打开数据信息看一下它的空间参考。

        通过上面的截图就可以了解这份空间矢量数据的基础信息,如下表所示: 

序号参数说明
1

编码

UTF-8
2几何图形

Point (Point)

3

坐标参照系(CRS)

EPSG:4490 - China Geodetic Coordinate System 2000 - 地理的

4范围

111.9064691681707870,27.8943275145980074 : 114.2292192675388947,28.6342571928722691

5单位
6要素数量

1848

        以上就是空间参考和编码等基础信息。

2、空间属性字段

        在了解了POI数据的基本信息后,我们还需要了解shapefile的的属性信息,这就好比是关系型数据库的字段,需要维护物理模型。因此这里对POI数据涉及的属性字段进行介绍,为下一步的空间物理建模奠定基础。这里依然以QGIS为例,我们在QGIS中可以打开空间数据的字段表,如下所示:

        为了更好的给大家展示这些POI数据,特意将数据集列表的数据进行示例数据的展示,在QGIS鼠标点击右键,打开属性表,可以看到以下的数据:

        以上是对空数据的属性字段和示例数据进行简单介绍。到此本小节的内容介绍完毕,后面将介绍如何使用GeoTools来进行相关编码、空间参考坐标、属性表格的信息读取。 

 二、Geotools读取空间数据属性信息

        在了解了以上的POI空间信息之后,下面我们调用GeoTools来进行空间数据的属性信息的读取。包括如何加载shp文件、如何获取空间数据的空间参考以及如何获取矢量数据的属性信息列表,如属性名等信息。

1、如何加载空间信息

        在介绍如何使用GeoTools来进行空间信息加载时,必须要介绍必须要设置的Pom.xml来加载相关的依赖,关于Geotools的相关引用如下所示,为了节约篇幅,这里仅列出关键部分:

<dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-swing</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-main</artifactId><version>${geotools.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.geotools.xsd/gt-xsd-sld --><dependency><groupId>org.geotools.xsd</groupId><artifactId>gt-xsd-sld</artifactId><version>${geotools.version}</version><!--  <version>31.3</version><scope>test</scope>--></dependency><!-- https://mvnrepository.com/artifact/org.geotools.xsd/gt-xsd-core --><dependency><groupId>org.geotools.xsd</groupId><artifactId>gt-xsd-core</artifactId><version>${geotools.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.geotools/gt-xml --><dependency><groupId>org.geotools</groupId><artifactId>gt-xml</artifactId><version>${geotools.version}</version></dependency>

        在Java中读取Shapefile的方式有几种,这里分享一种方式,后面我们可以详细的来介绍不同的打开方式,其实大致的原理都是差不多的。

2、关于空间参考

        这里想分享一个注意的地方,众所周知,在空间计算中,空间参考是一个很重要的标准。我们很多的空间分析都是建立在空间参考之上的。因此首先来介绍一下空间参考信息,首先我们先不修改上面的maven引用,您也可以直接在代码中执行以下的代码:

/**
* gt-epsg-hsql 这里一定要引入epsg的包,这样才能读取相关的信息,否则报错
* 
* @throws NoSuchAuthorityCodeException
* @throws FactoryException
*/
@Test
public void testEpsg() throws NoSuchAuthorityCodeException, FactoryException {CoordinateReferenceSystem tCrs = CRS.decode("EPSG:4490");System.out.println(tCrs);System.out.println("*************************************************");String code = CRS.lookupIdentifier(tCrs, true);System.out.println("code==>" + code);System.out.println("**************************************************");Integer epsgCode = CRS.lookupEpsgCode(tCrs, true);if (epsgCode != null) {System.out.println("EPSG Code: " + epsgCode);} else {System.out.println("EPSG Code not found.");}
}

        这里是获取默认的4490的EPSG空间参考,同时可以获取它对应的代码如:EPSG:4490。运行上述的代码之后,我们发现控制台并没有进行正常的展示,会报以下的错误。

        详细的错误信息如下:

org.opengis.referencing.NoSuchAuthorityCodeException: No code "EPSG:4490" from authority "EPSG" found for object of type "EngineeringCRS".at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.noSuchAuthorityException(CartesianAuthorityFactory.java:140)at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.createEngineeringCRS(CartesianAuthorityFactory.java:132)at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.createCoordinateReferenceSystem(CartesianAuthorityFactory.java:123)at org.geotools.referencing.factory.AuthorityFactoryAdapter.createCoordinateReferenceSystem(AuthorityFactoryAdapter.java:811)at org.geotools.referencing.factory.ThreadedAuthorityFactory.createCoordinateReferenceSystem(ThreadedAuthorityFactory.java:667)at org.geotools.referencing.DefaultAuthorityFactory.createCoordinateReferenceSystem(DefaultAuthorityFactory.java:178)at org.geotools.referencing.CRS.decode(CRS.java:538)at org.geotools.referencing.CRS.decode(CRS.java:459)at com.yelang.project.geotools.TestReadPoiShpWriter2Db.testEpsg(TestReadPoiShpWriter2Db.java:216)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.ParentRunner.run(ParentRunner.java:413)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

        如果你也遇到这个问题,只需要在pom.xml中加入如下依赖:

<!--  增加epsg支持 -->
<dependency><groupId>org.geotools</groupId><artifactId>gt-epsg-hsql</artifactId><version>${geotools.version}</version>
</dependency> 

        在此运行,可以在控制台看到问题解决了。

GEOGCS["China Geodetic Coordinate System 2000", DATUM["China 2000", SPHEROID["CGCS2000", 6378137.0, 298.257222101, AUTHORITY["EPSG","1024"]], AUTHORITY["EPSG","1043"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic latitude", NORTH], AXIS["Geodetic longitude", EAST], AUTHORITY["EPSG","4490"]]
*************************************************
code==>EPSG:4490
**************************************************
EPSG Code: 4490

3、加载shp文件

        这里讲解如何加载shp文件,geotools中加载shp文件的方法很多,这里分享一种方式,关键代码如下所示:

// 指定Shapefile的文件路径
String shpFile = "C:/BaiduDownload/长沙市2020年POI数据集/长沙市2020年POI数据集/长沙POI数据(.shp)/风景名胜.shp";
FileDataStore dataStore = FileDataStoreFinder.getDataStore(new File(shpFile));ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpFile).toURI().toURL());
System.out.println(shapefileDataStore.getCharset());
String[] typeNames = dataStore.getTypeNames();
System.out.println(typeNames.length);
for (String type : typeNames) {System.out.println(type);
}

        我们通过FileDataStore来加载shp数据,然后通过ShapefileDataStore来设置文件的字符编码。然后我们通过getTypeNames来获取图层信息。

4、属性字段的读取

        在GeoTools中,使用SimpleFeatureType对象类获取矢量数据的属性描述信息,下面讲解如何使用GeoTools来读取矢量信息的属性字段。完整的代码如下:

@Test
public void readShpAttr() throws IOException, FactoryException {// 指定Shapefile的文件路径String shpFile = "C:/BaiduDownload/长沙市2020年POI数据集/长沙市2020年POI数据集/长沙POI数据(.shp)/风景名胜.shp";FileDataStore dataStore = FileDataStoreFinder.getDataStore(new File(shpFile));ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpFile).toURI().toURL());System.out.println(shapefileDataStore.getCharset());String[] typeNames = dataStore.getTypeNames();System.out.println(typeNames.length);for (String type : typeNames) {System.out.println(type);}// 获取特征类型SimpleFeatureType featureType = dataStore.getSchema(dataStore.getTypeNames()[0]);CoordinateReferenceSystem crs = featureType.getGeometryDescriptor().getCoordinateReferenceSystem();System.out.println("坐标参考系统:" + crs);// 获取SRIDString code = CRS.lookupIdentifier(crs, true);System.out.println("EPSG CODE :" + code);// 获取属性名List<String> attributeNames = featureType.getAttributeDescriptors().stream().map(attr -> attr.getLocalName()).collect(Collectors.toList());System.out.println("Attributes: " + attributeNames);System.out.println("以下是属性信息的深度解析:--------------------------------------");List<AttributeDescriptor> attrDescList = featureType.getAttributeDescriptors();System.out.println(attrDescList.size());for (AttributeDescriptor attrDesc : attrDescList) {System.out.println(attrDesc);System.out.println("属性详情:");AttributeType attrType = attrDesc.getType();System.out.println(attrType);System.out.println("name=" + attrDesc.getName() + "\tLocalName=" + attrDesc.getLocalName() + "\t"+ attrDesc.getMaxOccurs() + "\t" + attrDesc.getMinOccurs());System.out.println("UserData" + attrDesc.getUserData());}
}

        可以看到,上面读取的信息与在QGIS中展示的信息是一致的,说明我们已经成功的读取了POI数据的空间参考、属性信息等重要信息。

 三、总结

        以上就是本文的主要内容,本文主要研究使用Java开发语言基于GeoTools地理开发组件来进行空间矢量数据如Shapefile的属性信息的读取,文章首先介绍如何使用GeoTools来打开一个shp文件,在QGIS中展示原始数据的相关信息,然后讲解如何通过GeoTools获取shp文件的空间参考,接着讲解根据空间参考获取我们常见的空间参考编码和代号,其次讲解如何获取空间数据的属性字段。通过本文,您可以了解和掌握如何利用GeoTools来进行Shapefile的属性信息的读取。行文仓促,定有不足之处,如有不足,还请各位专家博主在评论区留下真知灼见,不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544765.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[大语言模型-论文精读] ACL2024-长尾知识在检索增强型大型语言模型中的作用

ACL2024-长尾知识在检索增强型大型语言模型中的作用 On the Role of Long-tail Knowledge in Retrieval Augmented Large Language Models Authors: Dongyang Li, Junbing Yan, Taolin Zhang, Chengyu Wang, Xiaofeng He, Longtao Huang, Hui Xue, Jun Huang 1.概览 问题解决&…

引领开放式耳机革命,南卡新品再次霸榜音质和舒适度TOP1!

​随着科技的不断进步&#xff0c;消费者对于耳机的需求已经不仅仅局限于基本的听觉体验&#xff0c;而是追求更加舒适、个性化的聆听感受。南卡科技推出的Ultra夹耳开放式蓝牙耳机&#xff0c;以其创新的设计和卓越的音质&#xff0c;为用户带来了全新的听觉盛宴。 南卡科技&a…

【Linux探索学习】第一弹——Linux的基本指令(上)——开启Linux学习第一篇

前言&#xff1a; 在进入Linux学习之前&#xff0c;我们首先要先做好以下两点&#xff1a;1、已经基本掌握C语言或C&#xff0c;2、已经配置好了Linux的环境&#xff0c;做完以上两点后我们就开始Linux的学习&#xff0c;今天我们首先要学习的就是Linux中最基础的操作&#xff…

Python自动化测试之unittest框架

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架&#xff0c;框架是一个半成品&#xff0c;框架是对常用的功能&#xff0c;基础的代码进行封装的一个工具&#xff0c;这个工具对外提供了一些API&#xff0c;其他的开发者只需要调用框架的接口即可&#xff…

C++语言桌面应用开发GTK3 Gtkmm3 Glade

文章目录 Gikmm 简介安装 Gtkmm安装 GTK安装 Gladedemo.glade 文件完整示例 demo.cpp编译运行GTK 主题推荐主题 Gikmm 简介 Gtkmm 是一个用于创建图形用户界面&#xff08;GUI&#xff09;的 C 库&#xff0c;它是基于流行的 GTK 库的。GTK 是一个跨平台的 GUI 工具包&#xff…

HTML5基本概念及其基本框架

HTML是超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用来结构化 Web 网页及其内容的标记语言。网页内容可以是&#xff1a;一组段落、一个重点信息列表、也可以含有图片和数据表。 H5的DOCTYPE的声…

新手操作指引:快速上手腾讯混元大模型

引言 腾讯混元大模型是一款功能强大的AI工具&#xff0c;适用于文本生成、图像创作和视频生成等多种应用场景。对于新手用户&#xff0c;快速上手并充分利用这一工具可能会有些挑战。本文将提供详细的新手操作指引&#xff0c;帮助您轻松开始使用腾讯混元大模型。 步骤一&…

PyTorch模型转ONNX量化模型

你是否发现模型太大&#xff0c;无法部署在你想要的云服务上&#xff1f;或者你是否发现 TensorFlow 和 PyTorch 等框架对于你的云服务来说太臃肿了&#xff1f;ONNX Runtime 可能是你的救星。 如果你的模型在 PyTorch 中&#xff0c;你可以轻松地在 Python 中将其转换为 ONNX…

智能感知,主动防御:移动云态势感知为政企安全护航

数字化时代&#xff0c;网络安全已成为企业持续运营和发展的重要基石。随着业务扩展&#xff0c;企业资产的数量急剧增加&#xff0c;且分布日益分散&#xff0c;如何全面、准确地掌握和管理资产成为众多政企单位的难题。同时&#xff0c;传统安全手段又难以有效应对新型、隐蔽…

你的提交信息还在拖后腿?看这里,提升代码质量的绝招!

文章目录 前言一、什么是约定式提交&#xff1f;二、创建新仓库三、将代码推送到远程仓库的步骤1.检查当前远程仓库2.添加代码到暂存区3. 进行约定式提交4. 推送代码到远程仓库5. 完成推送 总结 前言 在当今软件开发领域&#xff0c;Git已经成为最广泛使用的版本控制系统之一。…

二阶滤波算法总结(对RC滤波算法整理的部分修正和完善)

文章目录 1、一阶低通滤波2、一阶高通滤波3、二阶低通滤波器3.1 二阶RC低通滤波器的连续域数学模型3.2 二阶RC低通滤波器的算法推导3.3 matlab仿真 4、二阶高通滤波器4.1 二阶RC高通滤波器的连续域数学模型4.2 二阶RC高通滤波器的算法推导4.3 matlab仿真 5、陷波滤波6、带通滤波…

白杨SEO:从小红书、抖音图文再到小绿书,为什么现在制作图文内容搞SEO搜索精准流量更容易?

前言&#xff1a;为什么想到写这个&#xff1f;上周参加了一个杭州公司游学&#xff0c;发现大家现在做SEO精准流量都在用图文方式来搞了&#xff0c;还有做小绿书也越来越多了&#xff0c;所以分享给大家&#xff0c;看完对大家有一些启发。 文章大纲&#xff1a; 1、图文是什…

2024年AI技术爆发的元年,用对工具,让你副业比主业赚得多!

大家好&#xff0c;我是强哥 文字的力量不容小觑&#xff0c;或许你没有多好的文笔&#xff0c;或许你已经很久没有拿笔写字了&#xff0c;但是没关系&#xff0c;我们有工具&#xff01; AI时代的到来&#xff0c;不会用工具&#xff0c;那你可就OUT了 如果你觉得文字不能赚…

产业报告丨2024中国AI大模型场景探索及产业应用调研报告(附下载)

前言 AI大模型是指在机器学习和深度学习领域中&#xff0c;采用大规模参数&#xff08;至少在一亿个参数以上&#xff09;的神经网络模型&#xff0c;AI大模型在训练过程中需要依赖大量的算力和高质量的数据资源。2024年&#xff0c;AI大模型的行业应用与技术发展正有效提升千…

2024年 AI大模型我该买一张什么卡?

有钱啥也不用说&#xff0c;买张最贵的就是了。对囊中羞涩的我还说&#xff0c;我该买张什么样的显卡呢&#xff1f; 我的旧显卡RTX1060 6G&#xff0c;满负荷消耗功率110多瓦&#xff0c;几乎达到设计最大TDP&#xff0c;周日时拿了朋友的RTX3060Ti 8G&#xff0c;发现是锁算…

Kaggle-狗种类的识别(Pytorch框架)基本图像识别流程

狗类别实现过程 一. 将数据集按标签分类&#xff0c;将标签转换为数字表示&#xff0c;并制作数据集 二. 搭建网络框架&#xff0c;inception&#xff0c;或者ResNet 三. 选择优化函数&#xff0c;训练模型 数据集制作 首先分析数据集&#xff0c;题中已经很明确告诉有120 种…

【2024W32】肖恩技术周刊(第 10 期):太阳神鸟

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

LeetCode 刷题基础Ⅰ -- 基础语法

c 基础语法&#xff0c;LeetCode 刷题用 学习网站一、顺序结构基本数据类型① 整型 int② 长整型 long③ 浮点型 double④类型转换 输入输出① getchar 吸收回车符② 数学函数③ 最大值的定义 二、选择结构① switch 三、数组① 初始化② 输入③ 方法 四、结构体① 自定义结构体…

UE5地图白屏/过曝/非常亮の解决方法

今天遇到一个问题 , 新建项目 , 打开虚幻第三人称地图的默认关卡 , 发现白屏 , 啥也看不见 猜测可能是虚幻编辑器的bug , 造成白屏的原因应该是场景过曝了 记录一下解决方案 第一种解决方法 找到场景中的 后期处理体积 (PostProcessVolume) 直接删掉 或者找到 细节面板中 -…

【Transformers基础入门篇5】基础组件之Datasets

文章目录 一、简介二、Datasets基本使用2.1 加载在线数据集&#xff08;load_dataset&#xff09;2.2 加载数据集某一项任务&#xff08;load_dataset&#xff09;2.3 按照数据集划分进行加载&#xff08;load_dataset&#xff09;2.4 查看数据集&#xff08;index and slice&a…