Python kullanarak PostGIS veritabanına Nokta eklemenin doğru yolu nedir?
Python kullanarak PostGIS veritabanına Nokta eklemenin doğru yolu nedir?
Yanıtlar:
İlk olarak, PostgreSQL için bir Pythonic arayüzü olan psycopg2 paketini kurun .
Sonra şunu kullanın 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
değerleri doğrulamak için kullanılabilir:
>>> cur.execute("SELECT ST_AsText(ST_SetSRID(ST_MakePoint(%s, %s, %s),4326));", (x, y, z))
>>> cur.fetchall()
[('POINT Z (32 34 0)',)]
notlar
(lat, lon)
olduğunu (y, x)
değil (x, y)
.(x, y, z)
için sonunda tupledik psycopg2
.LineString ve Polygon geometrileri gibi daha karmaşık geometriler için bunları Shapely ile işleyebilir, ardından hex kodlu WKB olarak psycopg2'den geçirebilirsiniz. 3B geometrilerin özellikle dışa aktarılmasını işlemek için Shapely 1.3 veya üstünün gerekli olduğunu unutmayın 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)
Ayrıca, geometrinin WKT'sini göndererek benzer bir işlemin gerçekleştirilebileceğini unutmayın, ancak metne dönüştürüldüğünden, kayıplıdır ve hassasiyetin angstromlarını azaltabilir. Geometrileri onaltılı kodlanmış WKB olarak aktarmak kayıpsızdır ve her koordinatın kesin hassasiyetini korur.
ST_MakePoint
Nokta geometrileri için mükemmel olan % 10 performans avantajlı bina noktaları vardır . Bununla birlikte, daha karmaşık geometri türleri oluşturmak Shapely ile genellikle daha basit olacaktır.