最近在调研postgis的替代品Spatialite,主要测试一下Spatialite与postgis的异同,方便替换的时候有相关知识储备。
由于对Spatialite不太了解,找包找了好久,在windows平台下,我用到了mod_spatialite-5.1.0-win-amd64和spatialite-tools-5.0.0-win-amd64这两个相关文件,其mod_spatialite-5.1.0-win-amd64是一堆的DLL,可以在64位windows平台下使用;spatialite-tools-5.0.0-win-amd64是Spatialite在windows下的一些工具exe,主要可以实现对shp数据导入导出、dxf处理、dem处理等等。
一般来说,postgis支持的一些空间分析函数,Spatialite都能够支持,但相对来说Spatialite比较轻量级,功能也能够满足日常开发需求。
以下是逐步骤在windows平台对开发过程中常用的功能进行验证的过程,也包括一些注意事项及避坑。
1、创建一个拥有空间信息的SQLite数据库test.db
cd spatialite-tools-5.0.0-win-amd64
spatialite.exe ../test.db
完成操作后,打开db数据库,应该可以看到一堆的表已经自动生成了,下面可以输入一些语句测试。
2、创建包含点的数据表places
CREATE TABLE places (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, location POINT);
3、在places表中插入点位数据
INSERT INTO places (name, location) VALUES ('beijing', MakePoint(119.22, 30.125, 4326));
4、查询该表下的点位数据
select *,asgeojson(location) FROM places;
5、查询距离某个点一定距离范围内的地点
SELECT * FROM places WHERE Distance(location, MakePoint(120, 30, 4326)) < 1000;
6、查询包含在某个多边形范围内的地点
SELECT * FROM places WHERE Within(location, GeometryFromText('POLYGON((119.1 30.2,119.5 30.3,120.3 30.1,119.1 30.2))', 4326));
7、查询面积
SELECT Area(GeomFromText('POLYGON((0 0, 0 100, 10 10, 10 0, 0 0))')) AS area;
8、查询两线段是否相交
SELECT ST_Intersects( ST_GeomFromText('LINESTRING(0 0, 1 1, 2 2)'), ST_GeomFromText('LINESTRING(1 0, 1 2)') ) AS intersects;
9、包含
SELECT ST_Contains( ST_GeomFromText('POINT(1 1)'), ST_GeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))') ) AS contains_point;
10、shp导入
shp导入依赖于tools中的spatialite_tool.exe
spatialite_tool.exe -i -shp shp文件路径 -d db文件路径 -t 表名 -g geom -c GBK -s 4326
11、shp导出
shp导出同样依赖于tools中的spatialite_tool.exe
spatialite_tool.exe -e -shp 导出路径(包含文件名) -d db文件路径 -t 表名 -g geom -c GBK --type POLYGON
注意事项:
一、需要在英文路径下操作,中文路径会出现莫名的问题
二、如果不使用spatialite进行操作,而是在sqlLite下操作的话,需要加载扩展,然后才能正常使用相关空间查询函数。例如:
// 使用sqlite3打开test.db
sqlite3.exe test.db
// 加载soatialite扩展.load mod_spatialite
// 初始化gis函数
SELECT InitSpatialMetadata(1);
这里仅是在windows平台进行开发的,其他平台暂未测试;但本质上SpatiaLite是用c或c#开发的,理论上可以编译到各个平台,官网也有对应的二进制的包,以后再慢慢研究。