多边形坐标到PostgreSQL / PostGIS

时间:2016-12-20 03:55:20

标签: python postgresql

我有一个多边形坐标的geojson文件。尝试使用psycopg2 api在python中将坐标插入到postgreSQL数据库中。以下是我正在使用的坐标

"geometry": { "type": "Polygon", "coordinates": [ [ [ -74.0407457, 40.7130407 ], [ -74.0406424, 40.7130291 ], [ -74.0406471, 40.7130128 ], [ -74.0406625, 40.7130141 ], [ -74.0406659, 40.7130016 ], [ -74.0406531, 40.7129996 ], [ -74.0406377, 40.7129826 ], [ -74.0406401, 40.7129721 ], [ -74.04062, 40.7129693 ], [ -74.0406173, 40.7129823 ], [ -74.0405894, 40.7129785 ], [ -74.0405874, 40.7129932 ], [ -74.0405764, 40.7129914 ], [ -74.040574, 40.7129998 ], [ -74.040519, 40.7129937 ], [ -74.0405227, 40.7129752 ], [ -74.0404268, 40.712964 ], [ -74.0404235, 40.7129823 ], [ -74.0403662, 40.7129765 ], [ -74.0403675, 40.7129671 ], [ -74.0403578, 40.712966 ], [ -74.0403605, 40.7129508 ], [ -74.0403303, 40.7129475 ], [ -74.0403326, 40.7129368 ], [ -74.0403165, 40.7129348 ], [ -74.0403149, 40.7129465 ], [ -74.0402931, 40.7129571 ], [ -74.04028, 40.7129551 ], [ -74.040276, 40.7129698 ], [ -74.0402941, 40.7129737 ], [ -74.0402917, 40.7129805 ], [ -74.0403102, 40.7129828 ], [ -74.0403028, 40.7130151 ], [ -74.0403256, 40.7130184 ], [ -74.0403179, 40.7130608 ], [ -74.0403085, 40.7130596 ], [ -74.0403071, 40.7130669 ], [ -74.0402867, 40.7130646 ], [ -74.0402827, 40.7130875 ], [ -74.0402706, 40.7130862 ], [ -74.0402689, 40.7130962 ], [ -74.0402522, 40.7130944 ], [ -74.0402495, 40.7131083 ], [ -74.0402629, 40.7131104 ], [ -74.0402773, 40.7131251 ], [ -74.040275, 40.7131371 ], [ -74.040291, 40.7131388 ], [ -74.0402931, 40.7131256 ], [ -74.0403256, 40.7131292 ], [ -74.0403286, 40.7131144 ], [ -74.0403387, 40.7131155 ], [ -74.0403407, 40.7131078 ], [ -74.040398, 40.7131147 ], [ -74.040394, 40.713131 ], [ -74.0404902, 40.7131434 ], [ -74.0404939, 40.7131272 ], [ -74.0405492, 40.7131327 ], [ -74.0405469, 40.7131401 ], [ -74.0405573, 40.7131414 ], [ -74.0405546, 40.7131546 ], [ -74.0405864, 40.7131594 ], [ -74.0405841, 40.7131709 ], [ -74.0405978, 40.7131726 ], [ -74.0405998, 40.7131635 ], [ -74.040623, 40.7131516 ], [ -74.0406364, 40.7131531 ], [ -74.0406394, 40.7131363 ], [ -74.0406226, 40.7131343 ], [ -74.0406257, 40.7131211 ], [ -74.0407266, 40.713133 ], [ -74.0406843, 40.7133394 ], [ -74.0401087, 40.7132723 ], [ -74.0401036, 40.7132987 ], [ -74.0400151, 40.7132885 ], [ -74.0400165, 40.7132847 ], [ -74.0399266, 40.7132743 ], [ -74.0400315, 40.712747 ], [ -74.0407879, 40.7128354 ], [ -74.0407457, 40.7130407 ] ], [ [ -74.0400371, 40.7131942 ], [ -74.0401257, 40.7132042 ], [ -74.0401615, 40.7130218 ], [ -74.0400729, 40.7130118 ], [ -74.0400371, 40.7131942 ] ] ] }

要插入postgres,他们需要采用这种格式(下面的坐标来自http://www.postgis.net/docs/ST_GeomFromText.html

SELECT ST_GeomFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,
-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))');

本质上,列表需要是一个元组,并且坐标对不能用逗号分隔lat long值,并且不能有'或"围绕坐标

我无法想出一种创建这种数据格式的方法

我试过这个:

geojson = json.dumps(i['geometry'])
qry = "insert into AbeBuildings (geom) values(ST_SetSRID(ST_GeomFromGeoJSON(%s), 4326));"
cur.execute(qry,(geojson))

错误说

{"type": "Polygon", "coordinates": [[[-74.0410635, 40.7112018], [-74.0409077, 40.7119448], [-74.0408936, 40.7119431], [-74.0402319, 40.7118572], [-74.0403913, 40.7111239], [-74.0406334, 40.711153], [-74.0405859, 40.7113794], [-74.0406154, 40.7113997], [-74.0407442, 40.7114119], [-74.0407737, 40.7113936], [-74.04082, 40.7111725], [-74.0410635, 40.7112018]], [[-74.0406941, 40.7118065], [-74.0407382, 40.7116013], [-74.0405315, 40.7115758], [-74.0404874, 40.711781], [-74.0406941, 40.7118065]]]}
Traceback (most recent call last):
  File "C:\Users\Ralph\Desktop\myfile.py", line 28, in <module>
    cur.execute(qry,(geojson))
TypeError: not all arguments converted during string formatting

1 个答案:

答案 0 :(得分:0)

Psycopg2要求参数为列表或元组,您只需指定一个值。 请尝试以下方法:

cur.execute(qry, (geojson,))