使用Geotools中的原始方法来操作PostGIS空间数据库

目录

前言

一、原生PostGIS连接介绍

1、连接参数说明

2、创建DataStore

二、工程实战

1、Maven Pom.xml定义

2、空间数据库表

3、读取空间表的数据

三、总结


前言

        在当今数字化与信息化飞速发展的时代,空间数据的处理与分析已成为众多领域不可或缺的一环。从城市规划到环境监测,从物流配送到灾害预警,空间数据的应用场景无处不在。PostGIS 作为一款功能强大的开源空间数据库扩展,为存储、管理和分析地理空间数据提供了坚实的基础设施。而 Geotools 作为 Java 领域中广泛使用的地理信息工具库,为开发者搭建了一座连接空间数据与应用程序的桥梁。本文将深入探讨如何使用 Geotools 中的原始方法来操作 PostGIS 空间数据库,旨在为地理信息开发者提供一套系统、全面且实用的技术指南。

        随着地理信息系统(GIS)技术的普及,越来越多的行业开始依赖空间数据来驱动决策。PostGIS 以其对 OpenGIS 标准的全面支持和强大的空间数据处理能力,成为了许多 GIS 应用的首选数据库。它不仅能够存储复杂的几何和地理数据类型,还能执行高效的空间查询与分析操作。然而,要充分发挥 PostGIS 的潜力,开发者需要一种高效、灵活且易于集成的工具来与之交互。Geotools 正是这样一款工具,它提供了丰富的 API 和功能模块,使得开发者能够以面向对象的方式操作空间数据。

        在Geotools的官方方法中提供了直接调用 PostGIS 的底层功能。通过Geotools 提供的原始方法接口,允许开发者深入到 PostGIS 的核心操作层面。通过这些方法,开发者可以精确地控制数据的读取、写入、查询和更新过程,从而实现高度定制化的空间数据处理流程。例如在复杂的空间分析任务中,原始方法可以更灵活地组合多种空间操作。

        掌握 Geotools 中的原始方法来操作 PostGIS,不仅能够提升开发效率,还能拓展应用程序的功能边界。对于地理信息开发者而言,这是一种不可或缺的技能。本文将从 PostGIS 和 Geotools 的基础概念入手,逐步深入到原始方法的具体实现与应用案例。通过详细的代码示例和操作流程,读者将能够全面了解如何利用 Geotools 与 PostGIS 进行高效的空间数据交互,为构建复杂的空间数据应用奠定坚实的基础。无论是在科研项目中探索空间数据的深度分析,还是在商业应用中实现地理信息的高效管理,本文所提供的技术方法都将具有重要的参考价值。

一、原生PostGIS连接介绍

        为了方便第一次查阅本文的朋友对Geotools中对PostGIS进行原生处理进行介绍。首先还是对原生PostGIS的连接进行介绍,首先对连接参数进行说明,其次提供一个根据连接参数创建爱DataStore的示例,让大家对数据的处理有所了解。

1、连接参数说明

        Geotools中直连PostGIS的连接参数如下:

参数描述
dbtype必须是字符串 postgis
host要连接的机器名或 IP 地址
port要连接的端口号,默认为 5432
schema要访问的数据库模式
database要连接的数据库
user用户名
passwd密码
preparedStatements使用预编译语句
encode functions编码函数

        除了上面的标准配置参数意外,Geotools还提供了其它的高级参数,参数列表如下:

参数描述
loose bbox控制宽松 bbox 比较的标志,默认为 true
preparedStatements控制是否使用预编译语句,默认为 false
encode functions控制是否可以将一些常见函数编码为它们的 SQL 等价物

        默认情况下,JsonArrayContains 函数将委托给 @> 操作符。但对于 PostgreSQL 版本 >= 12,它将委托给 jsonPathExists 函数。jsonPathExists 能够在根级别数组中搜索值。大家可以根据自己的需要来添加这些参数到参数Map中,

params.put(PostgisNGDataStoreFactory.LOOSEBBOX, true );
params.put(PostgisNGDataStoreFactory.PREPARED_STATEMENTS, true );

2、创建DataStore

        上面介绍了使用原生的方式来操作PostGIS的连接参数信息,在掌握了以上信息之后,我们基于上面的连接参数来返回DataStore,并以此来获取空间库中的物理表信息的读取方法。创建DataStore的方法代码如下所示:

