2009-07-26 4 views
75

У меня есть координатно-ориентированные координаты по центру, заданные как широта и долгота (WGS-84).Преобразование из долготы широты в декартовы координаты

Как преобразовать их в декартовы координаты (x, y, z) с началом в центре Земли?

+0

Вам удалось преобразовать долготу и широту WGS-84 в декартовы координаты?. У меня тоже есть возвышение. Я пробовал принятый ответ здесь, но это не дает мне правильного ответа. Я сравнил результаты с этим сайтом: http://www.apsalin.com/convert-geodetic-to-cartesian.aspx. – Yasmin

ответ

33

Я недавно сделал что-то похожее на это, используя «Формула Хаверсина» по данным WGS-84, которая является производным от «Закона Хаверсинеса» с очень удовлетворительными результатами.

Да, WGS-84 предполагает, что Земля является эллипсоидом, но я полагаю, что вы получите примерно 0,5% -ную среднюю ошибку, используя подход, подобный «Формуле Хаверсина», которая может быть приемлемой ошибкой в ​​вашем случае. У вас всегда будет некоторая ошибка, если вы не говорите о расстоянии в несколько футов, и даже тогда теоретически кривизна Земли ... Если вам потребуется более жесткая проверка соответствия WGS-84 на «Формуле Vincenty».«

Я понимаю, где starblue приходит от, но хорошее программное обеспечение инженерной часто о компромиссных, так что все зависит от точности требуется для того, что вы делаете. Например, результат рассчитывается из» Манхэттен Расстояние Формула «по сравнению с результатом« Формулы расстояния »может быть лучше для определенных ситуаций, поскольку она является расчетно менее дорогостоящей. Подумайте« какие точки ближе всего? », Где вам не нужны точные измерения расстояния.

Относительно, «Формула Хаверсина» легко реализовать и хорошо, потому что использует «Сферическую тригонометрию» вместо подхода «Закон Косинеса», основанного на двумерной тригонометрии, поэтому вы получаете хороший ба точность измерения по сложности.

А господа по имени Криса Венесс имеет большой сайт в http://www.movable-type.co.uk/scripts/latlong.html, что объясняет некоторые понятия, которые заинтересованы в и демонстрирует различные программные реализации; это также должно ответить на ваш вопрос об изменении x/y.

+1

Ошибка 0,5% - 0,5% от того, что? В контексте этого вопроса это может быть радиус земли, поэтому 0,5% может составлять 30 км :) – MarkJ

+1

Отъезд. Цитата 0.5% предназначена для ошибки в расстоянии большого круга между двумя точками, что не имеет строгого отношения к этому вопросу. Я бы подумал, что при преобразовании lat-long в декартовы координаты с началом в центре Земли ошибки при допущении сферической земли могут быть значительными. Неясно, что вопросник хочет сделать ** с декартовыми координатами. Либо удобнее работать в них по какой-то причудливой причине, либо, возможно, это требование для экспорта данных? Если последнее, точность будет важна. – MarkJ

92

Вот ответ, который я нашел:

Просто, чтобы сделать определение полным, в декартовой системе координат:

  • оси й проходит через длинный, латы (0,0), так что долгота 0 встречается с экватором;
  • ось y проходит (0,90);
  • и ось z проходит через полюса.

Преобразование является:

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

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

z = R *sin(lat) 

Где R является the approximate radius of earth (например 6371KM).

Если ваши тригонометрические функции ожидают радианы (что они, вероятно, делают), вам нужно будет преобразовать свою долготу и широту в радианы в первую очередь. Вам, очевидно, нужно десятичное представление, а не градусы \ минут \ секунд (см. e.g. here об конверсии).

Формула для обратного преобразования:

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

ASIN это конечно дуги синуса. read about atan2 in wikipedia. Не забудьте перевести назад из радианов в градусы.

This page дает C# код для этого (обратите внимание, что он сильно отличается от формул), а также какое-то объяснение и хорошая схема, почему это правильно,

