【发布时间】:2013-12-29 18:11:11
【问题描述】:
我对使用坐标很感兴趣,我想知道,如何以米为单位获得两点(坐标)之间的距离。经过长时间的搜索,我找到了 Haversine 公式,以及它的 Objective-C 实现here。
如下(我自己稍微修改了一下):
- (CGFloat)directMetersFromCoordinate:(CLLocation *)from toCoordinate:(CLLocation *)to {
static const double DEG_TO_RAD = 0.017453292519943295769236907684886;
static const double EARTH_RADIUS_IN_METERS = 6372797.560856;
double latitudeArc = (from.coordinate.latitude - to.coordinate.latitude) * DEG_TO_RAD;
double longitudeArc = (from.coordinate.longitude - to.coordinate.longitude) * DEG_TO_RAD;
double latitudeH = sin(latitudeArc * 0.5);
latitudeH *= latitudeH;
double lontitudeH = sin(longitudeArc * 0.5);
lontitudeH *= lontitudeH;
double tmp = cos(from.coordinate.latitude*DEG_TO_RAD) * cos(to.coordinate.latitude*DEG_TO_RAD);
return EARTH_RADIUS_IN_METERS * 2.0 * asin(sqrt(latitudeH + tmp*lontitudeH)); }
我的问题是: 如何获得当前位置的 100 米距离(纬度和经度)? 这个公式对我来说太复杂了,我看不懂,所以我不能“把它编码回来”得到我想要的结果。
我只需要实际位置(巴黎、东京、伦敦、纽约等)和一个 (float) 数字表示纬度,一个 (float) 数字表示经度,其中 (float) 数字表示距城市 100 米的距离实际位置。
如果您打开this 页面,您可以在此处“计算”两点之间的 100 米距离(“实际”和一个 100 米距离)。
例如:
Point1: 47.0, 19.0 点2:47.0、19.0013190 --- 那是 0.1000 公里(100 米)的距离。
Point1: 47.0, 19.0 点 2:47.0008995, 19.0 --- 也是 0.1000 km (100 m) 的距离。
在这里你可以看到,在那个坐标(纬度 47.0 和经度 19.0)100 米的距离是 0.0008995(纬度)和 0.0013190(经度)。
我想借助 Haversine 公式获取这些数据,只是不知道如何。
你能帮我弄清楚吗?
谢谢!
更新: 感谢您的回答,现在我没有时间尝试它们,但据我所知,我没有准确解释我想要什么。 也许这是一个更好的例子,我想如何使用这些“100米”:
所以,现在我在坐标“lat x”和“lon y”。在另一个给定坐标“lat a”和“lon b”处还有另一个点(假设是一家酒店)。 我的问题是:如果这家酒店距离我(小于)100 米,我该如何计算?所以没关系,如果只是5米还是99米,两者距离我都小于(或等于)100米。
使用我提供的代码,我可以计算出来,这就是那个公式的用途。
但是,假设我有一百万个其他坐标(酒店位置)要使用。我只需要一份清单,离我(不到)100 米的地方。所以是的,这是一个半径为 100 米的圆圈,我需要其中的结果。
将这些“百万”酒店的所有坐标一一计算距离会花费更多的时间和资源,这就是为什么我认为计算出来会容易得多,纬度有多少100米和经度(改变我们在不同位置的值,这就是为什么我不能简单地使用我在上面的例子中计算出来的那些)。 因此,如果我知道纬度和经度有多少 100 米,例如在伦敦的坐标(如果我在那里),我可以简单地获取距离我(小于)100 米的酒店列表,通过简单划分:
if
((hotelLocation.coordinate.latitude <= (myLocation.coordinate.latitude + "100metersInLatitude")) || (hotelLocation.coordinate.latitude >= (myLocation.coordinate.latitude - "100metersInLatitude")))
&&
((hotelLocation.coordinate.longitude <= (myLocation.coordinate.longitude + "100metersInLongitude")) || (hotelLocation.coordinate.longitude >= (myLocation.coordinate.longitude - "100metersInLongitude")))
{
NSLog(@"Be Happy :-) !");
}
我只需要这些“100metersInLatitude”和“100metersInLongitude”,总是从“myLocation”计算而来。
哇哦,我希望有人能理解我刚刚写下的内容,因为这对我来说并不容易,也... :-)))
【问题讨论】:
-
你需要距离和方位(方向),否则你会得到一个圆(圆上的所有点到中心的距离都相同)
标签: objective-c haversine