2013-07-15 29 views
0

我想將LineStrings插入本地Postgres/PostGIS數據庫。我使用Python 2.7,psycopg2和ppygis。如何將LineStrings插入到使用Python,psycopg2和ppygis的PostGIS數據庫中

每當我做一個循環輸入,只有幾條記錄被插入到表中。我試圖找出與mogrify有關的問題,但我沒有看到失敗。

polyline = [] 
for row in positions: 
    lat = row[0] 
    lon = row[1] 
    point = ppygis.Point(lon, lat, srid=4326) 
    polyline.append(point) 
linestring = ppygis.LineString(polyline, srid=4326) 

self.cursor.execute("BEGIN") 
self.cursor.execute("INSERT INTO gtrack_4326 (car, polyline) VALUES (%s,%s);", ("TEST_car", linestring)) 
self.cursor.execute("COMMIT") 

在字符串中使用的execute.mogrify結果是這樣的:

INSERT INTO gtrack_4326 (car,polyline) VALUES ('TEST_car', '0102000020e610000018000000aefab72638502940140c42d4d899484055a4c2d84250294056a824a1e3994840585b0c795f50294085cda55df1994840edca78a57650294069595249f8994840ec78dd6cbd502940828debdff5994840745314f93f5129407396fecaef994840e1f6bafbd25129404eab329de7994840da588979565229407a562d44e2994840ebc9fca36f522940c2af4797ed9948403bd164b5af5229407a90f9dbf99948407adbf1cb05532940818af4ec039a484062928087585329402834ff9e0e9a4840e8bb5b59a2532940b1ec38341b9a4840dcb28d89de532940afe94141299a484084d3275e0a54294019b1aab9379a484080ca42853454294053509b82469a48408df8043f6054294063844b22569a48406d3e09c7875429406dfbc33b659a4840aa5a77989b542940c20e08196d9a48401b56a7b9cb542940a0a0b9f3699a4840cf2d742502552940192543e9669a484045ac0f351b552940fdb0efd46d9a48406891ed7c3f552940450a0a28799a4840d0189c77525529405f7b6649809a4840'); 

但是,如果我看到數據庫中,我看到一個沒有幾何數據了很多紀錄在第二列。我不明白爲什麼mogrify顯示每列和數據庫中的數據,在幾乎50%的表中沒有幾何列中的數據。

回答

1

首先,psycopg2做它自己的事務管理,所以你應該寫一般:

self.cursor.execute(
    "INSERT INTO gtrack_4326 (car, polyline) VALUES (%s,%s);", 
    ("TEST_car", linestring) 
) 
self.conn.commit() 

the psycopg2 docs

其次,考慮分批加載數據COPY。見COPY in the psycopg2 docs

也考慮設置log_statement = 'all'postgresql.conf和合適log_line_prefix然後重新啓動PostgreSQL服務器。檢查日誌並查看是否可以分辨僞造插件的作用。

如果可行,請在幾何列中添加CHECK和/或NOT NULL約束條件,以便任何不正確的INSERT都會失敗並向執行插入的程序報告錯誤。這可能有助於您診斷問題。

1

您是如何確定50%的行沒有幾何數據的?我會警告任何使用像pgAdminIII這樣的客戶端的人,如果它包含太多的數據,就會顯示一個空白單元格,所以如果沒有,它會顯示爲空。您也可以在Quantum GIS等程序中直接查看GIS數據。

隨着SQL客戶端,更好的診斷,以確定是否一個線串真的沒有得到number of points in the linestring

SELECT car, ST_NumPoints(polyline) FROM gtrack_4326; 

如果數字是空的,那麼你的評價是正確的,他們是空的。否則,數據太大而無法在您的客戶端應用程序中顯示。

相關問題