У меня есть координатно-ориентированные координаты по центру, заданные как широта и долгота (WGS-84).Преобразование из долготы широты в декартовы координаты
Как преобразовать их в декартовы координаты (x, y, z) с началом в центре Земли?
У меня есть координатно-ориентированные координаты по центру, заданные как широта и долгота (WGS-84).Преобразование из долготы широты в декартовы координаты
Как преобразовать их в декартовы координаты (x, y, z) с началом в центре Земли?
Я недавно сделал что-то похожее на это, используя «Формула Хаверсина» по данным WGS-84, которая является производным от «Закона Хаверсинеса» с очень удовлетворительными результатами.
Да, WGS-84 предполагает, что Земля является эллипсоидом, но я полагаю, что вы получите примерно 0,5% -ную среднюю ошибку, используя подход, подобный «Формуле Хаверсина», которая может быть приемлемой ошибкой в вашем случае. У вас всегда будет некоторая ошибка, если вы не говорите о расстоянии в несколько футов, и даже тогда теоретически кривизна Земли ... Если вам потребуется более жесткая проверка соответствия WGS-84 на «Формуле Vincenty».«
Я понимаю, где starblue приходит от, но хорошее программное обеспечение инженерной часто о компромиссных, так что все зависит от точности требуется для того, что вы делаете. Например, результат рассчитывается из» Манхэттен Расстояние Формула «по сравнению с результатом« Формулы расстояния »может быть лучше для определенных ситуаций, поскольку она является расчетно менее дорогостоящей. Подумайте« какие точки ближе всего? », Где вам не нужны точные измерения расстояния.
Относительно, «Формула Хаверсина» легко реализовать и хорошо, потому что использует «Сферическую тригонометрию» вместо подхода «Закон Косинеса», основанного на двумерной тригонометрии, поэтому вы получаете хороший ба точность измерения по сложности.
А господа по имени Криса Венесс имеет большой сайт в http://www.movable-type.co.uk/scripts/latlong.html, что объясняет некоторые понятия, которые заинтересованы в и демонстрирует различные программные реализации; это также должно ответить на ваш вопрос об изменении x/y.
Ошибка 0,5% - 0,5% от того, что? В контексте этого вопроса это может быть радиус земли, поэтому 0,5% может составлять 30 км :) – MarkJ
Отъезд. Цитата 0.5% предназначена для ошибки в расстоянии большого круга между двумя точками, что не имеет строгого отношения к этому вопросу. Я бы подумал, что при преобразовании lat-long в декартовы координаты с началом в центре Земли ошибки при допущении сферической земли могут быть значительными. Неясно, что вопросник хочет сделать ** с декартовыми координатами. Либо удобнее работать в них по какой-то причудливой причине, либо, возможно, это требование для экспорта данных? Если последнее, точность будет важна. – MarkJ
Вот ответ, который я нашел:
Просто, чтобы сделать определение полным, в декартовой системе координат:
Преобразование является:
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# код для этого (обратите внимание, что он сильно отличается от формул), а также какое-то объяснение и хорошая схема, почему это правильно,
-1 Это неправильно. Вы предполагаете, что Земля является сферой, а WGS-84 предполагает эллипсоид. – starblue
@starblue: Я не уверен, что вы можете обозначить данный ответ «правильно» или «неправильно». Сферическое приближение (чтобы получить координаты x, y, z ECEF-стиля) с использованием доступных lat/lngs (на которые ссылаются WGS-84) является либо «адекватным» для потребностей оригинального плаката, либо «недостаточно». Что касается оценок расстояний и оценок, я бы сказал, что это простое преобразование в порядке. Если он запускает спутники, возможно, нет. В конце концов, сама WGS-84 является «неправильной» ... в том, что она не является идеальной моделью земной поверхности; все эллипсоидальные модели являются приближениями. Слишком плохо, что ОП не сказал нам, что он пытался сделать. –
@Dan H Вопрос задает WGS-84, и если вы ответите на что-то еще, вы должны хотя бы обсудить различия/ошибки, на которые этот ответ не отвечает. – starblue
Почему реализовать то, что уже реализовано и испытательно доказано?
C#, для одного, имеет NetTopologySuite, который является портом .NET топологии топологии JTS.
В частности, у вас есть серьезный недостаток в ваших расчетах. Земля не является идеальной сферой, а приближение радиуса Земли не может вырезать его для точных измерений.
Если в некоторых случаях приемлемо использовать функции доморощенного, то GIS является хорошим примером поля, в котором гораздо предпочтительнее использовать надежную, проверенную временем библиотеку.
+1. Использование надежной библиотеки более точно, чем функция доморощенного, а также ** проще **. – MarkJ
Как NetTopologySuite конвертирует с длинного/позднего в корзину? – vinayan
NTS не включает возможности преобразования координат, возможно, вам нужен Proj.NET http://projnet.codeplex.com –
Если вы хотите получить координаты на основе эллипсоида, а не сферы, посмотрите на http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF - он дает формулы, а также константы WGS84, необходимые для преобразования.
формулы есть также учитывать высоту по отношению к поверхности референц-эллипсоида (полезно, если вы получаете данные высоты от устройства GPS).
Продвижение, даже если вы не разместили содержание ссылки здесь. –
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);
Вы могли бы разработать? Я создал [https://gist.github.com/2787570] простое приложение, которое позволяет преобразовать одну координату с помощью вашего подхода. Он всегда терпит неудачу, хотя размеры источника (2) и размеры цели (3) различаются, что приводит к исключению 'java.lang.IllegalArgumentException: размер должен быть <= 3' – oschrenk
Хммм ... Я немного посмотрел на JTS. Строки до и включая новый LineString() выглядят как JTS. Но я не вижу CRS и Transform в JTS. Итак: они там, и я их пропускаю? Были там и удалены в 1.12? Или: это другая библиотека? –
Теория для новообращенного GPS(WGS84)
к декартовы координаты https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates
Ниже, что я использую:
Я приложил код 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)
Программное обеспечение 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
выполнит преобразование без предварительной настройки проекционного объекта.
Вам удалось преобразовать долготу и широту WGS-84 в декартовы координаты?. У меня тоже есть возвышение. Я пробовал принятый ответ здесь, но это не дает мне правильного ответа. Я сравнил результаты с этим сайтом: http://www.apsalin.com/convert-geodetic-to-cartesian.aspx. – Yasmin