我可以做一个简单的计算,它会将km转换为一个值,我可以将其添加到lat或lon浮点数来计算搜索的边界框吗?它不需要完全准确。
例如:如果给我一个英国伦敦的纬度/经度(51.5001524,-0.1262362),我想计算从那个点开始东边/西边25公里的纬度,以及离北边25公里的东西/在那一点的南边,我需要做些什么才能将25公里转换为小数以添加到上面的值?
我正在寻找一般的经验法则,即:1km == +/- 0.XXX
修改
我对“lat lon”的原始搜索没有返回此结果:
How to calculate the bounding box for a given lat/lng location?
接受的答案似乎足以满足我的要求。
答案 0 :(得分:195)
大致的转化次数为:
这并不能完全纠正地球的极地平坦化 - 因为你可能想要使用WGS84参考椭球(用于GPS的模型)的更复杂的公式。但是对于您的目的,错误可能是微不足道的。
来源:http://en.wikipedia.org/wiki/Latitude
警告:请注意,latlong坐标以度数表示,而大多数(所有?)语言中的cos
函数通常接受弧度,因此需要degree to radians conversion
答案 1 :(得分:5)
如果你正在使用Java,Javascript或PHP,那么有一个库可以使用一些有趣的复杂(但仍然很快)的三角函数来完成这些计算:
答案 2 :(得分:1)
有趣的是,我没有提到UTM坐标。
https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system。
至少要在同一区域添加km,这应该很简单(在Python中:https://pypi.org/project/utm/)
utm.from_latlon和utm.to_latlon。
答案 3 :(得分:1)
为什么不使用正确制定的地理空间查询?
这是STContains地理空间功能上的SQL Server参考页:
或者,如果您不想使用框和弧度转换,则可以使用距离功能来查找所需的点:
DECLARE @CurrentLocation geography;
SET @CurrentLocation = geography::Point(12.822222, 80.222222, 4326)
SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km
几乎所有数据库都应该具有类似的功能。
如果您正确实施了地理空间索引,您的搜索将比您使用的方法快
答案 4 :(得分:0)
http://www.jstott.me.uk/jcoord/ - 使用此库
if (count($located) > 0) {
echo '<table>';
foreach($located as $locate){
echo "<tr><td>".$locate['computer_number']."</td><td>".$locate['name']."</td><"</td><td><img src=". base_url()."inc/images/confirm.png width='45' height='30' border='0' class='computer_number' data-id='".$locate['computer_number']."'/></td></tr>";
}
echo '</table>';
}
答案 5 :(得分:0)
感谢Jim Lewis的出色回答,我想通过我在Swift中的功能来说明此解决方案:
func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax
let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
return CLLocation(latitude: lat, longitude: lng)
}
在此用于转换距离的函数中,我使用以下公式:
latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))