座標変換のすべてがわかる! Django と gis.gdal.CoordTransform を使った詳細解説


django.contrib.gis は、Django フレームワークに地理空間機能を追加するためのモジュールです。 gis.gdal.CoordTransform クラスは、異なる座標系間の座標変換を行うためのツールを提供します。 このチュートリアルでは、gis.gdal.CoordTransform を使用して、ジオメトリを別の座標系に投影する方法を説明します。

以下の例では、WGS84 座標系 (SRID: 4326) から UTM 座標系 (SRID: 32610) にポイントを投影する方法を示します。

from django.contrib.gis.geos import Point
from django.contrib.gis.gdal import CoordTransform

# WGS84 座標系 (SRID: 4326) のポイントを作成
point = Point(51.505, -0.09)

# UTM 座標系 (SRID: 32610) への変換オブジェクトを作成
ct = CoordTransform(src_srs=4326, dst_srs=32610)

# ポイントを UTM 座標系に投影
projected_point = ct.transform(point)

# 投影されたポイントの座標を出力
print(projected_point.coords)

このコードを実行すると、次の出力が得られます。

(600000.0, 500000.0)
  1. まず、django.contrib.gis.geos から Point クラスと django.contrib.gis.gdal から CoordTransform クラスをインポートします。
  2. 次に、WGS84 座標系 (SRID: 4326) のポイントを作成します。
  3. その後、UTM 座標系 (SRID: 32610) への変換オブジェクトを作成します。
  4. 最後に、transform() メソッドを使用して、ポイントを UTM 座標系に投影します。 投影されたポイントは新しい Point オブジェクトとして返されます。
  5. coords 属性を使用して、投影されたポイントの座標を出力します。
  • エラー処理を適切に行うことを忘れないでください。
  • 複数の変換をパイプライン化して、より複雑な変換を実行できます。
  • gis.gdal.CoordTransform は、ジオメトリだけでなく、座標リストや文字列も変換に使用できます。


例 1: 単一ポイントの投影

from django.contrib.gis.geos import Point
from django.contrib.gis.gdal import CoordTransform

# WGS84 座標系 (SRID: 4326) のポイントを作成
point = Point(51.505, -0.09)

# UTM 座標系 (SRID: 32610) への変換オブジェクトを作成
ct = CoordTransform(src_srs=4326, dst_srs=32610)

# ポイントを UTM 座標系に投影
projected_point = ct.transform(point)

# 投影されたポイントの座標を出力
print(projected_point.coords)

例 2: 複数ポイントの投影

from django.contrib.gis.geos import MultiPoint
from django.contrib.gis.gdal import CoordTransform

# WGS84 座標系 (SRID: 4326) のポイントリストを作成
points = [
    Point(51.505, -0.09),
    Point(40.7128, -74.0060),
    Point(37.7833, -122.4167),
]

# マルチポイントオブジェクトを作成
multi_point = MultiPoint(points)

# UTM 座標系 (SRID: 32610) への変換オブジェクトを作成
ct = CoordTransform(src_srs=4326, dst_srs=32610)

# すべてのポイントを UTM 座標系に投影
projected_points = ct.transform_points(multi_point)

# 投影されたポイントの座標を出力
for point in projected_points:
    print(point.coords)

例 3: ラインストリングの投影

from django.contrib.gis.geos import LineString
from django.contrib.gis.gdal import CoordTransform

# WGS84 座標系 (SRID: 4326) のラインストリングを作成
line_string = LineString([
    Point(51.505, -0.09),
    Point(51.508, -0.131),
    Point(51.511, -0.16),
])

# UTM 座標系 (SRID: 32610) への変換オブジェクトを作成
ct = CoordTransform(src_srs=4326, dst_srs=32610)

# ラインストリングを UTM 座標系に投影
projected_line_string = ct.transform(line_string)

# 投影されたラインストリングの座標を出力
for point in projected_line_string.coords:
    print(point)
from django.contrib.gis.geos import Polygon
from django.contrib.gis.gdal import CoordTransform

# WGS84 座標系 (SRID: 4326) のポリゴンを作成
polygon = Polygon([
    Point(51.505, -0.09),
    Point(51.508, -0.131),
    Point(51.511, -0.16),
    Point(51.505, -0.16),
])

# UTM 座標系 (SRID: 3261


Proj ライブラリ

Proj は、Python で座標系変換を行うための汎用ライブラリです。 gis.gdal.CoordTransform よりも軽量で、より多くの座標系をサポートしています。

from proj import Proj

# WGS84 座標系 (SRID: 4326) から UTM 座標系 (SRID: 32610) への変換オブジェクトを作成
inproj = Proj(proj='longlat', ellps='WGS84', datum='WGS84')
outproj = Proj(proj='utm', zone=30, ellps='WGS84', datum='WGS84')

# WGS84 座標系 (SRID: 4326) のポイントを作成
point = (51.505, -0.09)

# ポイントを UTM 座標系に投影
x, y = outproj * inproj * point

# 投影されたポイントの座標を出力
print(x, y)

pyproj ライブラリ

pyproj は、Proj ライブラリのラッパーで、より使いやすいインターフェースを提供します。

from pyproj import CRS, transform

# WGS84 座標系 (SRID: 4326) と UTM 座標系 (SRID: 32610) を定義
in_proj = CRS.from_epsg(4326)
out_proj = CRS.from_epsg(32610)

# WGS84 座標系 (SRID: 4326) のポイントを作成
point = (51.505, -0.09)

# ポイントを UTM 座標系に投影
x, y = transform(in_proj, out_proj, point)

# 投影されたポイントの座標を出力
print(x, y)

GEOS ライブラリ

GEOS は、C言語で書かれた幾何学演算ライブラリで、Django contrib-gis によって Python で使用することができます。 Projpyproj ほど使いやすくはありませんが、より高度な幾何学演算を実行することができます。

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

# WGS84 座標系 (SRID: 4326) のポイントを作成
point = Point(51.505, -0.09)

# GEOSGeometry オブジェクトに変換
geos_point = GEOSGeometry(point)

# UTM 座標系 (SRID: 32610) への変換オブジェクトを作成
transform = GEOSGeometry('SRID=32610')

# ポイントを UTM 座標系に投影
projected_point = geos_point.transform(transform)

# 投影されたポイントの座標を出力
print(projected_point.coords)

空間データベース

PostGIS などの空間データベースを使用している場合は、データベース内で座標系変換を実行することができます。 これにより、パフォーマンスとスケーラビリティが向上します。

SELECT ST_Transform(point, 'SRID=32610');
  • すでに gis.gdal.CoordTransform を使用している場合は、コードを書き換える必要がない限り、そのまま使い続けることもできます。
  • パフォーマンスとスケーラビリティが重要な場合は、空間データベースを使用するのがおすすめです。
  • より高度な幾何学演算が必要な場合は、GEOS ライブラリがおすすめです。
  • シンプルで軽量な変換が必要な場合は、Proj または pyproj ライブラリがおすすめです。