查找最小/最大纬度和经度
Posted
技术标签:
【中文标题】查找最小/最大纬度和经度【英文标题】:Find Minimum/Maximum latitude and Longitude 【发布时间】:2013-09-09 10:42:48 【问题描述】:我的问题是如何从当前位置找到特定区域 (500 米) 的最小和最大纬度和经度。
就我而言,比如我需要从500
meter 获取 X 和 Y 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)));
【讨论】:
以上是关于查找最小/最大纬度和经度的主要内容,如果未能解决你的问题,请参考以下文章