我正在构建一个iphone应用程序,我正在寻找一个如何让物体接近我的位置的想法。对象具有我的数据库中列出的地址。现在我有兴趣在地图上显示我附近的物体。我怎么得到那个房产?起初我想到了floyd-warshall但是有没有比自己编码更好的解决方案?
答案 0 :(得分:1)
您需要做的第一件事是在数据库中获取Lat Long位置而不是Addresses。谷歌提供的工具可以做到这一点。还有manual approach。
然后,您可以使用Haversine公式计算出是否在您所在位置的某个半径范围内。
这是一个例子。您可以在地图上循环浏览对象(位置)并查看它们离您有多远。
-(CGFloat) getDistance :(CGFloat)objLatitude :(CGFloat)objLongitude :(CGFloat)currentLocationLatitude :(CGFloat)currentLocationLongitude
{
CGFloat earthRadius = 6371;
CGFloat deltaLat = deg2rad(currentLocationLatitude - objLatitude);
CGFloat deltaLong = deg2rad(objLongitude - currentLocationLongitude);
CGFloat a = sin(deltaLat/2) * sin(deltaLat/2) +
cos(deg2rad(objLatitude)) * cos(deg2rad((double)currentLocationLatitude)) *
sin(deltaLong/2) * sin(deltaLong/2);
CGFloat c = 2 * atan2(sqrt(a), sqrt(1 - a));
CGFloat d = earthRadius * c;
d = round(d, 4); // round to 4dp
d = d * 1000; // convert from km to m
d = d * 0.621371192; // convert from km to miles
return d; // m
}
您可以修改此方法,如果它在特定距离内,则返回TRUE,如果不是,则返回FALSE:
-(BOOL) doesObjFallWithinMyRadius :(CGFloat)objLatitude :(CGFloat)objLongitude :(CGFloat)currentLocationLatitude :(CGFloat)currentLocationLongitude :(CGFloat)distanceLimit
{
CGFloat earthRadius = 6371;
CGFloat deltaLat = deg2rad(currentLocationLatitude - objLatitude);
CGFloat deltaLong = deg2rad(objLongitude - currentLocationLongitude);
CGFloat a = sin(deltaLat/2) * sin(deltaLat/2) +
cos(deg2rad(objLatitude)) * cos(deg2rad((double)currentLocationLatitude)) *
sin(deltaLong/2) * sin(deltaLong/2);
CGFloat c = 2 * atan2(sqrt(a), sqrt(1 - a));
CGFloat d = earthRadius * c;
d = round(d, 4); // round to 4dp
d = d * 1000; // convert from km to m
d = d * 0.621371192; // convert from km to miles
if(d < distanceLimit) return TRUE;
else return FALSE;
}
要查找您当前的位置,您需要使用属于iOS SDK的CLLocationManager。
答案 1 :(得分:1)
这可能不是您想要的解决方案,但这有助于您获得位置之间的距离。如果您在地图上绘制它们,您可能有坐标。然后,您可以使用distanceFromlocation:
CLLocation方法获取距离这些点到您所在位置的距离。然后你可以根据距离绘制它们。
答案 2 :(得分:0)
你见过KD-Tree吗?您可以使用它来查找您附近的地方。
当然,你必须假设地球是扁平的,但我不敢相信这会导致问题吗? :)尽管如此,这是一个有趣的数据结构。