Mam kilka punktów współrzędnych ze środkiem Ziemi, podanych jako szerokość i długość geograficzna ( WGS-84 ).
Jak przekonwertować je na współrzędne kartezjańskie (x, y, z), których początek znajduje się w środku Ziemi?
mapping
geometry
geospatial
daphshez
źródło
źródło
Odpowiedzi:
Niedawno zrobiłem coś podobnego do tego, używając „Formuły Haversine'a” na danych WGS-84, która jest pochodną „Prawa Hawersinów” z bardzo zadowalającymi wynikami.
Tak, WGS-84 zakłada, że Ziemia jest elipsoidą, ale uważam, że przy zastosowaniu podejścia takiego jak „Formuła Haversine'a” uzyskuje się tylko około 0,5% średniego błędu, co może być dopuszczalną ilością błędu w twoim przypadku. Zawsze będziesz miał pewną ilość błędów, chyba że mówisz o odległości kilku stóp, a nawet wtedy istnieje teoretyczna krzywizna Ziemi ... Jeśli potrzebujesz bardziej sztywnego podejścia zgodnego z WGS-84, sprawdź „Formułę Vincenty'ego”.
Rozumiem, skąd się bierze starblue , ale dobra inżynieria oprogramowania często wymaga kompromisów, więc wszystko zależy od dokładności, jakiej potrzebujesz do tego, co robisz. Na przykład wynik obliczony na podstawie „Formuły odległości Manhattan” w porównaniu z wynikiem z „Formuły odległości” może być lepszy w pewnych sytuacjach, ponieważ jest obliczeniowo tańszy. Pomyśl „który punkt jest najbliżej?” scenariusze, w których nie potrzebujesz dokładnego pomiaru odległości.
Jeśli chodzi o „Formułę Haversine'a”, jest łatwa do wdrożenia i przyjemna, ponieważ wykorzystuje „Trygonometrię sferyczną” zamiast podejścia opartego na „Prawie Cosinusów”, które jest oparte na dwuwymiarowej trygonometrii, dzięki czemu uzyskuje się niezłą równowagę dokładności ponad złożonością.
Dżentelmen o imieniu Chris Veness ma świetną stronę internetową pod adresem http://www.movable-type.co.uk/scripts/latlong.html, która wyjaśnia niektóre interesujące Cię koncepcje i demonstruje różne implementacje programistyczne; Powinno to również odpowiedzieć na pytanie dotyczące konwersji X / Y.
źródło
Oto odpowiedź, którą znalazłem:
Aby uzupełnić definicję, w kartezjańskim układzie współrzędnych:
Konwersja to:
Gdzie R jest przybliżonym promieniem Ziemi (np. 6371 km).
Jeśli twoje funkcje trygonometryczne oczekują radianów (co prawdopodobnie robią), będziesz musiał najpierw przeliczyć swoją długość i szerokość geograficzną na radiany. Oczywiście potrzebujesz reprezentacji dziesiętnej, a nie stopni \ minut \ sekund (zobacz np. Tutaj o konwersji).
Wzór na konwersję wsteczną:
asin jest oczywiście sinusoidą. przeczytaj o atan2 w Wikipedii . Nie zapomnij przekonwertować z radianów na stopnie.
Ta strona zawiera kod C # do tego (zwróć uwagę, że jest on bardzo różny od formuł), a także wyjaśnienia i ładny diagram, dlaczego jest to poprawne,
źródło
Teoria konwersji
GPS(WGS84)
na współrzędne kartezjańskie https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinatesOto, czego używam:
I załączeniu kod VB I napisał:
Zwróć uwagę, że
h
jest wysokość powyżejWGS 84 ellipsoid
.Zwykle
GPS
daje nam wzrostH
powyżejMSL
.MSL
Wysokość musi być przekształcany do wysokościh
wyższej odWGS 84 ellipsoid
stosując geopotencjadlna modeluEGM96
( Lemoine i wsp, 1998 ).Odbywa się to poprzez interpolację siatki pliku wysokości geoidy z rozdzielczością przestrzenną 15 minut łuku.
Lub jeśli masz jakiegoś profesjonalistę na poziomie,
GPS
ma WysokośćH
( npm, wysokość nad średnim poziomem morza ) iUNDULATION
związek międzygeoid
iellipsoid (m)
a wybranego wyjścia odniesienia z wewnętrznej tabeli. możesz dostaćh = H(msl) + undulation
Do XYZ według współrzędnych kartezjańskich:
źródło
W python3.x można to zrobić za pomocą:
źródło
Proj.4 oprogramowanie zapewnia program wiersza poleceń, które można zrobić konwersję, np
Zapewnia również C API . W szczególności funkcja
pj_geodetic_to_geocentric
dokona konwersji bez konieczności uprzedniego konfigurowania obiektu projekcji.źródło
Jeśli zależy Ci na uzyskaniu współrzędnych w oparciu o elipsoidę, a nie na kuli, spójrz na http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF - zawiera wzory oraz stałe WGS84 potrzebne do konwersji .
Formuły tam również uwzględniają wysokość względem referencyjnej powierzchni elipsoidy (przydatne, jeśli otrzymujesz dane o wysokości z urządzenia GPS).
źródło
Po co wdrażać coś, co zostało już wdrożone i sprawdzone w testach?
Na przykład język C # ma NetTopologySuite, który jest portem .NET pakietu JTS Topology Suite.
W szczególności masz poważny błąd w obliczeniach. Ziemia nie jest idealną kulą, a przybliżenie promienia Ziemi może jej nie uciąć do precyzyjnych pomiarów.
Jeśli w niektórych przypadkach użycie funkcji homebrew jest dopuszczalne, GIS jest dobrym przykładem dziedziny, w której o wiele lepiej jest używać niezawodnej, sprawdzonej w testach biblioteki.
źródło
źródło
java.lang.IllegalArgumentException: dimension must be <= 3
Możesz to zrobić w ten sposób na Javie.
źródło