达梦数据库(DM8)集成使用 Geotools(27.2)

前几天搞了在达梦数据库集成使用 Geoserver,几乎支持 2.8 以上所有版本,继而又开始尝试 Geotools,毕竟是同源,综合问题不大。

因时间有限,本文只尝试了 23.5 和 最新版(27.2) 两个版本,均可正常集成使用,其他版本以后有时间在尝试。

本文主要包括:系统环境版本、达梦 8 集成 Geotools 环境、Geotools 使用示例、试错过程问题


系统环境版本

系统版本:win10 专业版

在这里插入图片描述

java 版本:1.8.0_181

在这里插入图片描述

数据库版本:达梦8

在这里插入图片描述

Geotools版本:

23.5、27.2
在这里插入图片描述
在这里插入图片描述

Geotools 与 Geoserver 对应版本:

在这里插入图片描述
在这里插入图片描述

Geotools 驱动对应版本版本:

gt-dameng-2.15

在这里插入图片描述


达梦 8 集成 Geotools 环境

安装达梦8,请参照

https://eco.dameng.com/document/dm/zh-cn/pm/install-uninstall.html

注意:数据库需要开启空间扩展:DMGEO,开启命令为:SP_INIT_GEO_SYS(1);

执行sql 测试:

select dmgeo.ST_GeoMFromText(‘POINT(116.10220150021966 39.778485532491445)’,4326);

在这里插入图片描述

项目 pom.xml 添加 geotools 配置

添加 geotools 配置,注意不要忘了 repositories 配置:

<!--=====geotools start=====================================================-->

<geotools.version>27.2</geotools.version>

<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.jdbc</groupId>
    <artifactId>gt-jdbc-postgis</artifactId>
    <version>${geotools.version}</version>
</dependency>
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-main</artifactId>
    <version>${geotools.version}</version>
</dependency>
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-epsg-wkt</artifactId>
    <version>${geotools.version}</version>
</dependency>
<dependency>
    <groupId>org.locationtech.jts</groupId>
    <artifactId>jts-core</artifactId>
    <version>1.18.2</version>
</dependency>
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-wms</artifactId>
    <version>${geotools.version}</version>
</dependency>
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-geojson</artifactId>
    <version>${geotools.version}</version>
</dependency>

<!--geotools 配置 Start ==========================================================-->
<repository>
    <id>osgeo</id>
    <name>OSGeo Release Repository</name>
    <url>https://repo.osgeo.org/repository/release/</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <releases>
        <enabled>true</enabled>
    </releases>
</repository>
<repository>
    <id>osgeo-snapshot</id>
    <name>OSGeo Snapshot Repository</name>
    <url>https://repo.osgeo.org/repository/snapshot/</url>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
    <releases>
        <enabled>false</enabled>
    </releases>
</repository>
<!--geotools 配置 end ==========================================================-->

项目 pom.xml 添加达梦数据库驱动包

1. 安装达梦数据库驱动

达梦数据库驱动包可直接使用 maven 安装:

<!-- https://mvnrepository.com/artifact/com.dameng/DmJdbcDriver18 -->
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmJdbcDriver18</artifactId>
    <version>8.1.2.141</version>
</dependency>

2. 安装达梦数据库 Geotools 驱动

达梦数据库 Geotools(Geoserver)驱动包,由于达梦官方未上传至 maven,因此需要手动导入

Geotools 为27.2,选择驱动包: gt-dameng-2.15.jar

首先需要找到驱动包,一般路径为:达梦安装路径\dmdbms\drivers\jdbc\dialect

在这里插入图片描述

执行 maven 安装命令:mvn install:

# mvn install:包路径、父目录、包名称、版本、包类型
mvn install:install-file -Dfile=包路径\gt-dameng-2.15.jar -DgroupId=org.geotools.data -DartifactId=gt-dameng -Dversion=2.15 -Dpackaging=jar 

项目pom.xml 添加 geotools 驱动包

<!-- geotools 达梦驱动,注意:如果未执行 mvn install,pom 文件会报错 -->
<dependency>
    <groupId>org.geotools.data</groupId>
    <artifactId>gt-dameng</artifactId>
    <version>2.15</version>
</dependency>

运行 reload project:

在这里插入图片描述


Geotools 使用示例

达梦数据库环境配置完成之后,连接数据库以及数据库操作与其他数据库(PostgreSQL)基本一致。

Geotools 连接数据库

通过 DataStoreFinder.getDataStore 建立数据库连接:

