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

Posted

技术标签:

【中文标题】查找最小/最大纬度和经度【英文标题】:Find Minimum/Maximum latitude and Longitude 【发布时间】:2013-09-09 10:42:48 【问题描述】:

我的问题是如何从当前位置找到特定区域 (500 米) 的最小和最大纬度和经度。

就我而言,比如我需要从500meter 获取 XY CLLocation (纬度和经度)面积 查看我的图片(抱歉,这可能是糟糕的绘图)

我也不得不尝试谷歌搜索,我得到了这样的链接

How can i get minimum and maximum latitude and longitude using current location and radius?

但我不知道它在我的情况下是如何实现的。

请在这个问题上帮助我。

注意:我不想使用 CLLocationDistance distance = [currentLocation distanceFromLocation:newLocation];,因为它对我的情况没有帮助,所以..

【问题讨论】:

有什么理由不能使用 distanceFromLocation 吗?因为这是计算距离的最准确方法,您可以利用它来计算最小值和最大值。不要使用 111 号码,它只适用于赤道。 @brianLikeApple 因为我的数据库中有纬度和经度列表,所以每次检查该区域是否在我的位置(500 米)时都不好,所以.. 不,如果您的数据库真的很大,您不需要检查所有数据库。在这里,我说利用 distanceFromLocation 意味着您可以尝试通过添加或减去一些值来猜测 CLLocation 的位置。 distanceFromLocation 算法正在考虑您需要的一切,并为您提供更好的准确性。 我知道 :( 我在 DB 中有一个表,其中有 20,000 个数据,我只需要检索 500 米以下 500 米的纬度和经度数据,所以 distanceFromLocation: 对我来说更好我需要与 DB 中的所有纬度和经度进行比较:( 我认为他需要distanceFromLocation 的倒数才能确定周界点。 Parse.com 上提供了此类服务。不过,在当前情况下,使用数据库中的预过滤然后运行 ​​distanceFromLocation 函数以获得结果可能是一个更强大的解决方案。但是我们对应用程序的了解还不够,无法说这是否适用。 【参考方案1】:

如果您不需要真正精确的值,请使用1 degree is 111 km 的近似值。基于此,您需要在当前坐标上添加和删除 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 也会为您处理。

【讨论】:

不,你不能这样做。 1度是111公里,仅适用于赤道。然而,当一个人从赤道向极点移动时,经度度数乘以纬度的余弦值,距离减小,在极点处接近于零。【参考方案2】:

您必须从当前位置以公里为单位进行一些半径计算。

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 公里。

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

how to make mapview zoom to 5 mile radius of current location

看@Anurag 的回答

【讨论】:

【参考方案3】:

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

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

因此在您的情况下 RadiusInKm = 0.5

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

【讨论】:

【参考方案4】:

我会这样做。

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

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

【讨论】:

【参考方案5】:

这应该是正确的(在 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)));

【讨论】:

以上是关于查找最小/最大纬度和经度的主要内容,如果未能解决你的问题,请参考以下文章

从最小和最大纬度/经度创建多边形(矩形)

sql 所有州和主要地区的近似最大/最小纬度和经度

GSM小区(经度,纬度),它的扇区和一些物体(经度,纬度)

使用 C# 将半径添加到经度和纬度

根据圆形范围选择纬度和经度

查找具有纬度和经度的记录[重复]