【図解あり】 Django で GIS データを自在に操る! `gis.geos.PreparedGeometry.intersects()` の活用テクニック


このメソッドは、2 つの GEOSGeometry オブジェクトを引数として取ります。最初の引数は、検査対象のジオメトリを表し、2 番目の引数は、検査対象のジオメトリと交差しているかどうかを判定する基準となるジオメトリを表します。

メソッドは、2 つのジオメトリが交差しているかどうかを判定し、 True または False の値を返します。2 つのジオメトリが接触している場合でも、交差しているとはみなされません。

使用例

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

# 検査対象のジオメトリを作成
point = Point(2, 3)
polygon = Polygon((0, 0), (5, 0), (5, 5), (0, 5))

# 判定基準となるジオメトリを作成
comparison_polygon = Polygon((1, 1), (4, 1), (4, 4), (1, 4))

# 2 つのジオメトリが交差しているかどうかを判定
is_intersecting = point.intersects(comparison_polygon)

# 結果を出力
if is_intersecting:
    print("2 つのジオメトリは交差しています。")
else:
    print("2 つのジオメトリは交差していません。")

この例では、point ジオメトリが comparison_polygon ジオメトリと交差しているため、True が出力されます。

  • このメソッドは、複雑なジオメトリに対しては処理時間が長くなる場合があります。パフォーマンスが問題になる場合は、代わりに gis.geos.Geometry.within() メソッドを使用することを検討してください。
  • gis.geos.PreparedGeometry.intersects() メソッドは、空間参照システム (SRS) を考慮します。2 つのジオメトリが異なる SRS を使用している場合、結果は正しくありません。


点と多角形の交差判定

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

# 検査対象のジオメトリを作成
point = Point(2, 3)
polygon = Polygon((0, 0), (5, 0), (5, 5), (0, 5))

# 判定基準となるジオメトリを作成
comparison_polygon = Polygon((1, 1), (4, 1), (4, 4), (1, 4))

# 2 つのジオメトリが交差しているかどうかを判定
is_intersecting = point.intersects(comparison_polygon)

# 結果を出力
if is_intersecting:
    print("2 つのジオメトリは交差しています。")
else:
    print("2 つのジオメトリは交差していません。")

線と多角形の交差判定

from django.contrib.gis.geos import LineString, Polygon

# 検査対象のジオメトリを作成
line = LineString((0, 2), (5, 2))
polygon = Polygon((0, 0), (5, 0), (5, 5), (0, 5))

# 判定基準となるジオメトリを作成
comparison_polygon = Polygon((1, 1), (4, 1), (4, 4), (1, 4))

# 2 つのジオメトリが交差しているかどうかを判定
is_intersecting = line.intersects(comparison_polygon)

# 結果を出力
if is_intersecting:
    print("2 つのジオメトリは交差しています。")
else:
    print("2 つのジオメトリは交差していません。")

多角形と多角形の交差判定

from django.contrib.gis.geos import Polygon

# 検査対象のジオメトリを作成
polygon1 = Polygon((0, 0), (5, 0), (5, 5), (0, 5))
polygon2 = Polygon((2, 2), (7, 2), (7, 7), (2, 7))

# 2 つのジオメトリが交差しているかどうかを判定
is_intersecting = polygon1.intersects(polygon2)

# 結果を出力
if is_intersecting:
    print("2 つのジオメトリは交差しています。")
else:
    print("2 つのジオメトリは交差していません。")

この例では、polygon1 ジオメトリと polygon2 ジオメトリが交差しているため、True が出力されます。

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

# 検査対象のジオメトリを作成
point = Point(2, 3, srid=SRID(4326))  # WGS84

# 判定基準となるジオメトリを作成
comparison_polygon = Polygon((0, 0), (5, 0), (5, 5), (0, 5), srid=SRID(3857))  # Web Mercator

# 2 つのジオメトリが交差しているかどうかを判定
is_intersecting = point.intersects(comparison_polygon)

# 結果を出力
if is_intersecting:
    print("2 つのジオメトリは交差しています。")
else:
    print("2 つのジオメトリは交差していません。")


代替方法の選択基準

  • 機能性
    gis.geos.PreparedGeometry.intersects() メソッドは、2 つのジオメトリの交差のみを判定します。より高度な判定が必要な場合は、代わりに gis.geos.Geometry.relate() メソッドを使用することを検討してください。
  • 精度
    gis.geos.PreparedGeometry.intersects() メソッドは、境界線上の交差を検出できない場合があります。より高い精度が必要な場合は、代わりに gis.geos.Geometry.touches() メソッドを使用することを検討してください。
  • パフォーマンス
    gis.geos.PreparedGeometry.intersects() メソッドは、複雑なジオメトリに対しては処理時間が長くなる場合があります。パフォーマンスが問題になる場合は、代わりに gis.geos.Geometry.within() メソッドを使用することを検討してください。
  • gis.geos.Geometry.within() メソッド
    このメソッドは、1 つのジオメトリが別のジオメトリの内部にあるかどうかを判定します。gis.geos.PreparedGeometry.intersects() メソッドよりも高速で、境界線上の交差を検出できます。
from django.contrib.gis.geos import Point, Polygon

# 検査対象のジオメトリを作成
point = Point(2, 3)
polygon = Polygon((0, 0), (5, 0), (5, 5), (0, 5))

# 判定基準となるジオメトリを作成
comparison_polygon = Polygon((1, 1), (4, 1), (4, 4), (1, 4))

# 1 つのジオメトリが別のジオメトリの内部にあるかどうかを判定
is_within = point.within(comparison_polygon)

# 結果を出力
if is_within:
    print("point は comparison_polygon の内部にあります。")
else:
    print("point は comparison_polygon の内部にありません。")
  • gis.geos.Geometry.touches() メソッド
    このメソッドは、2 つのジオメトリが境界線で接触しているかどうかを判定します。gis.geos.PreparedGeometry.intersects() メソッドよりも精度が高く、境界線上の交差を検出できます。
from django.contrib.gis.geos import Point, Polygon

# 検査対象のジオメトリを作成
point = Point(2, 0)
polygon = Polygon((0, 0), (5, 0), (5, 5), (0, 5))

# 判定基準となるジオメトリを作成
comparison_polygon = Polygon((1, 1), (4, 1), (4, 4), (1, 4))

# 2 つのジオメトリが境界線で接触しているかどうかを判定
is_touching = point.touches(comparison_polygon)

# 結果を出力
if is_touching:
    print("2 つのジオメトリは境界線で接触しています。")
else:
    print("2 つのジオメトリは境界線で接触していません。")
  • gis.geos.Geometry.relate() メソッド
    このメソッドは、2 つのジオメトリの関係を詳細に判定します。gis.geos.PreparedGeometry.intersects() メソッドよりも機能性が高く、交差、包含、接触、離散などの関係を判定できます。
from django.contrib.gis.geos import Point, Polygon

# 検査対象のジオメトリを作成
point = Point(2, 3)
polygon = Polygon((0, 0), (5, 0), (5, 5), (0, 5))

# 判定基準となるジオメトリを作成
comparison_polygon = Polygon((1, 1), (4, 1), (4, 4), (1, 4))

# 2 つのジオメトリの関係を判定
relationship = point.relate(comparison_polygon)

# 結果を出力
if relationship == 'disjoint':
    print("2 つのジオメトリは離散です。")
elif relationship == 'intersects':
    print("2 つのジオメトリは交差しています。")
elif relationship == 'contains':
    print("point は comparison_polygon の内部にあります。")
elif relationship == 'within':
    print("comparison_polygon は point の内部にあります。")
elif relationship == 'touches':
    print