GML から GeoDjango オブジェクトを簡単作成:3 つの代替方法とサンプルコード


django.contrib.gis.gdal.OGRGeometry.from_gml() 関数は、GML (Geography Markup Language) 文字列を OGRGeometry オブジェクトに変換するために使用されます。 OGRGeometry オブジェクトは、空間データを表す Django のオブジェクトです。

使い方

この関数は次のように使用できます。

from django.contrib.gis.gdal import OGRGeometry

gml_string = '<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>10 20 20 40 40 20 20 10</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>'
geometry = OGRGeometry.from_gml(gml_string)

この例では、gml_string 変数は GML 文字列を格納します。 OGRGeometry.from_gml() 関数は、この文字列を OGRGeometry オブジェクトに変換し、geometry 変数に格納します。

引数

この関数は次の引数を取ります。

  • gml_string: GML 文字列

戻り値

この関数は OGRGeometry オブジェクトを返します。

次の例は、GML 文字列を OGRGeometry オブジェクトに変換し、そのオブジェクトのプロパティにアクセスする方法を示します。

from django.contrib.gis.gdal import OGRGeometry

gml_string = '<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>10 20 20 40 40 20 20 10</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>'
geometry = OGRGeometry.from_gml(gml_string)

print(geometry.geom_type)  # 'POLYGON' を出力
print(geometry.srs.name)  # 'EPSG:4326' を出力
print(geometry.area)  # 400.0 を出力
  • geometry.area プロパティは、ジオメトリの面積を返します。
  • geometry.srs プロパティは、ジオメトリの空間参照系 (SRS) を返します。
  • geometry.geom_type プロパティは、ジオメトリのタイプ (例: 'POINT'、'LINESTRING'、'POLYGON') を返します。


GML 文字列からポリゴンを作成

from django.contrib.gis.gdal import OGRGeometry

gml_string = '<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>10 20 20 40 40 20 20 10</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>'
geometry = OGRGeometry.from_gml(gml_string)

print(geometry.geom_type)  # 'POLYGON' を出力
print(geometry.srs.name)  # 'EPSG:4326' を出力
print(geometry.area)  # 400.0 を出力

ファイルから GML を読み込み、ポリゴンを作成

from django.contrib.gis.gdal import OGRGeometry

with open('my_gml_file.gml', 'r') as f:
    gml_string = f.read()

geometry = OGRGeometry.from_gml(gml_string)

print(geometry.geom_type)  # 'POLYGON' を出力
print(geometry.srs.name)  # 'EPSG:4326' を出力
print(geometry.area)  # 400.0 を出力

このコードは、my_gml_file.gml という名前のファイルから GML 文字列を読み込み、その文字列を OGRGeometry オブジェクトに変換します。

from django.contrib.gis.geos import from_json

geojson_string = '{"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[10, 20], [20, 40], [40, 20], [20, 10], [10, 20]]]}, "properties": {"name": "My Polygon"}}'
geometry = from_json(geojson_string)

print(geometry.geom_type)  # 'POLYGON' を出力
print(geometry.srs.name)  # None を出力
print(geometry.area)  # 400.0 を出力

このコードは、GeoJSON 文字列を GeoDjango の from_json() 関数を使用してジオメトリに変換します。 GeoJSON は、空間データを表現するために広く使用されている別のフォーマットです。

  • コードを実行する前に、django.contrib.gis アプリがインストールされていることを確認してください。
  • 上記のコードは、Django バージョン 5.0 を対象としています。他のバージョンを使用している場合は、API が異なる場合があります。


gis.gdal.OGRGeometry.from_gml() 関数は、GML 文字列を OGRGeometry オブジェクトに変換するために使用されます。 しかし、この関数はいくつかの制限があります。

  • 複雑な GML 構造を処理するのが難しい場合がある
  • GML 2.0 のみサポート

これらの制限を回避するために、gis.gdal.OGRGeometry.from_wkt() 関数と django.contrib.gis.geos.from_ewkt() 関数を使用することができます。

gis.gdal.OGRGeometry.from_wkt() 関数

gis.gdal.OGRGeometry.from_wkt() 関数は、WKT (Well-known Text) 文字列を OGRGeometry オブジェクトに変換するために使用されます。 WKT は、GML よりも簡潔で軽量な空間データ表現形式です。

from django.contrib.gis.gdal import OGRGeometry

wkt_string = 'POLYGON ((10 20, 20 40, 40 20, 20 10, 10 20))'
geometry = OGRGeometry.from_wkt(wkt_string)

print(geometry.geom_type)  # 'POLYGON' を出力
print(geometry.srs.name)  # None を出力
print(geometry.area)  # 400.0 を出力

django.contrib.gis.geos.from_ewkt() 関数

django.contrib.gis.geos.from_ewkt() 関数は、EWKT (Extended WKT) 文字列を GeoDjango の Geometry オブジェクトに変換するために使用されます。 EWKT は、WKT の拡張版であり、空間参照系 (SRS) に関する情報を追加することができます。

from django.contrib.gis.geos import from_ewkt

ewkt_string = 'SRID=4326;POLYGON ((10 20, 20 40, 40 20, 20 10, 10 20))'
geometry = from_ewkt(ewkt_string)

print(geometry.geom_type)  # 'POLYGON' を出力
print(geometry.srs.name)  # 'EPSG:4326' を出力
print(geometry.area)  # 400.0 を出力
  • GeoPandas を使用する
  • OGR ライブラリを直接使用する
  • コードを実行する前に、django.contrib.gis アプリがインストールされていることを確認してください。
  • 上記のコードは、Django バージョン 5.0 を対象としています。他のバージョンを使用している場合は、API が異なる場合があります。