And*_*rei 8 python geolocation kdtree nearest-neighbor scipy
输入:
point = (lat, long)
places = [(lat1, long1), (lat2, long2), ..., (latN, longN)]
count = L
Run Code Online (Sandbox Code Playgroud)
输出:
neighbors = places接近的子集point。(len(neighbors)=L)
问: 我可以用kd树的快速最近邻小号查找与纬度和经度点?(例如,在scipy中实现)
是否有必要在坐标x,y中转换该点的地理坐标(纬度和经度)?
这是解决此问题的最佳方法吗?
老实说,我不知道使用 kd 树是否可以正常工作,但我的直觉表明它是不准确的。
\n\n我认为你需要使用更大的圆距离之类的东西来获得准确的距离。
\n\n\nfrom math import radians, cos, sin, asin, sqrt, degrees, atan2\n\ndef validate_point(p):\n lat, lon = p\n assert -90 <= lat <= 90, "bad latitude"\n assert -180 <= lon <= 180, "bad longitude"\n\n# original formula from http://www.movable-type.co.uk/scripts/latlong.html\ndef distance_haversine(p1, p2):\n """\n Calculate the great circle distance between two points \n on the earth (specified in decimal degrees)\n Haversine\n formula: \n a = sin\xc2\xb2(\xce\x94\xcf\x86/2) + cos \xcf\x861 \xe2\x8b\x85 cos \xcf\x862 \xe2\x8b\x85 sin\xc2\xb2(\xce\x94\xce\xbb/2)\n _ ____\n c = 2 \xe2\x8b\x85 atan2( \xe2\x88\x9aa, \xe2\x88\x9a(1\xe2\x88\x92a) )\n d = R \xe2\x8b\x85 c\n\n where \xcf\x86 is latitude, \xce\xbb is longitude, R is earth\xe2\x80\x99s radius (mean radius = 6,371km);\n note that angles need to be in radians to pass to trig functions!\n """\n lat1, lon1 = p1\n lat2, lon2 = p2\n for p in [p1, p2]:\n validate_point(p)\n\n R = 6371 # km - earths\'s radius\n\n # convert decimal degrees to radians \n lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])\n\n # haversine formula \n dlon = lon2 - lon1\n dlat = lat2 - lat1\n\n a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2\n c = 2 * asin(sqrt(a)) # 2 * atan2(sqrt(a), sqrt(1-a))\n d = R * c\n return d\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4217 次 |
| 最近记录: |