Python kullanarak PostGIS'e Nokta Ekleme


Yanıtlar:


21

İ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

  • Unutmayın (lat, lon)olduğunu (y, x)değil (x, y).
  • SQL enjeksiyonunu önlemek için her zaman dize manipülasyonları yerine parametreleri kullanın . Bu örneklerde , ikame ile başa çıkabilmek (x, y, z)için sonunda tupledik psycopg2.

20

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.


Mükemmel teşekkür ederim! Bu iki yaklaşım arasında bir performans farkı olup olmadığını merak ediyorum.
Adam Matan

ST_MakePointNokta 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.
Mike T
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.