본문 바로가기
프로그래밍/기타 Python 모듈

shapely 모듈에 대해서 알아보자 - 기본편

by 부자 꽁냥이 2023. 3. 29.

파이썬(Python)에서 shapely 모듈을 이용하면 (1) 기본적인 도형과 도형의 특성(길이, 넓이 등)을 계산할 수 있고 (2) 도형을 그릴 수도 있다.

 

이번 포스팅에서는 shapely 기본편으로써 도형을 생성하고 특성을 계산하는 것과 도형을 그리는 방법에 대해서 알아본다.


   shapely 모듈 사용하기

shapely는 외장 모듈이므로 아래 명령어를 통하여 설치를 해줘야 한다.

 

pip install shapely

 

설치가 완료되었다면 이제 shapely에서 가장 많이 사용하는 객체에 대해서 알아본다.

1) 기본

a. Point

Point는 말 그대로 점을 의미한다. Point는 x, y 좌표를 순서대로 넣어주면 되고 필요에 따라서 z 좌표도 넣을 수 있다. x, y좌표를 접근할 수 있는 속성 그리고 길이와 넓이 정보를 가진 속성이 있다. 

 

아래 코드는 (2, 3)을 의미하는 Point 객체를 생성하고 x, y좌표 그리고 길이와 넓이를 출력하는 것이다. 물론 점이기 때문에 길이와 넓이는 모두 0이다.

 

from shapely import Point

point = Point(2,3) # (2, 3)

print('포인트의 길이 :', point.length)
print('포인트의 넓이 :', point.area)
print('포인트의 x좌표 :', point.x)
print('포인트의 y좌표 :', point.y)
print('포인트의 xy좌표 :', point.coords[:])

 


b. LineString

LineString은 (꺾인) 직선을 만들어주는 객체이며 튜플 또는 Point 객체를 담은 리스트를 초기값으로 갖는다. LineString은 길이와 넓이, xy 좌표 그리고 바운더리 정보를 갖는 속성이 있다. 이때 바운더리는 x좌표의 최소 최대, y좌표의 최소 최대 순으로 정보를 보여준다.

 

from shapely import LineString

line = LineString([(0, 0), (1, 1)])
# 또는 line = LineString([Point(0, 0), Point(1, 1)])

print('라인의 길이 :', line.length)
print('라인의 넓이 :', line.area)
print('라인의 xy좌표 :', line.coords[:])
print('라인의 바운더리 :', line.bounds)

 

 


c. LinearRing

LinearRing은 Ring이라는 이름에서 암시하듯이 직선으로 둘러싸인 객체를 생성한다. 초기값은 LinearString과 동일하게 튜플 또는 Point 객체를 담은 리스트로 주면 된다.

 

LinearRing도 LinearString과 같이 길이와 넓이, xy 좌표 그리고 바운더리 정보를 갖는 속성이 있다. 다만 xy좌표의 경우 마지막에 첫 번째 좌표가 추가되어 있다. 즉, xy좌표의 시작과 끝을 같게 하여 둘러싸인 직선을 만들게 되는 것이다.

 

from shapely import LinearRing

ring = LinearRing([(0, 0), (1, 2), (1, 0)])
## 또는 ring = LinearRing([Point(0, 0), Point(1, 2), Point(1, 0)])

print('길이 :', ring.length) ## 둘레와 같아짐.
print('넓이 :', ring.area)
print('xy 좌표 :', ring.coords[:])
print('바운더리 :', ring.bounds)

 


d. Polygon

Polygon 객체는 다각형을 나타내는 객체이며 LineString과 같이 튜플 또는 Point 객체를 담은 리스트를 초기값으로 준다. Polygon은 LineString 또는 LinearRing과는 다르게 coords 속성이 없는 것을 제외하고는 길이, 넓이 그리고 바운더리 정보를 얻을 수 있다.

 

from shapely import Polygon

polygon = Polygon([(0, 0), (0, 2), (2, 2), (2, 0)])
## 또는 polygon = Polygon([Point(0, 0), Point(0, 2), Point(2, 2), Point(2, 0)])

print('길이 :', polygon.length) ## 둘레와 같아짐.
print('넓이 :', polygon.area)
print('바운더리 :', polygon.bounds)

 

 

만약 다각형이 직사각형이라면 box를 이용하여 쉽게 생성할 수 있다. box에는 x좌표 최소값, y좌표 최소값, x좌표 최대값, y좌표 최대값을 차례대로 넣어준다. box가 반환하는 것은 Polygon 객체이므로 Polygon이 가지고 있는 속성들은 모두 갖고 있다.

 

from shapely import box
box_obj = box(0, 0, 2, 4) ## 좌하단이 (0,0) 우상단이 (2,4)인 직사각형

print('길이 :', box_obj.length) ## 둘레와 같아짐.
print('넓이 :', box_obj.area)
print('바운더리 :', box_obj.bounds)

 


2) 도형 그리기

이번엔 shapely에서 제공하는 그림 도구를 이용하여 시각화할 수도 있다. 보통 점을 그리기 위해선 plot_points, 직선을 그리기 위해선 plot_line 그리고 다각형을 그리기 위해선 plot_polygon을 이용한다. 아래 코드는 이러한 그림 그리기 함수를 사용하는 예제를 나타낸 것이다. 설명은 주석으로 대체한다.

 

from shapely.plotting import plot_points, plot_line, plot_polygon

fig, axs = plt.subplots(2, 2, figsize=(8,8))
fig.set_facecolor('white')
ax1 = axs[0, 0]
ax2 = axs[0, 1]
ax3 = axs[1, 0]
ax4 = axs[1, 1]

## Point 그리기
p1 = Point(0,0)
p2 = Point(1,1)
plot_points([p1, p2], ax=ax1, color='k', markersize=10) ## 두 점 그리기

## LineString 그리기
line = LineString([(0, 1), (2, 1), (0, 2), (2, 2), (3, 1), (1, 0)])
## 꺾은선 그리기, add_point는 마커를 넣을지 말지 결정, matplotlib 키워드 인자를 지원
plot_line(line, ax=ax2, add_points=True, color='blue', alpha=0.7) 

## LinearRing 그리기 
ring = LinearRing([(0, 0), (0, 2), (1, 1), (2, 2), (2, 0), (1, 0.5), (0, 0)])
plot_line(ring, ax=ax3, add_points=False, color='red', alpha=0.7)

## Polygon 그리기
polygon = Polygon([(0, 0), (0, 2), (2, 2), (2, 0)])
plot_polygon(polygon, ax=ax4, add_points=True, facecolor='red', edgecolor='k', alpha=0.3)

plt.show()

 


댓글


맨 위로