前几天在deepin里配置好了spatialite的插件,没想到一样的代码在windows里跑的时候,出现了no native library is found for os.name windows… 的错误,花了两天的时候,尝试失败了无数次,找了各种网站,终于成功了!!!
从官网上下载mod_spatialite的压缩包,并解压:mod_spatialite-5.0.1-win-amd64.7z
这一步十分关键,正是被这一个步骤折腾了非常久,真的非常久。
必须将解压后的文件放在你的项目的根目录下,即项目的最外层目录,否则下一步操作会有问题。
我也是参考了这篇博客才看到的->spatialite-dll配置真是烦!
由于我们使用的是 加载mod_spatialite.dll模块的方式,所以我们加载的jdbc就直接用sqlite-jdbc,不再使用上一篇linux中用的spatialite-jdbc。
p.s. 如果有小伙伴编译好了可用于Windows版本的spatialite-jdbc,请共享一份给我啊!
用SQL语句加载mod_spatialite.dll模块,并测试一下是否加载成功。
SELECT load_extension('mod_spatialite');
SELECT sqlite_version(), spatialite_version(), spatialite_target_cpu();
如果加载成功,可以看到类似这样的输出。
3.31.1|5.0.0|x86_64-w64-mingw32
原以为,这样就搞定了。谁知道在测试下面这段语句时,出现了另一个错误。
sqlite> select AsGeoJSON(ST_Transform(MakePoint(114.1689,22.4518,4326),3857));
Error: ST_Transform exception - PROJ reports "proj_create: no database context specified".
找了一会儿,发现可能是proj.db数据库没有配置对,可参考以下网页:spatialite与proj6
可通过以下代码测试是否正确绑定proj.db数据库
如果有显示路径,表示已正确配置,如下:
sqlite> SELECT PROJ_GetDatabasePath();
D:\spatialite/proj.db
若没有显示任何信息,则表示配置不正确,可通过以下代码查询具体的错误信息:
sqlite> SELECT PROJ_GetDatabasePath();
sqlite> SELECT PROJ_GetLastErrorMsg();
proj_context_get_database_path: Cannot find proj.db
这时,可通过以下代码配置proj.db库
sqlite> SELECT PROJ_SetDatabasePath('D:/proj.db');
D:/proj.db
再次测试,成功!
sqlite> select AsGeoJSON(ST_Transform(MakePoint(114.1689,22.4518,4326),3857));
{"type":"Point","coordinates":[12709223.81242817,2565856.375115402]}
sqlite> SELECT PROJ_AsWKT('EPSG', 4326);
GEODCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
SCOPE["Horizontal component of 3D system."],
AREA["World."],
BBOX[-90,-180,90,180],
ID["EPSG",4326]]