objective-c - 经纬度中点到直线的最小距离

标签 objective-c xcode map distance latitude-longitude

我有一条线,有两个经纬度点
答: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/

相关文章:

objective-c - UIToolBar按钮图像

xcode - 在终端中的 Podfile 上使用 Pod Install 命令时出错

xcode - 在 Xcode 4 中更改鼠标的 i-beam 光标

android - Osmdroid map 旋转

java - 将 Set<Map.Entry<K, V>> 转换为 HashMap<K, V>

ios - 在 TableView 单元格中显示 "loading bar"

objective-c - 使用 PayPal 处理多件商品购买

ios - 在选项卡栏 Controller 中隐藏当前 View Controller 的选项卡

c - 体系结构 x86_64 MAC GCC 的 undefined symbol

c++ - 将 <string, function pointer> 插入 map