Postgresql 如何使用Python、psycopg2和ppygis将线字符串插入PostGIS数据库

Postgresql 如何使用Python、psycopg2和ppygis将线字符串插入PostGIS数据库,postgresql,python-2.7,geometry,postgis,psycopg2,Postgresql,Python 2.7,Geometry,Postgis,Psycopg2,我正在尝试将线字符串插入本地Postgres/PostGIS数据库。我使用Python2.7、psycopg2和ppygis 每次我进行循环输入时,表中只插入了几条记录。我试图找出莫格里菲的问题,但没有失败 polyline = [] for row in positions: lat = row[0] lon = row[1] point = ppygis.Point(lon, lat, srid=4326) polyline.append(point) linestr

我正在尝试将线字符串插入本地Postgres/PostGIS数据库。我使用Python2.7、psycopg2和ppygis

每次我进行循环输入时,表中只插入了几条记录。我试图找出莫格里菲的问题,但没有失败

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在每一列中显示数据,而在DB中,几乎50%的表在geometry列中没有数据

首先,
psycopg2
进行自己的事务管理,因此您通常应该编写:

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

第二,考虑批量加载数据>代码>复制< /代码>。看

还考虑在<代码> > PostgreSQL .CONF中设置“代码> LogyCalp= =‘全部’/CODE”和一个合适的<代码> LogyLyLyPrime< /代码>,然后重新启动PostgreSQL服务器。检查日志,看看你是否能分辨出假插入的原因


如果可行,请在“几何体”列中添加
检查
和/或
非空
约束,以便任何不正确的
插入
都将失败,并向执行插入的程序报告错误。这可能有助于您诊断问题。

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

对于SQL客户机,更好的诊断方法是确定是否确实存在linestring,即获取:

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

SELECT car, ST_NumPoints(polyline) FROM gtrack_4326;