データベース内では、ジオメトリはPostGISプログラムでのみ使用される形式でディスクに保存されます。外部プログラムが有用なジオメトリを挿入および取得するには、それらを他のアプリケーションが理解できる形式に変換する必要があります。さいわい、PostGISは多数のフォーマットでジオメトリの放出と消費をサポートしています。
以下からの紹介のPostGISへ
WKB形式の場合:
既知のバイナリ(WKB):
ST_GeomFromWKB(bytea)はジオメトリを返します
ST_AsBinary(geometry)はbyteaを返します
ST_AsEWKB(geometry)はbyteaを返します
ogrは、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;"
テーブルの1つでテストします。
何も:
query = """SELECT ST_AsText(ST_AsEWKB(geom)) from mytable;"""
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()
print row[0]
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
とジオメトリ:
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)',)
だから、試してみましょう:
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
どうして ?
クエリの結果が文字列であるため:
'01010000208A7A0000DD2571661A9B10410CCD751AEBF70241'
バイトコードではありません。
この文字列をデコードする必要があります(Python GDAL / OGRクックブックの WKBからジオメトリを作成するをご覧ください)。
そのため、使用がはるかに簡単です。
1)その他の出力形式(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)直接osgeo.ogr(たとえば、PythonでPostGISテーブルをShapefileに変換する方法?)
geom = org.CreateGeometryFromWkb(wkb)
はずです)。ogr
org