0

我正在尝试将 LineStrings 插入本地 Postgres/PostGIS 数据库。我使用 Python 2.7、psycopg2 和 ppygis。

每次我进行循环输入时,只有几条记录被插入到表中。我试图找出 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% 的表中几何列中没有数据。

4

2 回答 2

1

首先,psycopg2做自己的事务管理,所以你一般应该写:

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

请参阅psycopg2 文档

其次,考虑使用COPY. 请参阅COPYpsycopg2 文档

还可以考虑设置log_statement = 'all'并重新启动 PostgreSQL 服务器。检查日志,看看您是否能分辨出虚假插入的内容。postgresql.conflog_line_prefix

如果可行,向几何列添加一个CHECK和/或NOT NULL约束,这样任何不正确INSERT的 s 都会失败并向执行插入的程序报告错误。这可能有助于您诊断问题。

于 2013-07-15T08:09:55.423 回答
1

您如何确定 50% 的行没有几何数据?我会警告任何使用像 pgAdminIII 这样的客户端的人,如果它包含太多数据,则会显示一个空白单元格,所以它看起来是 NULL,而实际上它不是。您也可以直接在 Quantum GIS 等程序中查看 GIS 数据。

使用 SQL 客户端,确定线串是否真的存在的更好诊断方法是获取线串中的点数

SELECT car, ST_NumPoints(polyline) FROM gtrack_4326;

如果数字是空的,那么您的评估是正确的,它们是空的。否则,数据太大而无法在您的客户端应用程序中显示。

于 2013-07-16T01:16:51.397 回答