์๋
ํ์ญ๋๊น,
ํ ์ ์ด ์ฃผ์ด์ง๋ฉด ์ ์คํธ๋ง์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค. ๊ฐ๋จํ ์ ์คํธ๋ง์ ๋ํด ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
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
๋ชจ๋ ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ค ๊ทธ๋ ๊ตฐ์ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค.
@snorfalorpagus . ๋๋ ์ด๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ์ฐพ๊ณ ์์๋ค. ๋ถ๋ ์์์ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํ ํ๋ช ํ ์ ์์ด ์์ต๋๊น? ์ด ๋๊ตฌ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฐํ๋ ์ ์ ์ ์์ ์๋ ์ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ๋ฐ๋์ LineString์ ๊ธฐ์กด ์ ์ ์ด ์๋์ด์ผ _์๋๋๋ค_. ์ด ๊ฒฝ์ฐ์๋ ์กด์ฌํ์ง ์์ต๋๋ค.
๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ์ฐพ์ผ๋ ค๋ฉด ๋จผ์ LineString์ MultiPoint ์ง์ค๋ฉํธ๋ฆฌ๋ก ๋ณํํ ๋ค์
nearest_points
์ฐ์ฐ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค(๋ถ๋ ์์์ ์ค๋ฅ ์ฃผ์).์ด ์ฟผ๋ฆฌ์์๋ ์๋ ์ ๊ณผ ์๋ ์ ์คํธ๋ง์ ๊ฐ ๊ผญ์ง์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ผ ํฉ๋๋ค. ๋งค์ฐ ๋ณต์กํ ๊ฒฝ๋ก์ ๊ฒฝ์ฐ ๋ค์ ๋๋ฆด ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ณต๊ฐ ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ข ๋ฅ์ ์ฟผ๋ฆฌ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ง๋๋
rtree
๋ชจ๋ ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.http://toblerity.org/rtree/tutorial.html