随着政府项目对信创要求的不断推进,国产化数据库也大势所趋,很多项目要求使用达梦数据库。数据库迁移的过程中,对于空间数据的支持也是非常重要的一项内容。
实际应用中,主要考虑这几个方面:
(1)空间数据的入库和导出;
(2)空间索引和基础空间函数的支持;
(3)地图服务的发布支持;
满足这几个需求的话,项目中大部分的问题基本都能得到解决。
达梦的空间模块支持通过DMGEO库进行实现
官方文档 https://eco.dameng.com/document/dm/zh-cn/pm/dmgeo-package#2.3.2%20SF_CHECK_GEO_SYS
(1)空间模块扩展支持
执行 SP_INIT_GEO_SYS(1);即可
(2)空间数据类型
基本参照postgis,二维矢量数据支持没有问题。
(3)空间函数
支持的函数并不多,不可能有postgis那样强大。但是最基础的几何要素的定义、空间关系判断、简单的空间分析、geojson等格式转换、坐标转换等都有。
#插入要素
INSERT INTO testdmgeo VALUES(1,'test1',dmgeo.ST_PolyFromText('polygon((114 22,114.5 22,114.5 22.5,114 22.5,114 22))',4326));
#计算面积,直接根据坐标系统单位计算
select dmgeo.ST_Area(dmgeo.ST_PolyFromText('polygon((114 22,114.5 22,114.5 22.5,114 22.5,114 22))',4326));
0.25
#距离也一样
select dmgeo.ST_Distance(dmgeo.ST_PointFromText('point(113 22)',4326),dmgeo.ST_PolyFromText('polygon((114 22,114.5 22,114.5 22.5,114 22.5,114 22))',4326));
1.0
#进行投影转换后,返回平面坐标值,单位是米
select dmgeo.ST_Area(dmgeo.ST_TRANSFORM(dmgeo.ST_PolyFromText('polygon((114 22,114.5 22,114.5 22.5,114 22.5,114 22))',4326),4547))
2.8536572519374533E9
#生成geojson
select dmgeo.ST_AsGEOJSON(dmgeo.ST_PointFromText('point(113 22)',4326))
{"type": "Point","crs":{"type":"name","properties":{"name":"EPSG:4326"}},"coordinates":[[113.000000000000000,22.000000000000000]]}
#判断是否相交
select dmgeo.ST_Intersects(dmgeo.ST_PointFromText('point(113 22)',4326),dmgeo.ST_PolyFromText('polygon((114 22,114.5 22,114.5 22.5,114 22.5,114 22))',4326));
(4)空间索引
官方文档实在没找到多余的描述,应该就是常规的R树索引。
CREATE TABLE testdmgeo(id int, name varchar(20), geom ST_polygon);
create spatial index idxtestdmspatial on testdmgeo(geom);
(5)空间数据入库
通过dmshp2st命令行入库
GIS小砖家:【第五章 空间数据库】dmshp2st实现shp数据入库
通过ArcGIS软件入库,经测试没有问题
GIS小砖家:【第五章 空间数据库】ArcGIS将shp导入达梦数据库
(6)geoserver地图服务发布
GIS小砖家:【第五章 空间数据库】达梦数据库发布geoserver地图服务
原文链接
发表评论
2023-12-04 09:49:00回复
又出现
[执行语句1]:
SP_INIT_GEO_SYS(1);
执行失败(语句1)
对象[ST_POINT]已存在
-2124[-2124]: anonymous block line 17
难道只能一个个同义词删除,再来安装dmgeo了吗?
2023-12-04 09:48:35回复
SQL 错误 [22000]: 第1 行附近出现错误:
试图修改系统表或内建表[SYSOBJECTS]
2023-12-04 09:49:17回复
2023-12-04 09:48:52回复
比如我本地测试查询出ST_GEOMETRY是个全局同义词
2023-12-04 09:47:24回复
1、
[执行语句1]:
SP_INIT_GEO_SYS(1);
执行失败(语句1)
对象[ST_GEOMETRY]已存在
-2124[-2124]: anonymous block line 17
1条语句执行失败
2、
[执行语句1]:
SP_INIT_GEO_SYS(2);
执行失败(语句1)
无效的模式名[SYSGEO]
-2103[-2103]: anonymous block line 15
2023-12-04 09:48:06回复
[执行语句1]:
SP_INIT_GEO_SYS(1);
执行失败(语句1)
对象[ST_GEOMETRY]已存在
-2124[-2124]: anonymous block line 17
[执行语句1]:
SP_INIT_GEO_SYS(3);
执行失败(语句1)
无效的模式名[SYSGEO]
-2103[-2103]: anonymous block line 15
[执行语句1]:
SP_INIT_GEO_SYS(2);
执行失败(语句1)
无效的模式名[SYSGEO]
-2103[-2103]: anonymous block line 15
2023-12-04 09:48:24回复
1、删除dmgeo包
SP_INIT_GEO_SYS(0);
2、检查数据库中是否存在ST_GEOMETRY的对象名
select * from SYS.SYSOBJECTS where name=‘ST_GEOMETRY’;
3、删除对应的ST_GEOMETRY对象名后重新创建dmgeo包
SP_INIT_GEO_SYS(1);
2023-12-04 09:47:34回复
SP_INIT_GEO_SYS(0);
SP_INIT_GEO_SYS(1);
需要保留现有空间数据时, 使用下列语句来重建 GEO 包:
SP_INIT_GEO_SYS(3);
SP_INIT_GEO_SYS(2);
2023-12-01 11:26:42回复
dmgeo2
执行 SP_INIT_GEO_SYS(1);即可