/**
 * @todo 创建 geotools 数据连接
 * @return
 * @throws IOException
 */
public DataStore getDataStore() throws IOException {

    Map<String, Object> params = new HashMap<>();

    // 数据库类型
    params.put(JDBCDataStoreFactory.DBTYPE.key, "dm");
    // 数据库地址,请输入自己的数据库
    params.put(JDBCDataStoreFactory.HOST.key, "192.*.*.60");
    // 数据库端口
    params.put(JDBCDataStoreFactory.PORT.key, "5236");
    // 数据库模式
    params.put(JDBCDataStoreFactory.SCHEMA.key, "moshi");
    // 数据库表名
    params.put(JDBCDataStoreFactory.DATABASE.key, "biaoming");
    // 数据库用户名
    params.put(JDBCDataStoreFactory.USER.key, "SYSDBA");
    // 数据库密码
    params.put(JDBCDataStoreFactory.PASSWD.key, "mima123456");
    // 暴露查询主键
    params.put(JDBCDataStoreFactory.EXPOSE_PK.key, "true");
    // 验证连接
    params.put(JDBCDataStoreFactory.VALIDATECONN.key, "true");
    // 最大连接数
    params.put(JDBCDataStoreFactory.MAXCONN.key, 25);
    // 最小连接数
    params.put(JDBCDataStoreFactory.MINCONN.key, 10);

    DataStore _dataStore = DataStoreFinder.getDataStore(params);

    if (_dataStore != null) {
        System.out.println("系统连接到位于:192.168.242.60的空间数据库成功!");
    } else {
        System.out.println("系统连接到位于:192.168.242.60的空间数据库失败!请检查相关参数");
    }
    return _dataStore;
}

Geotools 空间查询

使用已经建立的 Geotools 数据库对象,根据表名和传入的几何图形的空间数据(WKT字符串),查询符合条件的数据:

/**
 * @param {String} queryTableName - 表名
 * @param {String} geom - 多边形,WKT 格式字符串
 * @return
 * @todo 空间查询
 */
private String getSpaceDataIntersectsGeoTools(String queryTableName, String geom) throws IOException, ParseException {

    Map<String, Object> queryResult = new HashMap();

    // 定位过滤器
    FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);

    // 根据表名获取数据集合
    SimpleFeatureSource featureSource = _dataStore.getFeatureSource(queryTableName);

    // 获取模式对象
    SimpleFeatureType schema = featureSource.getSchema();

    // 获取模式属性
    String geometryAttributeName = schema.getGeometryDescriptor().getLocalName();

    // 查询对象
    Query query = null;
    // 过滤对象
    Filter filter1 = null;
    // 查询类型 - 相交
    String queryType = "intersect";
    // 设置查询类型
    queryResult.put("QueryType", queryType);

    // 设置相交字段以及相交几何对象
    filter1 = ff.intersects(ff.property(geometryAttributeName), ff.literal(createPolygonByWKT(geom)));

    // 查询对象赋值
    query = new Query(queryTableName, filter1);

    // 得到当前符合查询条件的记录集
    SimpleFeatureCollection result = featureSource.getFeatures(query);

    // 定义写入器
    StringWriter writerFull = new StringWriter();

    // 定义 geojson 对象,注意 GeometryJSON(8) 为设置精度
    FeatureJSON featureJSONFullWkt = new FeatureJSON(new GeometryJSON(8));
    // 写入
    featureJSONFullWkt.writeFeatureCollection(result, writerFull);

    // 替换 null 为 null 字符串
    String fullWKTString = StringUtils.isEmpty(writerFull.toString()) ? ""
            : writerFull.toString().replaceAll("null", "\"" + "null" + "\"");

    queryResult.put("GeoJsonWktFullString", fullWKTString);

    return queryResult.toString();
}

Geotools 查询结果

查询测试结果:

在这里插入图片描述


试错过程问题

错误的话,只遇到一个,即数据库连接失败,但是由于 Geotools 内部做了处理,因此不会报错

在这里插入图片描述
经过调试,发现 Geotools 方言库中并没有达梦数据库(dameng

在这里插入图片描述
后来发现是忘记运行 maven 的 reload project 了,运行并重启项目即可:

在这里插入图片描述

总结

目前只实验了 Geotools 23.5 和 27.2 版本,理论上来讲,23.5-27.2 之间的版本应该都可以正常使用!

一定要注意 gt-dameng 的导入方式!

一定要记得 maven 的 reload project!



参考博客:

Geoserver 版本对应 Geotools 版本
达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非科班Java出身GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值