查找最小/最大纬度和经度。

6
我的问题是如何找到特定区域(500米)的最小和最大纬度和经度,从当前位置开始。在我的情况下,例如,我需要从500米的区域中获取X和Y CLLocation(纬度和经度)。请参见我的图片(对于这个可能不太好的绘画,我很抱歉)。

enter image description here

我也试图使用谷歌搜索,得到了一些链接,例如: 如何使用当前位置和半径获取最小和最大纬度和经度? 但我不知道如何在我的情况下实现它。
请帮助我解决这个问题。
注意:我不想使用CLLocationDistance distance = [currentLocation distanceFromLocation:newLocation];,因为在我的情况下它没有用。

你不能使用distanceFromLocation吗?因为这是计算距离最准确的方法,你可以利用它来计算最小值和最大值。不要使用111数字,它只适用于赤道。 - brianLikeApple
@brianLikeApple 因为我在我的数据库中有一组纬度和经度列表,所以每次检查该区域是否在我的位置(500米)内都很麻烦。 - user2289379
我知道 :( 我的数据库中有一张表,其中包含20,000个数据,我需要检索那些在500米以下的lati和longi数据,因此距离distanceFromLocation:对我来说更好,即使与从数据库中检查所有lati和longi相比,仍然是如此。:( - user2289379
我认为他需要distanceFromLocation的逆函数以确定周边点。这种服务在Parse.com上可用。在当前情况下,在数据库中使用预过滤,然后对结果运行distanceFromLocation函数可能是一种更健壮的解决方案。但我们不知道应用程序足够了解是否适用于此。 - allprog
@allprog 是的,你说得对。如果你查看CLLocation distanceFromLocation的描述,它说:“该方法通过跟随地球曲率在两个位置之间绘制一条线来测量它们之间的距离。”因此它执行周长点的操作。但是,“所得到的弧是一个平滑的曲线,并不考虑两个位置之间的具体高度变化。” - brianLikeApple
显示剩余2条评论
5个回答

1
如果您不需要非常精确的值,那么可以使用近似值1度为111公里。基于此,您需要在当前坐标上添加和减去0.0025度,以获取您正在寻找的区域的角落。
rectanglesidelengthmeters = 500
degreedeltalat = 0.001 * (rectanglesidelengthmeters / 2.0) * cos(current.lon)
degreedeltalon = 0.001 * (rectanglesidelengthmeters / 2.0) * cos(current.lat)
minlat = current.lat - degreedeltalat
maxlat = current.lat + degreedeltalat
minlon = current.lon - degreedeltalon
maxlon = current.lon + degreedeltalon

你可能需要稍微调整结果,确保纬度在-90至90范围内,经度在-180至180范围内,但我认为CLClocation也会帮助你处理这个问题。


不,你不能这样做。111公里是一度经线仅适用于赤道。然而,随着离赤道越来越远向极地移动,一度经线将乘以纬度的余弦值,减小距离,在极点接近零。 - brianLikeApple

0

这应该是正确的(在php中)
https://www.movable-type.co.uk/scripts/latlong-db.html

$R = 6371;  // earth's mean radius, km
$rad = 0.5

// first-cut bounding box (in degrees)
$maxLat = $lat + rad2deg($rad/$R);
$minLat = $lat - rad2deg($rad/$R);
$maxLon = $lon + rad2deg(asin($rad/$R) / cos(deg2rad($lat)));
$minLon = $lon - rad2deg(asin($rad/$R) / cos(deg2rad($lat)));

0

你需要从当前位置开始进行一些以公里为单位的半径计算。

double kilometers = 0.5;
double curve = ABS( (cos(2 * M_PI * location.coordinate.latitude / 360.0) ));

MKCoordinateSpan span; 

span.latitudeDelta = kilometers/111; //like allprog said.
span.longitudeDelta = kilometers/(curve * 111); 

MKCoordinateRegion region;
region.span = span;
region.center = location.coordinate;

[self.mapView setRegion:region animated:YES];

这样我设置mapView显示距离区域为0.5公里。

编辑: 哇,我挖掘我的旧“喜欢”的问题来给你展示一些原始答案,但在接受的以下答案下找到了更好的一个:

如何使mapview缩放到当前位置的5英里半径

看看@Anurag的答案


0

要获得精确的值,您应该尝试使用

minLattitude = currentLattitude - (RadiusInKm/111.12);
maxLattitude = currentLattitude + (RadiusInKm/111.12);

因此在您的情况下,半径为0.5公里

要查找经度和最大经度数据,您需要遵循相同的步骤,但是必须将结果乘以纬度的余弦函数。


0

我会这样做。

double accuracy = 0.1;//How accurate do you want. Smaller value, slower perform
double distance = 500;//Distance you want
  1. 创建无限循环。
  2. 在循环中检查距离是否大于500。如果是,则退出循环。如果不是,则将0.1的值添加到纬度或经度。
  3. 使用上述方法获取最大经度、最大纬度、最小经度和最小纬度。
  4. 比较您的数据库,如果CLLocation在该值内,则返回。

我不能说这是解决您问题的最佳方法。因为我们正在猜测值...如果您知道如何从给定的距离转换CLLocation,那就更好了!


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