gis.geos.Polygon.num_interior_ringsの便利な使い方とサンプルコード集


gis.geos.Polygon.num_interior_rings メソッドは、ポリゴン内の内側の輪郭の数を返します。内側の輪郭とは、ポリゴンの外部輪郭(外側境界)に囲まれた領域を指します。

使い方

from django.contrib.gis.geos import Polygon

# ポリゴンを作成
polygon = Polygon(((0, 0), (0, 5), (5, 5), (5, 0)), ((1, 1), (2, 2), (3, 1), (2, 0)))

# 内側の輪郭の数を出力
num_interior_rings = polygon.num_interior_rings
print(num_interior_rings)  # 出力: 1

上記の例では、2つの輪郭を持つポリゴンを作成します。1つ目は外部輪郭で、もう1つ目は内側の輪郭です。num_interior_rings メソッドは、内側の輪郭が1つ存在することを検出し、1を返します。

  • 多角形コレクション(MultiPolygon)の場合、num_interior_rings メソッドは個々のポリゴンの内側の輪郭の数を合計した値を返します。
  • ポリゴンに内側の輪郭がない場合は、num_interior_rings メソッドは0を返します。


from django.contrib.gis.geos import MultiPolygon

# 多角形コレクションを作成
multipolygon = MultiPolygon([
    Polygon(((0, 0), (0, 5), (5, 5), (5, 0)), ((1, 1), (2, 2), (3, 1), (2, 0))),
    Polygon(((6, 0), (6, 5), (11, 5), (11, 0)), ((7, 1), (8, 2), (9, 1), (8, 0)))
])

# 内側の輪郭の合計数を取得
total_num_interior_rings = 0
for polygon in multipolygon:
    total_num_interior_rings += polygon.num_interior_rings

print(total_num_interior_rings)  # 出力: 2

穴を持つポリゴンの内側の輪郭の数を取得

from django.contrib.gis.geos import Polygon

# 穴を持つポリゴンを作成
polygon = Polygon(((0, 0), (0, 10), (10, 10), (10, 0)), ((2, 2), (4, 2), (4, 4), (2, 4)))

# 内側の輪郭の数を取得
num_interior_rings = polygon.num_interior_rings
print(num_interior_rings)  # 出力: 1

複数のポリゴンを含むジオメトリコレクションの内側の輪郭の数を取得

from django.contrib.gis.geos import GeometryCollection

# 複数のポリゴンを含むジオメトリコレクションを作成
geometry_collection = GeometryCollection([
    Polygon(((0, 0), (0, 5), (5, 5), (5, 0)), ((1, 1), (2, 2), (3, 1), (2, 0))),
    Polygon(((6, 0), (6, 5), (11, 5), (11, 0)), ((8, 1), (9, 2), (10, 1), (9, 0)))
])

# 内側の輪郭の合計数を取得
total_num_interior_rings = 0
for geometry in geometry_collection:
    if geometry.geom_type == 'Polygon':
        total_num_interior_rings += geometry.num_interior_rings

print(total_num_interior_rings)  # 出力: 2

説明

  • 3つ目の例では、GeometryCollection オブジェクト内のすべてのポリゴンの内側の輪郭の数を合計しています。
  • 2つ目の例では、穴を持つポリゴンの内側の輪郭の数を取得しています。
  • 1つ目の例では、MultiPolygon オブジェクトの各ポリゴンの内側の輪郭の数を合計しています。

これらの例は、num_interior_rings メソッドがさまざまなタイプのジオメトリに対してどのように使用できるかを示しています。

  • 複雑な形状を持つジオメトリを扱う場合は、num_interior_rings メソッド以外にも、exterior_ringinteriors などのプロパティを使用する必要がある場合があります。
  • 上記のコードはあくまで一例であり、状況に合わせて調整する必要があります。


len(polygon.interiors) を使用する

polygon.interiors プロパティは、ポリゴンの内側の輪郭のリストを返します。リストの長さを取得することで、内側の輪郭の数をカウントできます。

from django.contrib.gis.geos import Polygon

# ポリゴンを作成
polygon = Polygon(((0, 0), (0, 5), (5, 5), (5, 0)), ((1, 1), (2, 2), (3, 1), (2, 0)))

# 内側の輪郭の数を取得
num_interior_rings = len(polygon.interiors)
print(num_interior_rings)  # 出力: 1

polygon.is_simple を使用する

polygon.is_simple プロパティは、ポリゴンが単純かどうかを返します。単純なポリゴンは、内側の輪郭がありません。

from django.contrib.gis.geos import Polygon

# ポリゴンを作成
polygon = Polygon(((0, 0), (0, 5), (5, 5), (5, 0)))

# ポリゴンが単純かどうかを確認
is_simple = polygon.is_simple

# 内側の輪郭の数を取得
num_interior_rings = 0 if is_simple else 1

print(num_interior_rings)  # 出力: 0

カスタム関数を使用する

独自のロジックを使用して、内側の輪郭の数をカウントするカスタム関数を作成することもできます。この方法は、より複雑なポリゴンを扱う場合に役立ちます。

from django.contrib.gis.geos import Polygon


def count_interior_rings(polygon):
    num_interior_rings = 0
    for interior in polygon.interiors:
        if interior:
            num_interior_rings += 1
    return num_interior_rings

# ポリゴンを作成
polygon = Polygon(((0, 0), (0, 5), (5, 5), (5, 0)), ((1, 1), (2, 2), (3, 1), (2, 0)))

# 内側の輪郭の数を取得
num_interior_rings = count_interior_rings(polygon)
print(num_interior_rings)  # 出力: 1

Shapely ライブラリを使用する

Shapely は、Python で空間データ処理を行うためのライブラリです。Shapely を使用して、ポリゴンの内側の輪郭の数を取得することもできます。

import shapely.geometry as sh

# Shapely ポリゴンを作成
shapely_polygon = sh.Polygon([(0, 0), (0, 5), (5, 5), (5, 0), (1, 1), (2, 2), (3, 1), (2, 0)])

# 内側の輪郭の数を取得
num_interior_rings = len(shapely_polygon.interiors)
print(num_interior_rings)  # 出力: 1
方法利点欠点
len(polygon.interiors)シンプルで分かりやすい複雑なポリゴンには不向き
polygon.is_simpleシンプルで高速穴を持つポリゴンには不向き
カスタム関数柔軟性が高い開発コストがかかる
Shapely ライブラリ高機能別途ライブラリのインストールが必要