+11

-1 Это неправильно. Вы предполагаете, что Земля является сферой, а WGS-84 предполагает эллипсоид. – starblue

+20

@starblue: Я не уверен, что вы можете обозначить данный ответ «правильно» или «неправильно». Сферическое приближение (чтобы получить координаты x, y, z ECEF-стиля) с использованием доступных lat/lngs (на которые ссылаются WGS-84) является либо «адекватным» для потребностей оригинального плаката, либо «недостаточно». Что касается оценок расстояний и оценок, я бы сказал, что это простое преобразование в порядке. Если он запускает спутники, возможно, нет. В конце концов, сама WGS-84 является «неправильной» ... в том, что она не является идеальной моделью земной поверхности; все эллипсоидальные модели являются приближениями. Слишком плохо, что ОП не сказал нам, что он пытался сделать. –

+8

@Dan H Вопрос задает WGS-84, и если вы ответите на что-то еще, вы должны хотя бы обсудить различия/ошибки, на которые этот ответ не отвечает. – starblue

6

Почему реализовать то, что уже реализовано и испытательно доказано?

C#, для одного, имеет NetTopologySuite, который является портом .NET топологии топологии JTS.

В частности, у вас есть серьезный недостаток в ваших расчетах. Земля не является идеальной сферой, а приближение радиуса Земли не может вырезать его для точных измерений.

Если в некоторых случаях приемлемо использовать функции доморощенного, то GIS является хорошим примером поля, в котором гораздо предпочтительнее использовать надежную, проверенную временем библиотеку.

+1

+1. Использование надежной библиотеки более точно, чем функция доморощенного, а также ** проще **. – MarkJ

+4

Как NetTopologySuite конвертирует с длинного/позднего в корзину? – vinayan

+1

NTS не включает возможности преобразования координат, возможно, вам нужен Proj.NET http://projnet.codeplex.com –

3

Если вы хотите получить координаты на основе эллипсоида, а не сферы, посмотрите на http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF - он дает формулы, а также константы WGS84, необходимые для преобразования.

формулы есть также учитывать высоту по отношению к поверхности референц-эллипсоида (полезно, если вы получаете данные высоты от устройства GPS).

+0

Продвижение, даже если вы не разместили содержание ссылки здесь. –

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

Вы могли бы разработать? Я создал [https://gist.github.com/2787570] простое приложение, которое позволяет преобразовать одну координату с помощью вашего подхода. Он всегда терпит неудачу, хотя размеры источника (2) и размеры цели (3) различаются, что приводит к исключению 'java.lang.IllegalArgumentException: размер должен быть <= 3' – oschrenk

+0

Хммм ... Я немного посмотрел на JTS. Строки до и включая новый LineString() выглядят как JTS. Но я не вижу CRS и Transform в JTS. Итак: они там, и я их пропускаю? Были там и удалены в 1.12? Или: это другая библиотека? –

6

Теория для новообращенного GPS(WGS84) к декартовы координаты https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

Ниже, что я использую:

  • Долгота в GPS (WGS84) и декартовых координат одинаковы ,
  • Широта должна быть преобразована по параметрам эллипсоида WGS 84, полумалая ось - 6378137 м, а
  • Взаимная сплющивания - 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 минут дуги.

Или если у вас есть некоторый уровень профессиональныйGPS имеет высоты H (MSL, Heigh выше среднего уровня моря) и UNDULATION, отношения между geoid и ellipsoid (m) выбранного выхода базовой из внутренней таблицы. вы можете получить h = H(msl) + undulation

Для XYZ декартовыми координатами:

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

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

z = R *sin(lat) 
+0

Какова ценность R? – eych

+0

Я предполагаю, что это радиус сферы, который составляет 6371 км для Земли. – Matthias

1

Программное обеспечение 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 выполнит преобразование без предварительной настройки проекционного объекта.

Смежные вопросы