在iOS上如何计算给定中心点经纬度和距离的边界框?

3
在我的iOS应用程序中,我有一个提供我的位置的纬度和经度。我想要计算满足距离d的边界框从我的位置开始。如何做到这一点?
第一个尝试: 我尝试使用@Neeku提供的解决方案。我可以看出它应该返回正确的信息,但不幸的是它有误差。所以我认为我不能使用它。
代码如下,我传入了1000米:
MKCoordinateRegion startRegion = MKCoordinateRegionMakeWithDistance(center, meters, meters);

CLLocationCoordinate2D northWestCorner, southEastCorner;

northWestCorner.latitude = startRegion.center.latitude + .5 * startRegion.span.latitudeDelta;
northWestCorner.longitude = startRegion.center.longitude - .5 * startRegion.span.longitudeDelta;
southEastCorner.latitude = startRegion.center.latitude - .5 * startRegion.span.latitudeDelta;
southEastCorner.longitude = startRegion.center.longitude - .5 * startRegion.span.longitudeDelta;

NSLog(@"CENTER <%@,%@>", @(center.latitude),@(center.longitude));
NSLog(@"NW <%@,%@>, SE <%@,%@>",@(northWestCorner.latitude),@(northWestCorner.longitude),@(southEastCorner.latitude),@(southEastCorner.longitude));

那么,结果如下: CENTER <38.0826682,46.3028721> NW <38.08717278501047,46.29717303828632>, SE <38.07816361498953,46.29717303828632>

我将其放在谷歌地图上,得到了这个结果:(见截图)

enter image description here

据我理解,1000米应该是从中心到盒子的边缘。而地图测量的是角落,应该是超过了1000米,但实际上只有800多米。这就是我要解决的问题。

我之前尝试过这种方法,但距离根本不准确。所以,这个解决方案对我来说没有用。如果您有更多建议或想指出这里做错了什么,请告诉我。

谢谢。


下面的方法怎么样?有没有反馈它是否有效? - Rinat Khanov
2个回答

5
假设您想要的距离为111米。那么您可以使用以下代码:
    // 111 kilometers / 1000 = 111 meters.
    // 1 degree of latitude = ~111 kilometers.
    // 1 / 1000 means an offset of coordinate by 111 meters.

    float offset = 1.0 / 1000.0;
    float latMax = location.latitude + offset;
    float latMin = location.latitude - offset;

    // With longitude, things are a bit more complex.
    // 1 degree of longitude = 111km only at equator (gradually shrinks to zero at the poles)
    // So need to take into account latitude too, using cos(lat).

    float lngOffset = offset * cos(location.latitude * M_PI / 180.0);
    float lngMax = location.longitude + lngOffset;
    float lngMin = location.longitude - lngOffset;

latMaxlatMinlngMaxlngMin 将给出您的边界框坐标。

(如果您需要的距离不是111米,可以轻松更改此代码。只需相应更新offset变量即可)。


2
你可以从纬度和经度中各减去/加上跨度的一半,即可得到所需的值:
CLLocationCoordinate2D centerCoord = CLLocationCoordinate2DMake(38.0826682, 46.3028721);
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(centerCoord, 1000, 1000);

double latMin = region.center.latitude - .5 * startRegion.span.latitudeDelta;
double latMax = region.center.latitude + .5 * startRegion.span.latitudeDelta;
double lonMin = region.center.longitude - .5 * startRegion.span.longitudeDelta;
double lonMax = region.center.longitude + .5 * startRegion.span.longitudeDelta;

请记住以下内容:

latitudeDelta

地图上显示的南北距离(以度为单位)。与经度不同,纬度一度大约相当于111公里(69英里)。


longitudeDelta

地图区域内显示的东西距离(以度为单位)。经度范围所跨越的公里数因当前纬度而异。例如,在赤道,一度经度跨越约111公里(69英里),但在极点处缩小至0公里。


好的解决方案,但是为什么要将 startRegion.span 的值乘以0.5? - Rinat Khanov
不起作用,意思是它相当偏离了。它没有给我正确的角落... 给定一个距离。 - zumzum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接