Shapely: ๋ผ์ธ์ŠคํŠธ๋ง์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์  ์–ป๊ธฐ

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

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,
ํ•œ ์ ์ด ์ฃผ์–ด์ง€๋ฉด ์„ ์ŠคํŠธ๋ง์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ์„ ์–ป์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์„ ์ŠคํŠธ๋ง์— ๋Œ€ํ•ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Python 3.4.0(๊ธฐ๋ณธ๊ฐ’, 2014๋…„ 4์›” 11์ผ, 13:05:11)
Linux์˜ [GCC 4.8.2]
์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด "๋„์›€๋ง", "์ €์ž‘๊ถŒ", "ํฌ๋ ˆ๋”ง" ๋˜๋Š” "๋ผ์ด์„ผ์Šค"๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.

shapely.geometry์—์„œ ์  ๊ฐ€์ ธ์˜ค๊ธฐ, LineString
๋ผ์ธ = ๋ผ์ธ์ŠคํŠธ๋ง([(0,0),(5,7),(12,6)])
p = ํฌ์ธํŠธ(4,8)
np = line.interpolate(line.project(p))
์ธ์‡„(np)
ํฌ์ธํŠธ (5 7)

๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ์„ ์ŠคํŠธ๋ง์˜ ๊ฒฝ์šฐ ์˜๋„ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.eg

๊ฒฝ๋กœ ์œ ๋„ ์„  = ([(19.119318,72.902800) (19.119660,72.901455) (19.119673,72.901401) (19.119848,72.900553) (19.119975,72.899972) (19.120129,72.899675) (19.120308,72.899385) (19.120589, 72.899162), (19.121131,72.898909) (19.121597,72.898739) (19.122330,72.898471) (19.122696,72.898429) (19.123296,72.897991) (19.123680,72.897623) (19.124095,72.897035) (19.124402,72.896411) (19.124483,72.896177) (19.124573,72.895796) (19.124585,72.895470) (19.124603,72.895014) (19.124652,72.894291) (19.124686,72.894067) (19.124929,72.893177) (19.124971,72.893049) ( 19.125097,72.892666) (19.125214,72.892323) (19.125450,72.891802) (19.125757,72.891281) (19.125951,72.890874) (19.126170,72.890413) (19.126833,72.889417) (19.127319,72.888873) (19.128909, 72.886714), (19.129060,72.886402) (19.129109,72.886299) (19.129238,72.885913) (19.129302,72.885370) (19.129372,72.881686) (19.129396,72.880652) (19.129413,72.880540) (19.129366,72.880167) ,(19.129382,72.880070),(19.129419,72.879849),(19.129509,72.879205),(19.129709,72. 877,766) (19.129969,72.876684) (19.130029,72.876511) (19.128367,72.875341) (19.127365,72.874602) (19.125882,72.873536) (19.125160,72.873014) (19.124815,72.872761) (19.124413,72.872457) (19.123149,72.871568) (19.122517,72.871091) (19.122162,72.870822) (19.121981,72.870749) (19.121736,72.870651) (19.121013,72.870576) (19.119933,72.870464) (19.119596,72.870432)])

๋ชฉ๋ก(๊ฒฝ๋กœ.์ขŒํ‘œ)
[(19.119318, 72.9028) (19.11966, 72.901455), (19.119673, 72.901401), (19.119848, 72.900553), (19.119975, 72.899972), (19.120129, 72.899675), (19.120308, 72.899385), (19.120589, 72.899162), ( 19.121131, 72.898909), (19.121597, 72.898739), (19.12233, 72.898471), (19.122696, 72.898429), (19.123296, 72.897991), (19.12368, 72.897623), (19.124095, 72.897035), (19.124402, 72.896411), (19.124483, 72.896177), (19.124573, 72.895796), (19.124585, 72.89547) (19.124603, 72.895014), (19.124652, 72.894291), (19.124686, 72.894067), (19.124929, 72.893177), (19.124971, 72.893049), (19.125097, 72.892666) (19.125214, 72.892323), (19.12545, 72.891802), (19.125757, 72.891281), (19.125951, 72.890874), (19.12617, 72.890413), (19.126833, 72.889417), (19.127319, 72.888873), (19.128909, 72.886714), ( 19.12906, 72.886402), (19.129109, 72.886299), (19.129238, 72.885913), (19.129302, 72.88537) (19.129372, 72.881686), (19.129396, 72.880652), (19.129413, 72.88054) (19.129366, 72.880167), (19.129382, 72.88007), (19) 0.129419, 72.879849), (19.129509, 72.879205), (19.129709, 72.877766), (19.129969, 72.876684), (19.130029, 72.876511), (19.128367, 72.875341), (19.127365, 72.874602), (19.125882, 72.873536), (19.12516 , 72.873014), (19.124815, 72.872761), (19.124413, 72.872457), (19.123149, 72.871568), (19.122517, 72.871091), (19.122162, 72.870822), (19.121981, 72.870749), (19.121736, 72.870651), (19.121013, 72.870576 ), (19.119933, 72.870464), (19.119596, 72.870432)]

