使用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操作指南

猜你喜欢

转载自blog.csdn.net/yelangkingwuzuhu/article/details/146965881