Shapely: ์  ๋ชฉ๋ก์—์„œ ๋‹ค๊ฐํ˜•์œผ๋กœ ๋ณ€ํ™˜

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

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

ํฌ๋Ÿผ์˜ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด์„œ ์—ฌ๊ธฐ์— ์งˆ๋ฌธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํŠธ ๋ชฉ๋ก์—์„œ ๋‹ค๊ฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” "ํ‘œ์ค€" ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด,

list_points = []
vertices = [Point(1,1), Point(2,2), Point(3,3)]
for i in xrange(len(vertices)):
    list_points.append(vertices[i])
polygon = Polygon(list_points)

์ด ์ฝ”๋“œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. convex_hull์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

poly = MultiPoint(list_points).convex_hull

๋‚ด๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธ๋‚ด์‹ฌ๊ณผ ์ข‹์€ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

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

๋‹ค์‹œ ์•ฝ๊ฐ„ ๋” ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

points = [Point(0,0), Point(2,2), Point(2,0)]
coords = [p.coords[:][0] for p in points]
poly = Polygon(coords)
poly.area

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

ํด๋ฆฌ๊ณค ๋ง(LinearRing์˜ ์ธ์Šคํ„ด์Šค)์€ ํฌ์ธํŠธ๋กœ ์ •์˜๋˜์ง€ ์•Š๊ณ  ์ขŒํ‘œ ํŠœํ”Œ ์‹œํ€€์Šค๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ ๊ณผ ์ขŒํ‘œ๋Š” Shapely์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Polygon ์ƒ์„ฑ์ž์— ์ ์˜ ์ขŒํ‘œ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด:

>>> points = [Point(0,0), Point(2,2), Point(2,0)]
>>> coords = sum(map(list, (p.coords for p in points)), [])
>>> poly = Polygon(coords)
>>> poly.area
2.0

์ด๋”ฐ๊ธˆ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ๊ณ„์†ํ•˜๋ฉด์„œ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

>>> points = [Point(0,0), Point(2,2), Point(2,0)]
>>> coords = [(p.x, p.y) for p in points]
>>> poly = Polygon(coords)
>>> poly.area
2.0

timeit์— ๋”ฐ๋ฅด๋ฉด ์บ์‹ฑ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ @sgillies ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ผ๊ด€๋˜๊ฒŒ 2/3 ๋” ๋น ๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(~65ยตs ๊ด‘์‚ฐ ๋Œ€ ~45ยตs ๊ทธ์˜ ๊ฒƒ). ๋”ฐ๋ผ์„œ ์ˆ˜์‹ญ์–ต ๊ฐœ์˜ ํฌ์ธํŠธ ๋˜๋Š” ํด๋ฆฌ์— ๋Œ€ํ•œ ์Šˆํผ ์šธํŠธ๋ผ ํ•˜๋“œ์ฝ”์–ด ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์‹œ ์•ฝ๊ฐ„ ๋” ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

points = [Point(0,0), Point(2,2), Point(2,0)]
coords = [p.coords[:][0] for p in points]
poly = Polygon(coords)
poly.area
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