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\x89~Z@\xeb\x1aGy\x1c\xbc!A'F\xef\xd4\x81\x00HA\x07\xb5\xdf\xda\x89~Z@\xeb\x1aGy\x1c\xbc!A'F\xef\xd4\x81\x00HA\xd8}\xc7\xf0\xd8\x03Z@\x1d\xb0\xaby\x1f\xbc!A7\xfcnV\x82\x00HA\xd8}\xc7\xf0\xd8\x03Z@\x1d\xb0\xaby\x1f\xbc!A7\xfcnV\x82\x00HA\x07\xb5\xdf\xda\x89~Z@\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 解決方案”,不過沒有成功。。。

結果:

后來想了個簡單粗暴的方法,還是依據這個http://www.jianshu.com/p/5bc7d8b7b429教程,下好對應的dll,然后直接放入python安裝目錄下的DLLs中,然后將DLLs文件夾加入環境變量中。

dll包內容:

修改代碼:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM