borders/scripts/poly2postgis.py
Alexey Zakharenkov c31a2caf0a SQL formatting
2020-10-23 01:13:45 +03:00

80 lines
1.8 KiB
Python
Executable file

#!/usr/bin/python
import glob
import psycopg2
def read_polygon(f):
"""Reads an array of coordinates with the final 'END' line."""
coords = []
while True:
line = f.readline()
# stop on EOF
if not line:
break
line = line.strip()
# stop on polygon end
if line == 'END':
break
# skip whitespace lines
if not line:
continue
# append coords
ords = line.split()
coords.append("%f %f" % (float(ords[0]), float(ords[1])))
if len(coords) < 3:
return None
if coords[0] != coords[-1]:
coords.append(coords[0])
return '({})'.format(','.join(coords))
def read_multipolygon(f):
"""Read the entire poly file and parse in into a WKT."""
polygons = []
cur_poly = []
while True:
title = f.readline().strip()
if not title:
return None
if title == 'END':
break
outer = title.strip()[0] != '!'
polygon = read_polygon(f)
if polygon != None:
if outer:
if cur_poly:
polygons.append('({})'.format(','.join(cur_poly)))
cur_poly = [polygon]
else:
cur_poly.append(polygon)
if cur_poly:
polygons.append('({})'.format(','.join(cur_poly)))
if len(polygons) == 1:
return "POLYGON" + polygons[0]
else:
return "MULTIPOLYGON({})".format(','.join(polygons))
def convert_poly(input_file, cur):
"""Reads a multipolygon from input_file and inserts it into borders table."""
with open(input_file, 'r') as f:
name = f.readline().strip()
wkt = read_multipolygon(f)
print ' ', name
try:
cur.execute('INSERT INTO borders (name, geom, modified) VALUES (%s, ST_GeomFromText(%s), now())', (name, wkt))
except psycopg2.Error as e:
print wkt
raise e
if __name__ == "__main__":
conn = psycopg2.connect('dbname=borders')
cur = conn.cursor()
for f in glob.iglob('*.poly'):
convert_poly(f, cur)
conn.commit()
cur.close()
conn.close()