达梦数据库(DM8)集成使用 Geotools(27.2)
- 系统环境版本
- 达梦 8 集成 Geotools 环境
- 安装达梦8,请参照
- 项目 pom.xml 添加 geotools 配置
- 项目 pom.xml 添加达梦数据库驱动包
- Geotools 使用示例
- Geotools 连接数据库
- Geotools 空间查询
- Geotools 查询结果
- 试错过程问题
- 总结
前几天搞了在达梦数据库集成使用 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) 以及其他对应版本详解