경도 \ 위도에서 데카르트 좌표로 변환


103

위도와 경도로 지정된 지구 중심 좌표 점 ( WGS-84 )이 있습니다.

원점을 지구의 중심에있는 데카르트 좌표 (x, y, z)로 변환하려면 어떻게해야합니까?


1
WGS-84 경도와 위도를 데카르트 좌표로 변환 할 수 있었습니까? 나는 또한 고도가 있습니다. 여기에서 받아 들인 대답을 시도했지만 올바른 대답을 얻지 못했습니다. 내 결과를 apsalin.com/convert-geodetic-to-cartesian.aspx 웹 사이트와 비교 했습니다 .
Yasmin 2015

답변:


47

저는 최근에 WGS-84 데이터의 "Haversine Formula"를 사용하여 이와 유사한 작업을 수행했습니다. 이는 "Law of Haversines"의 파생물이며 매우 만족스러운 결과입니다.

예, WGS-84는 지구가 타원체라고 가정하지만 "Haversine Formula"와 같은 접근 방식을 사용하면 평균 0.5 %의 오차 만 얻을 수 있다고 생각합니다. 몇 피트의 거리에 대해 이야기하지 않는 한 항상 약간의 오류가있을 것이며 이론적으로 지구의 곡률이있는 경우도 있습니다. 더 엄격하게 WGS-84 호환 접근 방식이 필요한 경우 "빈 센티 공식"을 확인하십시오.

나는 starblue 가 어디에서 왔는지 이해 하지만 좋은 소프트웨어 엔지니어링은 종종 트레이드 오프에 관한 것이므로 모두 수행하는 작업에 필요한 정확성에 달려 있습니다. 예를 들어, "Manhattan Distance Formula"에서 계산 된 결과와 "Distance Formula"의 결과는 계산 비용이 더 저렴하므로 특정 상황에서는 더 좋을 수 있습니다. "가장 가까운 지점은?" 정확한 거리 측정이 필요하지 않은 시나리오.

"하버 사인 공식"은 2 차원 삼각법을 기반으로하는 "코사인 법칙"기반 접근 방식 대신 "구형 삼각법"을 사용하기 때문에 구현하기 쉽고 좋습니다. 따라서 정확도의 균형을 잘 맞 춥니 다. 복잡성에.

이름의 신사 Chris Veness http://www.movable-type.co.uk/scripts/latlong.html 에 귀하가 관심있는 개념을 설명하고 다양한 프로그래밍 방식 구현을 보여주는훌륭한 웹 사이트를 운영하고 있습니다. 이것은 x / y 변환 질문에도 답할 것입니다.


1
0.5 % 오류-무엇의 0.5 %? 이 질문의 맥락에서 지구 반경 일 수 있으므로 0.5 %는 30km 일 수 있습니다. :)
MarkJ

2
링크를 확인했습니다. 0.5 % 따옴표는 두 점 사이의 대원 거리 오류에 대한 것이므로이 질문과 엄격하게 관련이 없습니다. 지구 중심의 원점을 사용하여 위도를 데카르트 좌표로 변환 할 때 구형 지구를 가정 할 때 발생하는 오류가 심각 할 수 있다고 생각합니다. questionner가 원하는 것을 명확하지 않다 직교 좌표로. 기괴한 이유로 작업하는 것이 더 편리하거나 데이터 내보내기에 대한 요구 사항일까요? 후자의 경우 정확성이 중요합니다.
MarkJ

130

내가 찾은 답은 다음과 같습니다.

정의를 완성하기 위해 데카르트 좌표계에서 :

  • x 축은 long, lat (0,0)을 통과하므로 경도 0은 적도와 만나게됩니다.
  • y 축은 (0,90)을 통과합니다.
  • z 축은 극을 통과합니다.

변환은 다음과 같습니다.

x = R * cos(lat) * cos(lon)

y = R * cos(lat) * sin(lon)

z = R *sin(lat)

여기서 R은 대략적인 지구의 반경입니다 (예 : 6371km).

삼각 함수가 라디안을 예상하는 경우 (아마도 그렇게 할 것임) 먼저 경도와 위도를 라디안으로 변환해야합니다. 당신은 분명하지도 \ 분 \ 초 (참조, 진수 표현을 필요로 여기 예를 들어 변환에 대해).

역변환 공식 :

   lat = asin(z / R)
   lon = atan2(y, x)

asin은 물론 아크 사인입니다. wikipedia에서 atan2에 대해 읽어보십시오 . 라디안에서 도로 다시 변환하는 것을 잊지 마십시오.

이 페이지 는 이에 대한 C # 코드 (공식과 매우 다릅니다)와 이것이 올바른 이유에 대한 설명과 멋진 다이어그램을 제공합니다.


