| 项目 | 信息 |
|---|---|
| 数据库版本 | DM8 开发版(安装包:dm8_20260709_x86_win_64) |
| 操作系统 | Windows 10/11 64位 |
| 实例端口 | 5236 |
| 安装路径 | D:\Dameng |
| 连接账号 | SYSDBA |
在执行空间扩展初始化时,调用 SP_INIT_GEO_SYS(1) 失败,错误信息:
[-2870]:加载第三方库[libgeos_c.dll]失败,库文件缺失或版本太旧
导致无法使用 GEOMETRY 类型、ST_GEOMFROMTEXT() 等空间函数,业务系统中所有含空间字段的表(如行政区划边界、应急避难场所位置等)均无法创建。
-- 1. 检查空间扩展状态
SELECT SF_CHECK_GEO_SYS AS GEO_STATUS;
-- 返回 0,未启用
-- 2. 初始化空间扩展
CALL SP_INIT_GEO_SYS(1);
-- 报错:[-2870]:加载第三方库[libgeos_c.dll]失败,库文件缺失或版本太旧
-- 3. 尝试创建含 GEOMETRY 类型的表
CREATE TABLE TEST_GEOM (ID INT, GEOM GEOMETRY);
-- 报错:GEOMETRY 类型未识别
对 D:\Dameng\bin\geos_c.dll 进行二进制字符串分析,提取出版本信息:
当前版本:3.10.3-CAPI-1.16.1
对 D:\Dameng\bin\dmspatial.dll 进行二进制字符串分析,发现其中包含版本校验字符串:
"GEOS Library version %s is not match %s"
"3.12.1"
"3.14.1"
结论:dmspatial.dll 编译时绑定的 GEOS 版本为 3.12.1 或 3.14.1,但安装包自带的 geos_c.dll 版本为 3.10.3,存在版本不匹配问题。
geos-3.14.1-1.tar.bz2(x86_64)geos_c.dll(版本:3.14.1-CAPI-1.20.5)和 geos.dlldmspatial.dll 匹配D:\Dameng\bin 下的:
geos_c.dlllibgeos_c.dll(由 geos_c.dll 复制并重命名)geos.dllgeos.3.10.dllC:\Windows\System32结果:在 PowerShell 中通过 P/Invoke 方式调用 libgeos_c.dll 中的 GEOSversion()、GEOS_init_r()、GEOS_finish_r() 函数均能正常工作,但达梦数据库执行 SP_INIT_GEO_SYS(1) 仍报相同错误。
D:\Dameng\binD:\Dameng\bin达梦 SP_INIT_GEO_SYS 内部可能存在以下机制之一,导致第三方编译的 GEOS 库无法通过验证:
libgeos_c.dll 进行签名验证,第三方编译的库无达梦签名我的业务系统(雨花区易渍涝点防汛排涝智慧平台)需要在达梦数据库中存储行政区划边界、应急避难场所位置、撤离路线等空间数据,使用 GEOMETRY 类型并以 SRID 4490(CGCS2000)坐标系存储,依赖以下空间函数:
ST_GEOMFROMTEXT() - 将 WKT 转换为空间对象ST_ASTEXT() - 将空间对象转换为 WKTST_SRID() - 获取空间参考CREATE SPATIAL INDEX)dm8_20260709_x86_win_64 安装包中 dmspatial.dll 兼容的 libgeos_c.dll、geos_c.dll、geos.dll(版本 3.12.1 或 3.14.1)如有需要进一步沟通,可通过以下方式联系:
附件:
dmspatial.dll 中的版本校验字符串截图geos_c.dll 版本信息截图请达梦官方或社区专家协助解决,感谢!
1、缺少空间包,一般是单独分开的SPATIAL包,里面包含空间数据类型包,解压后,拷贝到bin目录后,基本不会报错
2、空间包的话,需要联系商务及项目对接人,获取指定版本的GEO包

达梦数据库实例是不是用root启动的?