Eu tenho alguns pontos de coordenadas centrados na Terra dados como latitude e longitude ( WGS-84 ).
Como posso convertê-los em coordenadas cartesianas (x, y, z) com a origem no centro da Terra?
mapping
geometry
geospatial
Daphshez
fonte
fonte
Respostas:
Recentemente, fiz algo semelhante a isso usando a "Fórmula Haversine" nos dados WGS-84, que é um derivado da "Lei de Haversine" com resultados muito satisfatórios.
Sim, o WGS-84 assume que a Terra é um elipsóide, mas acredito que você obtenha apenas cerca de 0,5% de erro médio usando uma abordagem como a "Fórmula Haversine", que pode ser uma quantidade aceitável de erro no seu caso. Você sempre terá algum erro, a menos que esteja falando sobre uma distância de alguns metros e mesmo assim, teoricamente, há uma curvatura da Terra ... Se você precisar de uma abordagem compatível com WGS-84 mais rígida, verifique a "Fórmula de Vincenty".
Eu entendo de onde vem o starblue , mas uma boa engenharia de software geralmente trata de compensações, então tudo depende da precisão que você precisa para o que está fazendo. Por exemplo, o resultado calculado da "Fórmula da distância de Manhattan" em comparação com o resultado da "Fórmula da distância" pode ser melhor para certas situações, pois é computacionalmente mais barato. Pense "qual é o ponto mais próximo?" cenários onde você não precisa de uma medição de distância precisa.
Em relação à "Fórmula Haversine", é fácil de implementar e é agradável porque usa "Trigonometria Esférica" em vez de uma abordagem baseada na "Lei dos Cossenos" que é baseada na trigonometria bidimensional, portanto, você obtém um bom equilíbrio de precisão sobre a complexidade.
Um cavalheiro chamado Chris Veness tem um ótimo site em http://www.movable-type.co.uk/scripts/latlong.html que explica alguns dos conceitos nos quais você está interessado e demonstra várias implementações programáticas; isso deve responder também à sua pergunta de conversão x / y.
fonte
Aqui está a resposta que encontrei:
Só para completar a definição, no sistema de coordenadas cartesianas:
A conversão é:
Onde R está o raio aproximado da terra (por exemplo, 6371 km).
Se suas funções trigonométricas esperam radianos (o que provavelmente acontece), você precisará primeiro converter sua longitude e latitude em radianos. Você obviamente precisa de uma representação decimal, não graus \ minutos \ segundos (veja por exemplo, aqui sobre conversão).
A fórmula para conversão reversa:
asin é, naturalmente, arco seno. leia sobre atan2 na wikipedia . Não se esqueça de converter de volta de radianos para graus.
Esta página fornece o código c # para isso (observe que é muito diferente das fórmulas), e também algumas explicações e um belo diagrama de por que isso está correto,
fonte
Teoria para converter
GPS(WGS84)
em coordenadas cartesianas https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinatesO seguinte é o que estou usando:
Anexei um código VB que escrevi:
Observe que a
h
altitude está acima deWGS 84 ellipsoid
.Normalmente
GPS
nos dará alturaH
acimaMSL
. AMSL
altura deve ser convertida para a alturah
acima doWGS 84 ellipsoid
usando o modelo geopotencialEGM96
( Lemoine et al, 1998 ).Isso é feito interpolando uma grade do arquivo de altura do geóide com uma resolução espacial de 15 minutos de arco.
Ou se você tiver algum nível profissional
GPS
tem AltitudeH
( msl, altura acima do nível médio do mar ) eUNDULATION
, a relação entre ogeoid
e oellipsoid (m)
da saída do datum escolhido da tabela interna. você pode terh = H(msl) + undulation
Para XYZ por coordenadas cartesianas:
fonte
O software proj.4 fornece um programa de linha de comando que pode fazer a conversão, por exemplo
Ele também fornece um API C . Em particular, a função
pj_geodetic_to_geocentric
fará a conversão sem ter que configurar um objeto de projeção primeiro.fonte
Em python3.x, isso pode ser feito usando:
fonte
Se você se preocupa em obter coordenadas com base em um elipsóide em vez de uma esfera, dê uma olhada em http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF - ele fornece as fórmulas, bem como as constantes WGS84 de que você precisa para a conversão .
As fórmulas ali também levam em consideração a altitude relativa à superfície do elipsóide de referência (útil se você estiver obtendo dados de altitude de um dispositivo GPS).
fonte
Por que implementar algo que já foi implementado e testado?
C #, por exemplo, tem o NetTopologySuite, que é a porta .NET do JTS Topology Suite.
Especificamente, você tem uma falha grave em seu cálculo. A Terra não é uma esfera perfeita, e a aproximação do raio da Terra pode não cortá-la para medições precisas.
Se em alguns casos for aceitável usar funções homebrew, o GIS é um bom exemplo de um campo no qual é preferível usar uma biblioteca confiável e comprovada por teste.
fonte
fonte
java.lang.IllegalArgumentException: dimension must be <= 3
Você pode fazer isso em Java.
fonte