17
-1 이것은 잘못되었습니다. 지구는 구라고 가정하고 WGS-84는 타원체라고 가정합니다.
starblue

42
@starblue : 주어진 대답에 "맞다"또는 "잘못됨"이라고 표시 할 위치에 있는지 잘 모르겠습니다. 사용 가능한 위도 / 경도 (WGS-84 참조)를 사용하는 구형 근사 (ECEF 스타일 x, y, z 좌표를 얻기위한)는 원래 포스터의 요구 사항에 "적절"하거나 "적절하지 않음"입니다. 거리 및 방위 추정의 경우이 간단한 변환이 괜찮을 것입니다. 그가 인공위성을 발사한다면 아닐 수도 있습니다. 결국, WGS-84 자체는 지구 표면의 완벽한 모델이 아니라는 점에서 "틀 렸습니다". 모든 타원체 모델은 근사치입니다. 안타깝게도 OP가 그가하려는 일을 알려주지 않았습니다.
Dan H

11
@Dan H이 질문은 WGS-84를 요구하며, 다른 답변을한다면 적어도이 답변에는없는 차이점 / 오류에 대해 논의해야합니다.
starblue

@ daphna-shezaf는 다시 변환 ... 나는 또한 수행 라디안에서 다시,하지만 결과는 동일 ...하지 않은 수 없습니다

감사합니다. 왜 작동하지 않는지 알아 내는데 시간을 보내세요. cos (lat)와 sin (lat)을
바꿨습니다.

6

데카르트 좌표 로 변환 GPS(WGS84)하는 이론 https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

다음은 내가 사용하는 것입니다.

  • GPS (WGS84)의 경도와 데카르트 좌표는 동일합니다.
  • 위도는 WGS 84 타원체 매개 변수로 변환해야합니다. 반장 축은 6378137m이고
  • 평탄화의 역수는 298.257223563입니다.

내가 작성한 VB 코드를 첨부했습니다 .

Imports System.Math

'Input GPSLatitude is WGS84 Latitude,h is altitude above the WGS 84 ellipsoid

Public Function GetSphericalLatitude(ByVal GPSLatitude As Double, ByVal h As Double) As Double

        Dim A As Double = 6378137 'semi-major axis 
        Dim f As Double = 1 / 298.257223563  '1/f Reciprocal of flattening
        Dim e2 As Double = f * (2 - f)
        Dim Rc As Double = A / (Sqrt(1 - e2 * (Sin(GPSLatitude * PI / 180) ^ 2)))
        Dim p As Double = (Rc + h) * Cos(GPSLatitude * PI / 180)
        Dim z As Double = (Rc * (1 - e2) + h) * Sin(GPSLatitude * PI / 180)
        Dim r As Double = Sqrt(p ^ 2 + z ^ 2)
        Dim SphericalLatitude As Double =  Asin(z / r) * 180 / PI
        Return SphericalLatitude
End Function

h고도가 WGS 84 ellipsoid.

보통 GPS우리에게 H위의 MSL높이를 줄 것 입니다 . MSL높이는 높이로 변환하는 h상기 WGS 84 ellipsoid하여 중력 포텐샬 모델 EGM96( Lemoine은 등, 1998 ).
이것은 공간 해상도가 15 arc-minutes 인 지오이드 높이 파일의 그리드를 보간하여 수행됩니다.

당신은 몇 가지 레벨이있는 경우 또는 전문가를 GPS 고도를 가지고 H( MSL, 평균 해발 어이 )과 UNDULATION의 사이의 관계 geoidellipsoid (m)선택된의 자료 출력 내부 테이블을. 당신은 얻을 수 있습니다h = H(msl) + undulation

데카르트 좌표로 XYZ하려면 :

x = R * cos(lat) * cos(lon)

y = R * cos(lat) * sin(lon)

z = R *sin(lat)

R의 가치는 무엇입니까?
eych

4
지구에서 6371km 인 구의 반지름이라고 생각합니다.
Matthias

5

PROJ.4의 소프트웨어는 변환을 할 수있는 명령 줄 프로그램, 예를 제공합니다

LAT=40
LON=-110
echo $LON $LAT | cs2cs +proj=latlong +datum=WGS84 +to +proj=geocent +datum=WGS84

또한 C API를 제공합니다 . 특히이 함수 pj_geodetic_to_geocentric는 먼저 투영 개체를 설정하지 않고도 변환을 수행합니다.


5

python3.x에서는 다음을 사용하여 수행 할 수 있습니다.

# Converting lat/long to cartesian
import numpy as np