Map<String, Object> params = new HashMap<>();
params.put("dbtype", "postgis");
params.put("host", "localhost");
params.put("port", 5432);
params.put("schema", "public");
params.put("database", "database");
params.put("user", "postgres");
params.put("passwd", "postgres");
params.put("preparedStatements", true);
params.put("encode functions", true);
DataStore dataStore = DataStoreFinder.getDataStore(params);

二、工程实战

        本节将重点介绍如何在工程实战中来进行读取一个PostGIS的空间表,通过空间表的属性字段来进行过滤,返回我们预期的空间数据,通过这个例子大家可以掌握如何使用Geotools对PostGIS的原生操作方法。本节将从以下三个方面进行讲解,第一个方面是介绍需要引入的Maven资源库,其次是介绍一下相关的空间数据库表信息,最后提供一个实战源码,可以真实读取空间表的数据信息,包括属性信息和空间矢量信息。

1、Maven Pom.xml定义

        要想在项目工程中使用原生的方式以来操作PostGIS数据库,首先需要创建数据库的连接,与传统的数据库连接创建方式不一样,在Geotools中需要使用一个Map对象来缓存相关的连接,因此,需要引入的Pom.xml定义如下:

<dependency><groupId>org.geotools.jdbc</groupId><artifactId>gt-jdbc-postgis</artifactId><version>${geotools.version}</version>
</dependency>

        博客中使用的版本是:28.2。大家可以根据自己的实际情况进行选择对应的版本。 

2、空间数据库表

        作为示例,我们在一个数据库名称为:earthqadmin_dev,有一张省级行政区的空间表,表名叫做:biz_province。我们就以读取这张表的数据为例,讲述如何创建DataStore对象。空间表的数据如下:

        在java中连接PostGIS的参数代码如下:

/**
* -准备postGIS连接参数
* @return
*/
public static Map<String, Object> initPostGISMap () {Map<String, Object> params = new HashMap<>();params.put("dbtype", "postgis");params.put("host", "127.0.0.1");params.put("port", 5432);params.put("database", "earthqadmin_dev");params.put("schema", "public");params.put("user", "xxx");params.put("passwd", "xxx");return params;
}

        接下来就是从上面的map中获取DataStore对象,方法如下:

// step2、获取数据源
DataStore dataStore = DataStoreFinder.getDataStore(params);

         我们先来看一下,通过datastore可以获取哪些信息,查找所有使用服务机制注册的 DataStoreFactory 实现,并且这些实现的相应库在类路径上。所有已发现的数据存储,这些数据存储已注册工厂,并且其 available 方法返回 true。 方法如下:

/*** Finds all implemtaions of DataStoreFactory which have registered using the services* mechanism, and that have the appropriate libraries on the classpath.** @return An iterator over all discovered datastores which have registered factories, and whose*     available method returns true.*/public static synchronized Iterator<DataStoreFactorySpi> getAvailableDataStores() {FactoryRegistry serviceRegistry = getServiceRegistry();Set<DataStoreFactorySpi> availableDS =DataAccessFinder.getAvailableDataStores(serviceRegistry, DataStoreFactorySpi.class);return availableDS.iterator();
}

        可以在控制台看一下可用的实现信息:

ESRI(tm) Shapefiles (*.shp)
PostGIS Database (JNDI)
Takes a directory of shapefiles and exposes it as a data store
PostGIS Database

        到这里我们就成功的创建了DataStore对象,为接下来的空间数据读取打下了坚实的基础。

3、读取空间表的数据

        本小节将详细的讲述如何使用Geotools来进行空间属性的过滤,以及在控制台中输出我们的目标数据,关于如何使用Geotools来进行空间属性的过滤,方法多。这里介绍一种CQL的查询语言。这里的查询场景为,假设需要查询所有省份类型是“直辖市”的省份,可以实现的方法如下:

// step3、指定空间表名
String typeName = "biz_province";
//step4、 创建查询
Query query = new Query(typeName);
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = dataStore.getFeatureSource(typeName);
//step5、使用CQL(Common Query Language)表达式来定义过滤条件
Filter filter = CQL.toFilter(" type = '直辖市'");
query.setFilter(filter);

        最后执行查询和打印相关的属性信息及空间字段信息,关键代码如下:

