我可以做一个简单的计算,将km转换为一个值,将该值添加到lat或lon float中,以计算搜索的边界框吗?它不需要完全准确。
例如:如果给了我英国伦敦的经纬度(51.5001524,-0.1262362),我想计算从那一点开始东/西25公里的经纬度,以及那个北/南25公里的经度。点,我需要怎么做才能将25公里转换为十进制以添加到上述值?
我正在寻找一般的经验法则,即:1km == +/- 0.XXX
编辑:
我对“ lat lon”的原始搜索未返回以下结果:
接受的答案似乎足以满足我的要求。
我可以做一个简单的计算,将km转换为一个值,将该值添加到lat或lon float中,以计算搜索的边界框吗?它不需要完全准确。
例如:如果给了我英国伦敦的经纬度(51.5001524,-0.1262362),我想计算从那一点开始东/西25公里的经纬度,以及那个北/南25公里的经度。点,我需要怎么做才能将25公里转换为十进制以添加到上述值?
我正在寻找一般的经验法则,即:1km == +/- 0.XXX
编辑:
我对“ lat lon”的原始搜索未返回以下结果:
接受的答案似乎足以满足我的要求。
Answers:
大致转换为:
对于地球的极地平坦度,这并不完全正确-因为您可能想要使用WGS84参考椭球(用于GPS的模型)更复杂的公式。但是对于您而言,该错误可能可以忽略不计。
资料来源:http : //en.wikipedia.org/wiki/Latitude
注意:请注意,拉特隆坐标是以度表示的,而cos大多数(所有)语言中的函数通常都接受弧度,因此需要度到弧度的转换。
cos(0°) = 1=>因此,在赤道进行计算时没有应用校正因子。经度是那里最宽的。cos(90°) = 0=>在极点,经度汇合为一点。没有要计算的距离。
如果您使用的是Java,Javascript或PHP,那么可以使用一些有趣的复杂(但仍很快)的三角函数来精确地执行这些计算:
http://www.jstott.me.uk/jcoord/-使用此库
LatLng lld1 = new LatLng(40.718119, -73.995667);
LatLng lld2 = new LatLng(51.499981, -0.125313);
Double distance = lld1.distance(lld2);
Log.d(TAG, "Distance in kilometers " + distance);
有趣的是,我没有提到UTM坐标。
https://zh.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system。
至少如果您要将km添加到同一区域,则它应该很简单(在Python中:https : //pypi.org/project/utm/)
utm.from_latlon和utm.to_latlon。
感谢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))
为什么不使用正确制定的地理空间查询?
这是STContains地理空间功能上的SQL Server参考页:
或者,如果您不想使用box和radian转换,则cna始终使用distance函数来查找所需的点:
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
几乎所有数据库都应该具有类似的功能。
如果正确实施了地理空间索引,您的搜索将比您使用的方法更快