Який правильний спосіб вставити точку до бази даних PostGIS за допомогою Python?
Який правильний спосіб вставити точку до бази даних PostGIS за допомогою Python?
Відповіді:
По- перше, встановити psycopg2 пакет, інтерфейс Pythonic для PostgreSQL.
Потім використовуйте ST_MakePoint
:
>>> import psycopg2
>>> conn = psycopg2.connect(dbname=..., port=..., user=...,
password=..., host=...)
>>> cur = conn.cursor()
>>> x, y, z, = 32, 34, 0
>>> cur.execute("SELECT ST_SetSRID(ST_MakePoint(%s, %s, %s),4326);", (x, y, z))
>>> cur.fetchall()
[('01010000A0E6100000000000000000404000000000000041400000000000000000',)]
ST_AsText
можна використовувати для перевірки значень:
>>> cur.execute("SELECT ST_AsText(ST_SetSRID(ST_MakePoint(%s, %s, %s),4326));", (x, y, z))
>>> cur.fetchall()
[('POINT Z (32 34 0)',)]
Примітки
(lat, lon)
це (y, x)
не так (x, y)
.(x, y, z)
в кінці, щоб psycopg2
можна було обробляти заміну.Для більш складних геометрій, таких як LineString і Polygon geometries, ви можете обробити їх за допомогою Shapely, а потім передати їх через psycopg2 як шістнадцятковий WKB. Зауважте, що Shapely 1.3 або новішої версії потрібен для обробки експорту тривимірних геометрій із wkb_hex
властивістю.
import psycopg2
from shapely.geometry import LineString
from shapely import wkb
conn = psycopg2.connect('...')
curs = conn.cursor()
# Make a Shapely geometry
ls = LineString([(2.2, 4.4, 10.2), (3.3, 5.5, 8.4)])
ls.wkt # LINESTRING Z (2.2 4.4 10.2, 3.3 5.5 8.4)
ls.wkb_hex # 0102000080020000009A999999999901409A999999999911406666666666662440666666...
# Send it to PostGIS
curs.execute('CREATE TEMP TABLE my_lines(geom geometry, name text)')
curs.execute(
'INSERT INTO my_lines(geom, name)'
'VALUES (ST_SetSRID(%(geom)s::geometry, %(srid)s), %(name)s)',
{'geom': ls.wkb_hex, 'srid': 4326, 'name': 'First Line'})
conn.commit() # save data
# Fetch the data from PostGIS, reading hex-encoded WKB into a Shapely geometry
curs.execute('SELECT name, geom FROM my_lines')
for name, geom_wkb in curs:
geom = wkb.loads(geom_wkb, hex=True)
print('{0}: {1}'.format(name, geom.wkt))
# First Line: LINESTRING Z (2.2 4.4 10.2, 3.3 5.5 8.4)
Далі зауважте, що подібне може бути досягнуто шляхом надсилання WKT геометрії, однак, оскільки він перетворюється в текст, він є втратним і може зменшити точність точності. Передача геометрії як шістнадцятковий WKB без втрат і зберігає точну точність кожної координати.
ST_MakePoint
, що відмінно підходить для геометрії точок. Однак побудова більш складних типів геометрії, як правило, буде простішою з Shapely.