def get_cartesian(lat=None,lon=None):
    lat, lon = np.deg2rad(lat), np.deg2rad(lon)
    R = 6371 # radius of the earth
    x = R * np.cos(lat) * np.cos(lon)
    y = R * np.cos(lat) * np.sin(lon)
    z = R *np.sin(lat)
    return x,y,z

3

구가 아닌 타원체를 기반으로 좌표를 얻는 데 관심이 있다면 http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF 를 참조하십시오. 변환에 필요한 WGS84 상수와 수식을 제공합니다. .

공식은 또한 참조 타원 표면에 상대적인 고도를 고려합니다 (GPS 장치에서 고도 데이터를 가져 오는 경우 유용함).


여기에 링크의 내용을 게시하지 않았더라도 찬성합니다.
Mad Physicist

2

이미 구현되고 테스트 검증 된 것을 구현하는 이유는 무엇입니까?

우선 C # 에는 JTS Topology Suite의 .NET 포트 인 NetTopologySuite 가 있습니다.

특히 계산에 심각한 결함이 있습니다. 지구는 완벽한 구체가 아니며 지구 반경 의 근사치 가 정확한 측정을 위해 잘라 내지 않을 수 있습니다.

어떤 경우에 홈브류 기능을 사용하는 것이 허용된다면 GIS는 신뢰할 수 있고 테스트가 입증 된 라이브러리를 사용하는 것이 훨씬 선호되는 분야의 좋은 예입니다.


1
+1. 신뢰할 수있는 라이브러리를 사용하는 것이 홈브류 기능보다 정확하고 더 쉽습니다 .
MarkJ

5
NetTopologySuite는 어떻게 long / late에서 Cartesion으로 변환합니까?
vinayan 2013 년

1
NTS에는 좌표 변환 기능이 포함되어 있지 않습니다. Proj.NET projnet.codeplex.com
D_Guidi 2014-06-10

6
어리석은 대답은 변환 기능도 제공하지 않습니다.
Motes 2015

1
Coordinate[] coordinates = new Coordinate[3];
coordinates[0] = new Coordinate(102, 26);
coordinates[1] = new Coordinate(103, 25.12);
coordinates[2] = new Coordinate(104, 16.11);
CoordinateSequence coordinateSequence = new CoordinateArraySequence(coordinates);

Geometry geo = new LineString(coordinateSequence, geometryFactory);

CoordinateReferenceSystem wgs84 = DefaultGeographicCRS.WGS84;
CoordinateReferenceSystem cartesinaCrs = DefaultGeocentricCRS.CARTESIAN;

MathTransform mathTransform = CRS.findMathTransform(wgs84, cartesinaCrs, true);

Geometry geo1 = JTS.transform(geo, mathTransform);

자세히 설명해 주시겠습니까? 내가 만든 계층이 하나가 당신의 접근 방식을 사용하여 좌표 변환 할 수있는 간단한 응용 프로그램을. 소스의 차원 (2)과 대상의 차원 (3)이 다르기 때문에 항상 실패하므로 예외가 발생합니다java.lang.IllegalArgumentException: dimension must be <= 3
oschrenk

흠 ... JTS를 잠시 살펴 보았습니다. new LineString ()까지의 라인은 JTS처럼 보입니다. 그러나 JTS에서 CRS 및 Transform 항목을 볼 수 없습니다. 그래서 : 그들이 거기에 있고 나는 그들을 놓치고 있습니까? 1.12에서 제거 되었습니까? 아니면 다른 도서관인가요?
Dan H

0

Java에서 이런 식으로 할 수 있습니다.

public List<Double> convertGpsToECEF(double lat, double longi, float alt) {

    double a=6378.1;
    double b=6356.8;
    double N;
    double e= 1-(Math.pow(b, 2)/Math.pow(a, 2));
    N= a/(Math.sqrt(1.0-(e*Math.pow(Math.sin(Math.toRadians(lat)), 2))));
    double cosLatRad=Math.cos(Math.toRadians(lat));
    double cosLongiRad=Math.cos(Math.toRadians(longi));
    double sinLatRad=Math.sin(Math.toRadians(lat));
    double sinLongiRad=Math.sin(Math.toRadians(longi));
    double x =(N+0.001*alt)*cosLatRad*cosLongiRad;
    double y =(N+0.001*alt)*cosLatRad*sinLongiRad;
    double z =((Math.pow(b, 2)/Math.pow(a, 2))*N+0.001*alt)*sinLatRad;

    List<Double> ecef= new ArrayList<>();
    ecef.add(x);
    ecef.add(y);
    ecef.add(z);

    return ecef;


}

매개 변수 alt는 무엇입니까?
발리 만

고도, GPS 작동 방식을 모르는 경우 여기에서 무엇을하고 계십니까?)
MushyPeas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.