Chèn một điểm vào PostGIS bằng Python


Câu trả lời:


21

Đầu tiên, cài đặt gói psycopg2 , giao diện Pythonic cho PostgreSQL.

Sau đó, sử dụng 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 có thể được sử dụng để xác nhận các giá trị:

>>> cur.execute("SELECT ST_AsText(ST_SetSRID(ST_MakePoint(%s, %s, %s),4326));", (x, y, z))
>>> cur.fetchall()
[('POINT Z (32 34 0)',)]

Ghi chú

  • Hãy nhớ rằng (lat, lon)(y, x), không phải (x, y).
  • Luôn sử dụng các tham số, thay vì thao tác chuỗi, để ngăn chặn SQL SQL . Trong ví dụ này, chúng tôi đã cài (x, y, z)đặt ở cuối để psycopg2có thể xử lý thay thế.

20

Đối với hình học phức tạp hơn, chẳng hạn như hình học LineString và Polygon, bạn có thể xử lý chúng bằng Shapely, sau đó chuyển chúng qua psycopg2 dưới dạng WKB được mã hóa hex. Lưu ý rằng Shapely 1.3 trở lên là bắt buộc để xử lý việc xuất hình học 3D với thuộc wkb_hextính.

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)

Lưu ý thêm rằng tương tự có thể được thực hiện bằng cách gửi WKT của hình học, tuy nhiên vì nó được chuyển đổi thành văn bản, nó bị mất và có thể làm giảm độ chính xác. Chuyển hình học dưới dạng WKB được mã hóa hex là không mất dữ liệu và bảo toàn độ chính xác chính xác của từng tọa độ.


Tuyệt vời cảm ơn bạn! Tôi tự hỏi nếu có một sự khác biệt hiệu suất giữa hai phương pháp này.
Adam Matan

Có 10% lợi thế xây dựng điểm với ST_MakePoint, đó là điểm tuyệt vời cho hình học điểm. Tuy nhiên, việc xây dựng các loại hình học phức tạp hơn thường sẽ đơn giản hơn với Shapely.
Mike T
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.