python Spatialite库应用 (sqlite3扩展)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Spatialite库应用 (sqlite3扩展)相关的知识,希望对你有一定的参考价值。

问题:

需要从Spatialite库中使用python读取内容,有个geometry字段,读出来的东西是一串二进制字节。附最初代码:

 

import sqlite3


conn = sqlite3.connect(./20059363.db)


cursor = conn.execute(
    "SELECT ROWID, OBJECT_PID, MESH, TRAFSIGN_SHAPE, SIGN_TYPE, GEOMETRY FROM HAD_OBJECT_TRAFFIC_SIGN  WHERE TRAFSIGN_SHAPE == 2 "
    "ORDER BY ROWID")

for row in cursor:
    print(row[0])
    print(row[1])
    print(row[5])

 

输出是:

1183319
1183319
b"\x00\x01\x00\x00\x00\x00\xeb\x1aGy\x1c\xbc!A‘F\xef\xd4\x81\x00HA\x1d\xb0\xaby\x1f\xbc!A7\xfcnV\x82\x00HA|\xeb\x03\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x1d\xb0\xaby\x1f\xbc!A7\xfcnV\x82\x00HA\x07\xb5\xdf\xda\[email protected]\xeb\x1aGy\x1c\xbc!A‘F\xef\xd4\x81\x00HA\x07\xb5\xdf\xda\[email protected]\xeb\x1aGy\x1c\xbc!A‘F\xef\xd4\x81\x00HA\xd8}\xc7\xf0\xd8\[email protected]\x1d\xb0\xaby\x1f\xbc!A7\xfcnV\x82\x00HA\xd8}\xc7\xf0\xd8\[email protected]\x1d\xb0\xaby\x1f\xbc!A7\xfcnV\x82\x00HA\x07\xb5\xdf\xda\[email protected]\xfe"

这第三个二进制字节串显然是有问题的。

 

过程:

后询问同事,说是个保存地理信息的字段,需要特殊的方法来解码。

后来查询到一个astext方法,可以读取到该字段的text?(其实我也不清楚读到的是啥,主要那个字段我就没搞明白里面都写啥了。。。),

sql语句是这样:

"SELECT ROWID, OBJECT_PID, MESH, TRAFSIGN_SHAPE, SIGN_TYPE, AsText(GEOMETRY) FROM HAD_OBJECT_TRAFFIC_SIGN  WHERE TRAFSIGN_SHAPE == 2 ORDER BY ROWID")

但是sqlite3中并没有AsTest方法,所以需要扩展。

从网上搜到了这个教程:http://www.jianshu.com/p/5bc7d8b7b429,使用了其中的“python +spatialite + window 解决方案”,不过没有成功。。。

后来想了个简单粗暴的方法,还是依据这个教程,下好对应的dll,然后直接放入python安装目录下的DLLs中,然后修改代码:

import sqlite3

conn = sqlite3.connect(./20059363.db)
conn.enable_load_extension(True)
conn.load_extension(mod_spatialite)
cursor = conn.execute(
    "SELECT ROWID, OBJECT_PID, MESH, TRAFSIGN_SHAPE, SIGN_TYPE, AsText(GEOMETRY) FROM HAD_OBJECT_TRAFFIC_SIGN  WHERE TRAFSIGN_SHAPE == 2 "
    "ORDER BY ROWID")

for row in cursor:
    print(row[0])
    print(row[1])
    print(row[5])

输出:

1183319
1183319
POLYGON Z((581135.737638 3145988.675262 105.977164, 581134.236871 3145987.663552 105.977164, 581134.236871 3145987.663552 104.060116, 581135.737638 3145988.675262 104.060116, 581135.737638 3145988.675262 105.977164))

搞定。

 

下面附一个python3,64位的dll包,方便大家使用。

 

 

链接:http://pan.baidu.com/s/1gfioKZD 密码:m23o

以上是关于python Spatialite库应用 (sqlite3扩展)的主要内容,如果未能解决你的问题,请参考以下文章

Qt sqlite插件在哪里寻找扩展库

哪个 SRID 适用于 SpatiaLite db 中的添加和排序?

DotSpatial_创建Spatialite空间数据库

markdown 安装Spatialite以在数据库浏览器中使用GPKG

sh 在Arch Linux中构建spatialite-gui-dev

QGIS2.18.0的精简编译