Trong cơ sở dữ liệu, hình học được lưu trữ trên đĩa theo định dạng chỉ được sử dụng bởi chương trình PostGIS. Để các chương trình bên ngoài chèn và truy xuất hình học hữu ích, chúng cần được chuyển đổi thành định dạng mà các ứng dụng khác có thể hiểu được. May mắn thay, PostGIS hỗ trợ phát và tiêu thụ hình học ở một số lượng lớn các định dạng:
từ Giới thiệu về PostGIS
Với định dạng WKB:
Nhị phân nổi tiếng (WKB):
ST_GeomFromWKB (bytea) trả về hình học
ST_AsBinary (hình học) trả về bytea
ST_AsEWKB (hình học) trả về bytea
ogr nhận ra hình học không phải là kết quả bytea ( ST_AsEWKB()
)
# result -> bytea format:
query = "SELECT ST_AsEWKB(geom) FROM points LIMIT 1"
# result -> geometry from bytea:
query = "SELECT ST_GeomFromWKB(ST_AsEWKB(geom)) from points LIMIT 1;"
Kiểm tra với một trong các bảng của tôi:
không có gì:
query = """SELECT ST_AsText(ST_AsEWKB(geom)) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
print row[0]
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
và một hình học:
query = """SELECT ST_AsText(ST_GeomFromWKB(ST_AsEWKB(geom))) from mytable;"""
# result
cur.execute(query)
row = cur.fetchone()
print row
('POINT(272070.600041 155389.38792)',)
Vì vậy hãy cố gắng:
query = """SELECT ST_AsText(ST_GeomFromWKB(ST_AsEWKB(geom))) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
wkb = row[0];
geom = ogr.CreateGeometryFromWkb(wkb)
ERROR 3: OGR Error: Unsupported geometry type
Tại sao ?
Bởi vì kết quả của truy vấn là một chuỗi:
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
và không phải là mã byte.
Bạn cần giải mã chuỗi này (xem phần Tạo hình học từ WKB trong Sách dạy nấu ăn Python GDAL / OGR ).
Đó là lý do tại sao nó dễ sử dụng hơn nhiều:
1) các định dạng đầu ra khác (WKT, GeoJSON, ...)
query = """SELECT ST_AsGeoJSON(geom) from mytable;"""
cur.execute(query)
row = cur.fetchone()
point = ogr.CreateGeometryFromJson(row[0])
print "%d,%d" % (point.GetX(), point.GetY())
272070,155389
2) trực tiếp osgeo.ogr (Ví dụ: Làm thế nào để chuyển đổi bảng PostGIS thành Shapefile trong Python? )
geom = org.CreateGeometryFromWkb(wkb)
(nênogr
khôngorg
).