计算旧+ n米的新经度,纬度


84

我想基于坐标和以米为单位的距离创建2个新经度和2个新纬度,我想在某个点周围创建一个不错的边界框。它是城市的一部分,最大±1500米。因此,我认为不必考虑地球的曲率。

所以我有50.0452345(x)和4.3242234(y),我想知道x + 500米,x-500米,y-500米,y + 500米

我发现了很多算法,但几乎所有算法似乎都处理点之间的距离。


Answers:


122

每经度的公里数约为

(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);

只要dxdy相比地球半径小,您就不会太靠近两极。


2
要将度数转换为弧度,可以乘以py,然后除以180。但是您写的是cos(latitude*180/pi)
josch 2014年

9
@josch:好收获。下次尝试更正答案,而不是简单地提出更正。许多人只是简单地从StackOverflow复制并粘贴代码,认为它是正确的并可以使用。
Alex Essilfie 2014年

4
好的,方向是什么?我的意思是,如果我想增加50米,它将在哪里增加?右,左,上还是下?
Tushar Monirul'2

3
地球不是完美的球形,因此对“半径”使用单个值是一个近似值。维基百科说:“从表面上的点到中心的距离范围为6,353 km至6,384 km”。它还说:“将地球建模为球体的几种不同方法,每种方法均会产生6,371 km的平均半径”,这表明您的价值。确实,如果此校正对您的应用程序很重要,则无论如何都应使用更好的算法。
nibot

4
对于不确定r_earth变量应以米为单位且应等于大约6371000.0的任何人
Amit Assaraf

26

公认的答案是完全正确的并且有效。我做了一些调整,然后变成了:

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);

希望这也会有所帮助。


27
0.0000089?尽量避免使用幻数,没人会理解。
scai 2016年

2
它是代码中地球直径和pi编号的缩写。不是魔术。
努曼·卡拉斯兰

16
如果没人知道如何重现这个数字,那仍然是魔术。为什么不将完整的计算结果放入代码中?
scai 2016年

13
谷歌地图中的1度等于111.32公里。1度= 111.32KM。1公里(度)= 1 / 111.32 = 0.008983。1M度= 0.000008983。
穆罕默德·阿泽姆

7
您应该在答案中发表评论,将其放入评论中并没有帮助。
chutsu

18

对于纬度,请执行以下操作:

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可以包含正值或负值。


8

您是否已签出:如何找到在给定纬度/经度以北x公里处的纬度/经度

这些计算充其量是令人讨厌的,我已经做了很多。Haversine配方将是您的朋友。

一些参考:http : //www.movable-type.co.uk/scripts/latlong.html


如果您在一个很小的区域工作,那么只做latitude-0.09和longtitude-0.0148来获得大约平方公里的面积真的不好吗?
本杰明·乌丁克

我会说这还不错。只要您要处理的纬度/经度为小数,该水平的平方公里都不会因地球的曲率而失真。
瑞安·特尼尔

1
@BenjaminUdinktenCate可以在阿姆斯特丹使用,但在世界其他地方可能不准确。在赤道处做“ longitude-0.0148”只会得到约0.16 km。
nibot 2011年

3

我不得不花大约两个小时来通过@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);
}

1

如果您不必非常精确,则:每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);

0
public double MeterToDegree(double meters, double latitude)
{
    return meters / (111.32 * 1000 * Math.Cos(latitude * (Math.PI / 180)));
}

-1
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});

2
请在回答中添加一些解释。
安娜

如果要将地图对象移动到当前地图中心附近约50米处,则可以使用带有+,-数字的代码代替+50
Eyni Kave 19/12/21
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.