// step6、执行查询
FeatureIterator<SimpleFeature> features = featureSource.getFeatures(query).features();         
CoordinateReferenceSystem crs = featureSource.getSchema().getCoordinateReferenceSystem();
System.out.println(crs);
System.out.println("**********************************************************");
while (features.hasNext()) {SimpleFeature feature = features.next();System.out.println("Feature: " + feature.getID());System.out.println("Geometry: " + feature.getDefaultGeometry());System.out.println("Attributes: " + feature.getAttributes());
}
features.close();
dataStore.dispose();

         一定记得打印完成后需要手动释放资源,以免造成不必要的损害。在IDE中运行以上的代码之后可以在控制台中看到如下输出:

        可以直观的发现,通过原生的PostGIS支持我们实现了对空间数据库中相关表的读取和展示。 

三、总结

        以上就是本文的主要内容,本文将深入探讨如何使用 Geotools 中的原始方法来操作 PostGIS 空间数据库,旨在为地理信息开发者提供一套系统、全面且实用的技术指南。通过Geotools 提供的原始方法接口,允许开发者深入到 PostGIS 的核心操作层面。通过这些方法,开发者可以精确地控制数据的读取、写入、查询和更新过程,从而实现高度定制化的空间数据处理流程。例如在复杂的空间分析任务中,原始方法可以更灵活地组合多种空间操作。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。

        参考资料:

        1、PostGIS操作指南。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

讯飞语音合成(流式版)语音专业版高质量的分析

一、引言 在现代的 Web 应用开发中&#xff0c;语音合成技术为用户提供了更加便捷和人性化的交互体验。讯飞语音合成&#xff08;流式版&#xff09;以其高效、稳定的性能&#xff0c;成为了众多开发者的首选。本文将详细介绍在 Home.vue 文件中实现讯飞语音合成&#xff08;流…

走进未来的交互世界:下一代HMI设计趋势解析

在科技日新月异的今天&#xff0c;人机交互界面&#xff08;HMI&#xff09;设计正以前所未有的速度发展&#xff0c;不断引领着未来的交互世界。从简单的按钮和图标&#xff0c;到如今的智能助手和虚拟现实&#xff0c;HMI设计不仅改变了我们的生活方式&#xff0c;还深刻影响…

洛谷题单3-P1217 [USACO1.5] 回文质数 Prime Palindromes-python-流程图重构

题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 151 是回文质数。 写一个程序来找出范围 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000…

学习笔记,DbContext context 对象是保存了所有用户对象吗

DbContext 并不会将所有用户对象保存在内存中&#xff1a; DbContext 是 Entity Framework Core (EF Core) 的数据库上下文&#xff0c;它是一个数据库访问的抽象层它实际上是与数据库的一个连接会话&#xff0c;而不是数据的内存缓存当您通过 _context.Users 查询数据时&…

本地命令行启动服务并连接MySQL8

启动服务命令 net start mysql8 关闭服务命令 net stop mysql8 本地连接MySQL数据库mysql -u [用户名] -p[密码] 这里&#xff0c;我遇到了个问题 —— 启动、关闭服务时&#xff0c;显示 “发生系统错误 5。拒绝访问。 ” 解法1&#xff1a;在 Windows 上以管理员身份打开…

数据蒸馏:Dataset Distillation by Matching Training Trajectories 论文翻译和理解

一、TL&#xff1b;DR 数据集蒸馏的任务是合成一个较小的数据集&#xff0c;使得在该合成数据集上训练的模型能够达到在完整数据集上训练的模型相同的测试准确率&#xff0c;号称优于coreset的选择方法本文中&#xff0c;对于给定的网络&#xff0c;我们在蒸馏数据上对其进行几…

【spring cloud Netflix】Ribbon组件

1.基本概念 SpringCloud Ribbon是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说&#xff0c;Ribbon 是 Netflix 发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将 Netflix 的中间层服务连接在一 起。Ribbon 的客户端组件提供…

P1036 [NOIP 2002 普及组] 选数(DFS)

题目描述 已知 n 个整数 x1​,x2​,⋯,xn​&#xff0c;以及 1 个整数 k&#xff08;k<n&#xff09;。从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4&#xff0c;k3&#xff0c;4 个整数分别为 3,7,12,19 时&#xff0c;可得全部的组合与它…

在响应式网页的开发中使用固定布局、流式布局、弹性布局哪种更好

一、首先看下固定布局与流体布局的区别 &#xff08;一&#xff09;固定布局 固定布局的网页有一个固定宽度的容器&#xff0c;内部组件宽度可以是固定像素值或百分比。其容器元素不会移动&#xff0c;无论访客屏幕分辨率如何&#xff0c;看到的网页宽度都相同。现代网页设计…

二分查找与二叉树中序遍历——面试算法

