目录
前言
一、原生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操作指南。