Python을 사용하여 PostGIS에 포인트 삽입


11

Python을 사용하여 Point를 PostGIS 데이터베이스에 삽입하는 올바른 방법은 무엇입니까?

답변:


21

먼저 PostgreSQL 용 Pythonic 인터페이스 인 psycopg2 패키지를 설치하십시오 .

그런 다음 다음을 사용하십시오 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).
  • SQL 삽입방지 하려면 항상 문자열 조작 대신 매개 변수를 사용하십시오 . 이 예제에서 우리 (x, y, z)는 마지막에 터플 링 psycopg2하여 대체를 처리 할 수 ​​있습니다.

20

LineString 및 Polygon 지오메트리와 같은보다 복잡한 지오메트리의 경우 Shapely로 처리 한 다음 16 진 인코딩 된 WKB로 psycopg2를 통해 전달할 수 있습니다. wkb_hex속성을 사용하여 3D 형상 내보내기를 처리하려면 Shapely 1.3 이상이 필요 합니다.

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를 전송하여 유사한 작업을 수행 할 수 있지만, 텍스트로 변환되기 때문에 손실이 발생하여 정밀도의 옹스트롬을 줄일 수 있습니다. 16 진수로 인코딩 된 WKB로 형상을 전송하는 것은 무손실이며 각 좌표의 정확한 정밀도를 유지합니다.


훌륭 해요, 고맙습니다! 이 두 가지 접근 방식간에 성능 차이가 있는지 궁금합니다.
Adam Matan

을 사용하여 10 %의 성능 이점을 얻을 수 있습니다 ST_MakePoint. 이는 포인트 형상에 적합합니다. 그러나 Shapely를 사용하면보다 복잡한 형상 유형을 만드는 것이 일반적으로 더 간단합니다.
Mike T
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.