目录 二分查找与分治 循环方式 递归方式 元素中有重复的二分查找 基于二分查找的拓展问题 山脉数组的顶峰索引——局部有序 旋转数字中的最小数字 找缺失数字 优化平方根 中序与搜索树 二叉搜索树中搜索特定值 验证二叉搜索树 有序数组转化为二叉搜索树 寻找两个…

字符串——面试考察高频算法题

目录 转换成小写字母 字符串转化为整数 反转相关的问题 反转字符串 k个一组反转 仅仅反转字母 反转字符串里的单词 验证回文串 判断是否互为字符重排 最长公共前缀 字符串压缩问题 转换成小写字母 给你一个字符串 s &#xff0c;将该字符串中的大写字母转换成相同的…

现代复古电影海报品牌徽标设计衬线英文字体安装包 Thick – Retro Vintage Cinematic Font

Thick 是一种大胆的复古字体&#xff0c;专为有影响力的标题和怀旧的视觉效果而设计。其厚实的字体、复古魅力和电影风格使其成为电影海报、产品标签、活动品牌和编辑设计的理想选择。无论您是在引导电影的黄金时代&#xff0c;还是在现代布局中注入复古活力&#xff0c;Thick …

[C++面试] new、delete相关面试点

一、入门 1、说说new与malloc的基本用途 int* p1 (int*)malloc(sizeof(int)); // C风格 int* p2 new int(10); // C风格&#xff0c;初始化为10 new 是 C 中的运算符&#xff0c;用于在堆上动态分配内存并调用对象的构造函数&#xff0c;会自动计算所需内存…

Unity URP管线与HDRP管线对比

1. 渲染架构与底层技术 URP 渲染路径&#xff1a; 前向渲染&#xff08;Forward&#xff09;&#xff1a;默认单Pass前向&#xff0c;支持少量实时光源&#xff08;通常4-8个逐物体&#xff09;。 延迟渲染&#xff08;Deferred&#xff09;&#xff1a;可选但功能简化&#…

JDK8卸载与安装教程(超详细)

JDK8卸载与安装教程&#xff08;超详细&#xff09; 最近学习一个项目&#xff0c;需要使用更高级的JDK&#xff0c;这里记录一下卸载旧版本与安装新版本JDK的过程。 JDK8卸载 以windows10操作系统为例&#xff0c;使用快捷键winR输入cmd&#xff0c;打开控制台窗口&#xf…

python爬虫:DrissionPage实战教程

如果本文章看不懂可以看看上一篇文章&#xff0c;加强自己的基础&#xff1a;爬虫自动化工具&#xff1a;DrissionPage-CSDN博客 案例解析&#xff1a; 前提&#xff1a;我们以ChromiumPage为主&#xff0c;写代码工具使用Pycharm&#xff08;python环境3.9-3.10&#xff09; …

07-01-自考数据结构(20331)- 排序-内部排序知识点

内部排序算法是数据结构核心内容,主要包括插入类(直接插入、希尔)、交换类(冒泡、快速)、选择类(简单选择、堆)、归并和基数五大类排序方法。 知识拓扑 知识点介绍 直接插入排序 定义:将每个待排序元素插入到已排序序列的适当位置 算法步骤: 从第二个元素开始遍历…

Go语言-初学者日记(八):构建、部署与 Docker 化

&#x1f9f1; 一、go build&#xff1a;最基础的构建方式 Go 的构建工具链是出了名的轻量、简洁&#xff0c;直接用 go build 就能把项目编译成二进制文件。 ✅ 构建当前项目 go build -o myapp-o myapp 指定输出文件名默认会构建当前目录下的 main.go 或 package main &a…

教程:如何使用 JSON 合并脚本

目录 1. 介绍 2. 使用方法 3. 注意事项 4. 示例 5.完整代码 1. 介绍 该脚本用于将多个 COCO 格式的 JSON 标注文件合并为一个 JSON 文件。COCO 格式常用于目标检测和图像分割任务&#xff0c;包含以下三个主要部分&#xff1a; "images"&#xff1a;图像信息&a…

Java学习总结-缓冲流性能分析

测试用例&#xff1a; 分别使用原始的字节流&#xff0c;以及字节缓冲流复制一个很大的视频。 测试步骤&#xff1a; 在这个分析性能需要一个记录时间的工具&#xff1a;这个是记录1970-1-1 00&#xff1a;00&#xff1a;00到现在的总毫秒值。 long start System.currentT…