我想基于坐标和以米为单位的距离创建2个新经度和2个新纬度,我想在某个点周围创建一个不错的边界框。它是城市的一部分,最大±1500米。因此,我认为不必考虑地球的曲率。
所以我有50.0452345
(x)和4.3242234
(y),我想知道x + 500米,x-500米,y-500米,y + 500米
我发现了很多算法,但几乎所有算法似乎都处理点之间的距离。
我想基于坐标和以米为单位的距离创建2个新经度和2个新纬度,我想在某个点周围创建一个不错的边界框。它是城市的一部分,最大±1500米。因此,我认为不必考虑地球的曲率。
所以我有50.0452345
(x)和4.3242234
(y),我想知道x + 500米,x-500米,y-500米,y + 500米
我发现了很多算法,但几乎所有算法似乎都处理点之间的距离。
Answers:
每经度的公里数约为
(2*pi/360) * r_earth * cos(theta)
其中theta
是在度纬度和r_earth
近似6378公里。
在所有位置,每个纬度的公里数大致相同,大约为
(2*pi/360) * r_earth = 111 km / degree
因此,您可以执行以下操作:
new_latitude = latitude + (dy / r_earth) * (180 / pi);
new_longitude = longitude + (dx / r_earth) * (180 / pi) / cos(latitude * pi/180);
只要dx
和dy
相比地球半径小,您就不会太靠近两极。
cos(latitude*180/pi)
公认的答案是完全正确的并且有效。我做了一些调整,然后变成了:
double meters = 50;
// number of km per degree = ~111km (111.32 in google maps, but range varies
between 110.567km at the equator and 111.699km at the poles)
// 1km in degree = 1 / 111.32km = 0.0089
// 1m in degree = 0.0089 / 1000 = 0.0000089
double coef = meters * 0.0000089;
double new_lat = my_lat + coef;
// pi / 180 = 0.018
double new_long = my_long + coef / Math.cos(my_lat * 0.018);
希望这也会有所帮助。
0.0000089
?尽量避免使用幻数,没人会理解。
对于纬度,请执行以下操作:
var earth = 6378.137, //radius of the earth in kilometer
pi = Math.PI,
m = (1 / ((2 * pi / 360) * earth)) / 1000; //1 meter in degree
var new_latitude = latitude + (your_meters * m);
对于经度,请执行以下操作:
var earth = 6378.137, //radius of the earth in kilometer
pi = Math.PI,
cos = Math.cos,
m = (1 / ((2 * pi / 360) * earth)) / 1000; //1 meter in degree
var new_longitude = longitude + (your_meters * m) / cos(latitude * (pi / 180));
该变量your_meters
可以包含正值或负值。
您是否已签出:如何找到在给定纬度/经度以北x公里处的纬度/经度?
这些计算充其量是令人讨厌的,我已经做了很多。Haversine配方将是您的朋友。
我不得不花大约两个小时来通过@nibot制定解决方案,我只需要一种方法来创建边界框,该边界框的中心点和宽度/高度(或半径)以千米为单位:
我在数学上/地理上都不了解解决方案。我调整了解决方案(通过尝试和错误)以获取四个坐标:
北:
private static Position FromKmToNPosition(Position p, double km)
{
double r_earth = 6378;
var pi = Math.PI;
var new_latitude = p.Lat + (km / r_earth) * (180 / pi);
return new Position(new_latitude, p.Long);
}
东:
private static Position FromKmToEPosition(Position p, double km)
{
double r_earth = 6378;
var pi = Math.PI;
var new_longitude = p.Long + (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
return new Position(p.Lat, new_longitude);
}
南:
private static Position FromKmToSPosition(Position p, double km)
{
double r_earth = 6378;
var pi = Math.PI;
var new_latitude = p.Lat - (km / r_earth) * (180 / pi);
return new Position(new_latitude, p.Long);
}
西方:
private static Position FromKmToWPosition(Position p, double km)
{
double r_earth = 6378;
var pi = Math.PI;
var new_longitude = p.Long - (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
return new Position(p.Lat, new_longitude);
}
如果您不必非常精确,则:每10000米的经纬度约为0.1。例如,我想从数据库中加载point_A周围3000米的位置:
double newMeter = 3000 * 0.1 / 10000;
double lat1 = point_A.latitude - newMeter;
double lat2 = point_A.latitude + newMeter;
double lon1 = point_A.longitude - newMeter;
double lon1 = point_A.longitude + newMeter;
Cursor c = mDb.rawQuery("select * from TABLE1 where lat >= " + lat1 + " and lat <= " + lat2 + " and lon >= " + lon1 + " and lon <= " + lon2 + " order by id", null);
var meters = 50;
var coef = meters * 0.0000089;
var new_lat = map.getCenter().lat.apply() + coef;
var new_long = map.getCenter().lng.apply() + coef / Math.cos(new_lat * 0.018);
map.setCenter({lat:new_lat, lng:new_long});