๋=ํฌ์ธํŠธ(19.125150,72.893218)

np = route.interpolate(route.project(end))

์ธ์‡„(np)
ํฌ์ธํŠธ (19.12493833590478 72.89314854771877)

๊ฒฐ๊ณผ๊ฐ€ 19.124929, 72.893177์ด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฑด๊ฐ€์š”? ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

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

๋ฐ˜ํ™˜๋œ ์ ์€ ์„ ์—์„œ ์›๋ž˜ ์ ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ์€ ๋ฐ˜๋“œ์‹œ LineString์˜ ๊ธฐ์กด ์ •์ ์ด ์•„๋‹ˆ์–ด์•ผ _์•„๋‹™๋‹ˆ๋‹ค_. ์ด ๊ฒฝ์šฐ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

end = Point(19.125150,72.893218)
np = Point(19.12493833590478, 72.89314854771877)
expected = Point(19.124929, 72.893177)

print end.distance(np) # 0.000222767386696
print end.distance(expected) # 0.000224770994572

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ์„ ์ฐพ์œผ๋ ค๋ฉด ๋จผ์ € LineString์„ MultiPoint ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ nearest_points ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค๋ฅ˜ ์ฃผ์˜).

from shapely.ops import nearest_points
from shapely.geometry import MultiPoint
mp = MultiPoint(route)
print nearest_points(mp, end)[0] # POINT (19.124929 72.89317699999999)

์ด ์ฟผ๋ฆฌ์—์„œ๋Š” ์›๋ž˜ ์ ๊ณผ ์›๋ž˜ ์„ ์ŠคํŠธ๋ง์˜ ๊ฐ ๊ผญ์ง“์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๋ณต์žกํ•œ ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ ๋‹ค์†Œ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ณต๊ฐ„ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ฟผ๋ฆฌ๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” rtree ๋ชจ๋“ˆ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

http://toblerity.org/rtree/tutorial.html

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

๋ฐ˜ํ™˜๋œ ์ ์€ ์„ ์—์„œ ์›๋ž˜ ์ ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ์€ ๋ฐ˜๋“œ์‹œ LineString์˜ ๊ธฐ์กด ์ •์ ์ด ์•„๋‹ˆ์–ด์•ผ _์•„๋‹™๋‹ˆ๋‹ค_. ์ด ๊ฒฝ์šฐ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

end = Point(19.125150,72.893218)
np = Point(19.12493833590478, 72.89314854771877)
expected = Point(19.124929, 72.893177)

print end.distance(np) # 0.000222767386696
print end.distance(expected) # 0.000224770994572

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ์„ ์ฐพ์œผ๋ ค๋ฉด ๋จผ์ € LineString์„ MultiPoint ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ nearest_points ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค๋ฅ˜ ์ฃผ์˜).

from shapely.ops import nearest_points
from shapely.geometry import MultiPoint
mp = MultiPoint(route)
print nearest_points(mp, end)[0] # POINT (19.124929 72.89317699999999)

์ด ์ฟผ๋ฆฌ์—์„œ๋Š” ์›๋ž˜ ์ ๊ณผ ์›๋ž˜ ์„ ์ŠคํŠธ๋ง์˜ ๊ฐ ๊ผญ์ง“์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๋ณต์žกํ•œ ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ ๋‹ค์†Œ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ณต๊ฐ„ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ฟผ๋ฆฌ๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” rtree ๋ชจ๋“ˆ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

http://toblerity.org/rtree/tutorial.html

์˜ค ๊ทธ๋ ‡๊ตฐ์š” ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@snorfalorpagus . ๋‚˜๋Š” ์ด๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์—ˆ๋‹ค. ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ํ˜„๋ช…ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋„๊ตฌ์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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