Cách đúng để chèn Điểm vào cơ sở dữ liệu PostGIS bằng Python là gì?
Cách đúng để chèn Điểm vào cơ sở dữ liệu PostGIS bằng Python là gì?
Câu trả lời:
Đầ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ú
(lat, lon)
là (y, x)
, không phải (x, y)
.(x, y, z)
đặt ở cuối để psycopg2
có thể xử lý thay thế.Đố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_hex
tí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 độ.
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.