Shapely: ํด๋ฆฌ ๋ผ๋ฒจ ๋ฒ„๊ทธ

์— ๋งŒ๋“  2020๋…„ 01์›” 08์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Toblerity/Shapely

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™๊ณผ ์‹ค์ œ ํ–‰๋™.

๊ตฌ๋ฉ์€ polylabel ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ shapely ๊ตฌํ˜„์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค๋ช…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

from shapely.geometry import Polygon
from shapely.algorithms.polylabel import polylabel
poly1=Polygon(shell=[(0,0),(10,0),(10,10),(0,10),(0,0)][::-1], holes=[[(2,2),(6,2),(6,6),(2,6),(2,2)]])
import geopandas
gdf2 = geopandas.GeoDataFrame(geometry=[poly1])
gdf2.plot()
label_location = polylabel(poly1, tolerance=0.05) 
print(label_location.x)
print(label_location.y)

์ด ์Šคํฌ๋ฆฝํŠธ์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

6.25
3.75

๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•ํ•œ ์œ„์น˜๋Š” 7.65625, 7.65625์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด ํด๋ฆฌ๊ณค์˜ ํ”Œ๋กฏ์„ ๋ณด๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

ํด๋ฆฌ๊ณค ์ •์˜์—์„œ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด ํด๋ฆฌ๊ณค์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์šด์˜ ์ฒด์ œ

๋ฆฌ๋ˆ…์Šค

๋งค๋ˆํ•œ ๋ฒ„์ „ ๋ฐ ์ถœ์ฒ˜

๋งค๋ˆํ•œ ๋ฒ„์ „ 1.6 ๋ฐ 1.7a3์—์„œ ํ…Œ์ŠคํŠธ๋จ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค @benediktbrandt. Shapely ๊ตฌํ˜„์€ ํด๋ฆฌ๊ณค ์™ธ๋ถ€๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋งŒ ๊ณ ๋ คํ•˜๋ฏ€๋กœ ๊ตฌ๋ฉ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Toblerity/Shapely/blob/cfa66d418fe3afe2fcb48438fcc9156142abaeb8/shapely/algorithms/polylabel.py#L44 -L53

ํด๋ฆฌ๊ณค ์™ธ๋ถ€๋ฅผ ๋ผ์ธ์ŠคํŠธ๋ง์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ƒ์„ฑ๋œ ๋ชจ๋“  ์…€์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ๋„ ์•ฝ๊ฐ„ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

https://github.com/mapbox/polylabel ์ž์ฒด์—์„œ ์ œ์•ˆํ•˜๋Š” ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

TypeScript์˜ ์›๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜:

import polylabel from "polylabel";

let exterior = [[0,0],[10,0],[10,10],[0,10],[0,0]];
let hole = [[2,2],[6,2],[6,6],[2,6],[2,2]];
let polygon = [exterior, hole]

console.log(polylabel(polygon, 0.01));
PS> .\node_modules\.bin\tsc test.ts
PS> node .\test.js
[ 7.65625, 7.65625 ]

๋งค๋ˆํ•œ:

>>> from shapely.ops import polylabel
>>> from shapely.geometry import Polygon
>>> exterior = [[0,0],[10,0],[10,10],[0,10],[0,0]]
>>> hole = [[2,2],[6,2],[6,6],[2,6],[2,2]]
>>> p = Polygon(exterior, [hole]) 
>>> polylabel(p, 0.01).coords[:]
[(6.25, 3.75)]

๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค @benediktbrandt. Shapely ๊ตฌํ˜„์€ ํด๋ฆฌ๊ณค ์™ธ๋ถ€๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋งŒ ๊ณ ๋ คํ•˜๋ฏ€๋กœ ๊ตฌ๋ฉ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Toblerity/Shapely/blob/cfa66d418fe3afe2fcb48438fcc9156142abaeb8/shapely/algorithms/polylabel.py#L44 -L53

ํด๋ฆฌ๊ณค ์™ธ๋ถ€๋ฅผ ๋ผ์ธ์ŠคํŠธ๋ง์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ƒ์„ฑ๋œ ๋ชจ๋“  ์…€์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ๋„ ์•ฝ๊ฐ„ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