이전 + n 미터에서 새로운 경도, 위도 계산


84

좌표와 거리 (미터)를 기준으로 2 개의 새로운 경도와 2 개의 새로운 위도를 만들고 싶습니다. 특정 지점 주변에 멋진 경계 상자를 만들고 싶습니다. 도시의 일부이며 최대 ± 1500 미터입니다. 그러므로 나는 지구의 곡률을 고려해야한다고 생각하지 않습니다.

그래서 저는 50.0452345(x)와 4.3242234(y)가 있고 x + 500 미터, x-500 미터, y-500 미터, y + 500 미터를 알고 싶습니다.

많은 알고리즘을 찾았지만 거의 모든 것이 점 사이의 거리를 다루는 것 같습니다.


답변:


122

경도 당 킬로미터 수는 약

(2*pi/360) * r_earth * cos(theta)

theta위도는 어디 이며 r_earth약 6378km입니다.

위 도당 킬로미터 수는 모든 위치에서 거의 동일합니다.

(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땅의 반경에 비해 작고 너무 가까이 극으로하지 않습니다.


2
라디안 당신 곱 (180)에 의해 평 및 분할에 그러나 당신이 쓸 수있는 정도 변환하는 방법cos(latitude*180/pi)
josch

9
@josch : 좋은 캐치. 단순히 정정을 제안하는 대신 다음 번에 정답을 정정하십시오. 많은 사람들이 코드가 정확하고 사용할 준비가되었다고 생각하여 StackOverflow에서 코드를 복사하여 붙여 넣습니다.
Alex Essilfie 2014-07-04

4
좋아요, 방향은 어떻게 될까요? 50 미터를 추가하려면 어디에 추가 되나요? 오른쪽, 왼쪽, 위 또는 아래?
Tushar Monirul

3
지구는 완전한 구형이 아니므로 "반지름"에 단일 값을 사용하는 것은 근사치입니다. Wikipedia는 "표면의 지점에서 중심까지의 거리는 6,353km에서 6,384km"라고 말합니다. 또한 "지구를 구체로 모델링하는 여러 가지 방법은 각각 6,371km의 평균 반경을 산출합니다."라고 말하며 이는 귀하의 가치를 나타냅니다. 실제로이 수정이 애플리케이션에서 중요하다면 어쨌든 더 나은 알고리즘을 사용해야합니다.
nibot

4
r_earth 변수가 미터 단위 여야하고 대략 6371000.0과 같아야한다는 확신이없는 사람을 위해
Amit Assaraf 2017

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

2
코드에서 지구 직경과 파이 번호의 짧은 버전입니다. 마법이 아닙니다.
Numan Karaaslan 2016

16
이 숫자를 재현하는 방법을 아무도 모른다면 여전히 마술입니다. 전체 계산을 코드에 넣지 않는 이유는 무엇입니까?
SCAI

13
구글지도에서 1 도는 111.32 킬로미터와 같습니다. 1도 = 111.32KM. 도에서 1KM = 1 / 111.32 = 0.008983. 도 1M = 0.000008983.
Muhammad Azeem

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

체크 아웃 했습니까 ? 주어진 위도 / 경도에서 북쪽으로 xkm 인 위도 / 경도를 어떻게 찾 습니까?

이러한 계산은 기껏해야 성가신 일이며 많은 작업을 수행했습니다. haversine 공식은 당신의 친구가 될 것입니다.

일부 참조 : http://www.movable-type.co.uk/scripts/latlong.html


아주 작은 지역에서 일한다면 대략 1 평방 킬로미터의 면적을 얻기 위해 latitude-0.09와 longtitude-0.0148을하는 것이 정말 나쁜가요?
Benjamin Udink ten Cate

정말 나쁘지 않다고 말하고 싶습니다. 당신이 다루는 위도 / 경도가 십진수 인 한, 그 수준의 평방 km는 지구의 곡률에 의해 왜곡되지 않을 것입니다.
Ryan Ternier 2011 년

1
@BenjaminUdinktenCate 암스테르담에서 작동하지만 세계의 다른 지역에서는 정확하지 않습니다. "longitude-0.0148"을 수행하면 적도에서 약 0.16km 만 이동합니다.
nibot 2011 년

3

@nibot의 솔루션을 해결하는 데 약 2 시간을 소비해야했으며, 중심점과 너비 / 높이 (또는 반경)가 킬로미터 단위 인 경계 상자를 만드는 방법이 필요했습니다.

나는 수학적으로 / 지리적으로 해결책을 이해하지 못한다. 나는 네 좌표를 얻기 위해 (시도 및 오류로) 솔루션을 조정했습니다.

북쪽:

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

매우 정확할 필요가 없다면 각 10,000 미터는 위도와 경도에 대해 약 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
답변에 대한 설명을 추가하십시오.
Anna

당신은 현재지도의 중심 근처 50m에 대해 이동 맵 오브젝트를 원하는 경우에, 당신은, +이 코드를 사용할 수 있습니다 - 번호를 대체 +50 위해
Eyni KAVE에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.