我有一条线,有两个经纬度点
答:3.222895、101.719751
B: 3.227511, 101.724318
还有1分
C: 3.224972, 101.722932
如何计算点 C 和由点 A 和点 B 组成的线之间的最小距离? 如果你也能提供计算和objective-c代码就方便了。距离约为 89 米(使用 Google 地球中的标尺)。
最佳答案
感谢 mimi 和这篇很棒的文章 http://www.movable-type.co.uk/scripts/latlong.html但他们并没有给出全貌。这是一个细节。所有这些点都是使用 Google 地球收集的,使用 Placemark 来标记位置。确保在首选项中将纬度/经度设置为十进制。
lat A = 3.222895
lon A = 101.719751
lat B = 3.222895
lon B = 101.719751
lat C = 3.224972
lon C = 101.722932
Earth radius, R = 6371
<强>1。首先,你必须找到从 A 到 C 和 A 到 B 的方位。
轴承公式
bearingAC = atan2( sin(Δλ)*cos(φ₂), cos(φ₁)*sin(φ₂) − sin(φ₁)*cos(φ₂)*cos(Δλ) )
bearingAB = atan2( sin(Δλ)*cos(φ₂), cos(φ₁)*sin(φ₂) − sin(φ₁)*cos(φ₂)*cos(Δλ) )
φ为纬度,λ为经度,R为地球半径
<强>2。使用余弦球面定律求出 A 到 C 的距离
distanceAC = acos( sin(φ₁)*sin(φ₂) + cos(φ₁)*cos(φ₂)*cos(Δλ) )*R
<强>3。查找交叉轨道距离
distance = asin(sin(distanceAC/ R) * sin(bearingAC − bearing AB)) * R
Objective-C 代码
double lat1 = 3.227511;
double lon1 = 101.724318;
double lat2 = 3.222895;
double lon2 = 101.719751;
double lat3 = 3.224972;
double lon3 = 101.722932;
double y = sin(lon3 - lon1) * cos(lat3);
double x = cos(lat1) * sin(lat3) - sin(lat1) * cos(lat3) * cos(lat3 - lat1);
double bearing1 = radiansToDegrees(atan2(y, x));
bearing1 = 360 - ((bearing1 + 360) % 360);
double y2 = sin(lon2 - lon1) * cos(lat2);
double x2 = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lat2 - lat1);
double bearing2 = radiansToDegrees(atan2(y2, x2));
bearing2 = 360 - ((bearing2 + 360) % 360);
double lat1Rads = degreesToRadians(lat1);
double lat3Rads = degreesToRadians(lat3);
double dLon = degreesToRadians(lon3 - lon1);
double distanceAC = acos(sin(lat1Rads) * sin(lat3Rads)+cos(lat1Rads)*cos(lat3Rads)*cos(dLon)) * 6371;
double min_distance = fabs(asin(sin(distanceAC/6371)*sin(degreesToRadians(bearing1)-degreesToRadians(bearing2))) * 6371);
NSLog(@"bearing 1: %g", bearing1);
NSLog(@"bearing 2: %g", bearing2);
NSLog(@"distance AC: %g", distanceAC);
NSLog(@"min distance: %g", min_distance);
实际上有一个库可以做到这一点。你可以在这里找到它https://github.com/100grams/CoreLocationUtils
关于objective-c - 经纬度中点到直线的最小距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20231258/