在iOS上计算给定中心纬度/长度和距离的边界框?

时间:2014-07-31 15:36:24

标签: ios latitude-longitude core-location

在我的iOS应用程序中,我有一个lat和long,它给了我我的位置。我希望能够计算出与我的位置相距一定距离d的边界框。我怎么能这样做?

尝试1: 所以我尝试了@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&lt; 38.0826682,46.3028721&gt; NW&lt; 38.08717278501047,46.29717303828632&gt;,SE&lt; 38.07816361498953,46.29717303828632&gt;

然后我把它放在谷歌地图中并得到这个:(见截图)

enter image description here

那么据我所知,1000米应该从箱子的中心到两侧。地图正在测量应该超过 1000米的角落,它实际上只有800多米。这是我试图解决的问题。

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

谢谢

2 个答案:

答案 0 :(得分:2)

假设你想要的距离是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变量。

答案 1 :(得分:1)

您可以分别从纬度和经度中添加/减去一半的跨度,并获得所需的值:

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;

记住that

  

latitudeDelta

     

要在地图上显示的北 - 南距离(以度为单位)的数量。与纵向距离不同,纵向距离因此而异   纬度,一个纬度总是大约111   公里(69英里)。


  

longitudeDelta

     

要为地图区域显示的东西距离(以度为单位)的数量。一个跨越的公里数   经度范围根据当前纬度而变化。例如,一个   经度跨度约111公里   赤道(69英里),但在极地缩小到0公里。