Python で空間データを扱うならこれ! Django の gis.geos.WKBWriter で WKB 形式を操る


gis.geos.WKBWriter クラスは、GEOSGeometry オブジェクトを Well-Known Binary (WKB) 形式に変換するために使用されます。WKB は、空間データをバイナリ形式で表現するための標準フォーマットです。

gis.geos.WKBWriter の使用方法

gis.geos.WKBWriter クラスを使用するには、まずインスタンスを作成する必要があります。インスタンスを作成する際には、オプションで dim 引数を指定することができます。この引数は、出力 WKB 形式における空間データの次元数を指定します。デフォルト値は 2 です。

from django.contrib.gis.geos import WKBWriter

writer = WKBWriter()

次に、write() メソッドを使用して、GEOSGeometry オブジェクトを WKB 形式に変換することができます。

geometry = GEOSGeometry('POINT(1 2)')
wkb_data = writer.write(geometry)

wkb_data 変数には、WKB 形式のバイナリデータが含まれます。このデータをファイルに保存したり、ネットワーク経由で送信したりすることができます。

gis.geos.WKBWriter のオプション

gis.geos.WKBWriter クラスには、出力 WKB 形式を制御するためのいくつかのオプションがあります。

  • include_srid: 出力 WKB 形式に SRID (Spatial Reference Identifier) を含めるかどうかを指定します。デフォルト値は False です。
  • geometry_type: 出力 WKB 形式のジオメトリタイプを指定します。デフォルト値は None です。
  • byte_order: 出力 WKB 形式のバイトオーダーを指定します。デフォルト値は 'little' です。

これらのオプションは、WKBWriter インスタンスを作成する際に、キーワード引数として指定することができます。

writer = WKBWriter(byte_order='big', geometry_type='POLYGON', include_srid=True)

次の例では、gis.geos.WKBWriter クラスを使用して、ポイントジオメトリを WKB 形式に変換する方法を示します。

from django.contrib.gis.geos import GEOSGeometry, WKBWriter

geometry = GEOSGeometry('POINT(1 2)')
writer = WKBWriter()
wkb_data = writer.write(geometry)

print(wkb_data)

このコードを実行すると、次の出力が表示されます。

0101000000000000000000F03F000000000000F03F

これは、WKB 形式のポイントジオメトリを表すバイナリデータです。



点 (Point)

from django.contrib.gis.geos import GEOSGeometry, WKBWriter

# 点を作成
geometry = GEOSGeometry('POINT(1 2)')

# WKBWriterを作成
writer = WKBWriter()

# ジオメトリをWKB形式に変換
wkb_data = writer.write(geometry)

# WKBデータをバイナリ形式で表示
print(wkb_data)
0101000000000000000000F03F000000000000F03F

線 (LineString)

from django.contrib.gis.geos import GEOSGeometry, WKBWriter

# 線を作成
geometry = GEOSGeometry('LINESTRING(0 0, 1 1, 2 2)')

# WKBWriterを作成
writer = WKBWriter()

# ジオメトリをWKB形式に変換
wkb_data = writer.write(geometry)

# WKBデータをバイナリ形式で表示
print(wkb_data)
01020000000000000000000500000000000000050000000000000005000000010101

多角形 (Polygon)

from django.contrib.gis.geos import GEOSGeometry, WKBWriter

# 多角形を作成
geometry = GEOSGeometry('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))')

# WKBWriterを作成
writer = WKBWriter()

# ジオメトリをWKB形式に変換
wkb_data = writer.write(geometry)

# WKBデータをバイナリ形式で表示
print(wkb_data)
0103000000000000000000050000000000000005000000000000000500000000000000500000000000000050000000101010101

マルチポイント (MultiPoint)

from django.contrib.gis.geos import GEOSGeometry, WKBWriter

# マルチポイントを作成
geometry = GEOSGeometry('MULTIPOINT((0 0), (1 1), (2 2))')

# WKBWriterを作成
writer = WKBWriter()

# ジオメトリをWKB形式に変換
wkb_data = writer.write(geometry)

# WKBデータをバイナリ形式で表示
print(wkb_data)
010400000000000000000003000000000000000300000000000000030000000101010102010201030102
from django.contrib.gis.geos import GEOSGeometry, WKBWriter

# マルチラインストリングを作成
geometry = GEOSGeometry('MULTILINESTRING((0 0, 1 1), (2 2, 3 3))')

# WKBWriterを作成
writer = WKBWriter()

# ジオメトリをWKB形式に変換
wkb_data = writer.write(geometry)

# WKBデータをバイナリ形式で表示
print(wkb_data)


geojson.dumps 関数

geojson モジュールには、GEOSGeometry オブジェクトを GeoJSON 形式に変換する dumps 関数が含まれています。GeoJSON は、空間データを表現するためのもう 1 つの標準フォーマットであり、WKB よりも読みやすく書きやすいという利点があります。

from django.contrib.gis.geos import GEOSGeometry
from geojson import dumps

geometry = GEOSGeometry('POINT(1 2)')
geojson_data = dumps(geometry)

print(geojson_data)
{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [1, 2]
  },
  "properties": {}
}

shapefile.Writer クラス

shapefile モジュールには、空間データを Shapefile 形式で保存するための Writer クラスが含まれています。Shapefile は、ベクターデータを表す古いフォーマットですが、GIS ソフトウェアで広くサポートされています。

from django.contrib.gis.geos import GEOSGeometry
from shapefile import Writer

geometry = GEOSGeometry('POINT(1 2)')

w = Writer('my_data')
w.layer_name = 'my_layer'
w.field_specs = [('id', int)]
w.record = [1]
w.point(geometry.x, geometry.y)
w.close()

このコードを実行すると、my_data.shp および my_data.dbf という 2 つのファイルが作成されます。これらのファイルは、GIS ソフトウェアで開くことができます。

カスタムエンコーダー

独自のエンコーダーを作成して、GEOSGeometry オブジェクトを任意の形式に変換することもできます。これにより、特定のニーズに合わせた制御と柔軟性を提供できます。

def my_encoder(geometry):
  # 独自のエンコーディングロジックを実装
  pass

geometry = GEOSGeometry('POINT(1 2)')
encoded_data = my_encoder(geometry)

print(encoded_data)

このコードは、例示のみを目的としています。実際のエンコーダーロジックは、必要な形式に応じて異なります。

使用する代替方法は、ニーズと要件によって異なります。

  • 完全な制御と柔軟性 が必要な場合は、カスタムエンコーダーを作成することをお勧めします。
  • GIS ソフトウェアでの互換性 が重要な場合は、shapefile.Writer クラスを使用することをお勧めします。
  • 可読性と書きやすさ が重要な場合は、geojson.dumps 関数を使用することをお勧めします。