4. 도형 컬렉션#


../../_images/multipolygons.svg

Fig. 4.1 Tyrol (오스트리아의 연방주)은 다중 다각형(MultiPolygon) 입니다 (그림 출처: Statistics Austria).#

 분석 사례에 따라, 하나의 특성(feature)에 여러 도형(예. 여러 점 또는 다각형)을 저장하는 것이 유용합니다. 예를 들어, 위 그림과 같이 Tyrol 지역은 두 개의 다각형으로 구성된 지역입니다. 두 다각형은 동일한 속성(예. 지역 명, 인구 수 등)을 공유합니다. 따라서, 두 다각형을 각각 특성으로 저장하는 것은 의미가 없습니다. 즉, 별도의 행으로 저장할 필요없이 여러 개의 다각형으로 구성된 MultiPolygon으로 표현하여 Tyrol 지역을 하나의 행(단일 특성)으로 나타낼 수 있습니다.

 Shapely에서 점(point)의 컬렉션은 MultiPoint, 선(line) 컬렉션은 MultiLineString, 다각형(polygon) 컬렉션은 MultiPolygon으로 구현됩니다.

from shapely.geometry import Point, LineString, MultiPoint, MultiLineString

# Point 객체 생성
point1 = Point(2.2, 4.2)
point2 = Point(7.2, -25.1)
point3 = Point(9.26, -2.456)

# MultiPoint 객체 생성
multipoint = MultiPoint([point1, point2, point3])
multipoint
../../_images/64a3e1c1161899c223b29dcc9dcd28d0221725529a43b22990bb26002bc42baa.svg
# LineString 객체 생성
line1 = LineString([point1, point2])
line2 = LineString([point2, point3])

# MultiLineString 객체 생성
multiline = MultiLineString([line1, line2])
multiline
../../_images/b7f7754dce831efa23299bfc20cf374e7002dcae93439de1a0fb9eddf7e29740.svg
print(multipoint)
print(multiline)
MULTIPOINT (2.2 4.2, 7.2 -25.1, 9.26 -2.456)
MULTILINESTRING ((2.2 4.2, 7.2 -25.1), (7.2 -25.1, 9.26 -2.456))

MultiPolygon도 유사한 방식으로 구성할 수 있습니다. 먼저, 다각형 하나를 생성해 줍니다.

from shapely.geometry import Polygon, MultiPolygon

left = Polygon([(-180, 90), (-180, -90), (0, -90), (0, 90)])
left
../../_images/a7c37ee861eec13a424cc5e0efdf1242b770408410103bb9c7413f43a62d4fec.svg
print(left)
POLYGON ((-180 90, -180 -90, 0 -90, 0 90, -180 90))

 Shapely에는 직사각형 형태의 “상자”를 만드는 함수 box가 있습니다. box 함수는 x, y 좌표의 최소, 최대값을 사용하여 경계 상자(bounding box)를 생성합니다. 두 번째 다각형을 만드는 데 shapely.geometry.box()를 사용해 보겠습니다.

from shapely.geometry import box
min_x = 0
max_x = 180
min_y = -90
max_y = 90

right = box(min_x, min_y, max_x, max_y)
right
../../_images/e742d35d42fe6d35eaf03500d82e3116cd5839300999de2e8a4b557f8e975f44.svg
print(right)
POLYGON ((180 -90, 180 90, 0 90, 0 -90, 180 -90))

 마지막으로, 두 다각형 left, rightMultiPolygon으로 결합할 수 있습니다.

# MultiPolygon 생성
multipolygon = MultiPolygon([left, right])
multipolygon
../../_images/b169cc2925a763a16be88b8b279be5c0089b12f1a4b70985f57961492819e63e.svg
print(multipolygon)
MULTIPOLYGON (((-180 90, -180 -90, 0 -90, 0 90, -180 90)), ((180 -90, 180 90, 0 90, 0 -90, 180 -90)))