Chcę znaleźć nieznaną lokalizację docelową (współrzędne szerokości i długości geograficznej). Istnieją 3 znane punkty (pary współrzędnych szerokości i długości geograficznej) i dla każdego punktu odległość w kilometrach od miejsca docelowego. Jak mogę obliczyć współrzędne docelowej lokalizacji?
Powiedzmy na przykład, że mam następujące punkty danych
37.418436,-121.963477 0.265710701754km
37.417243,-121.961889 0.234592423446km
37.418692,-121.960194 0.0548954278262km
To, co chciałbym, to matematyka dla funkcji, która przyjmuje to jako dane wejściowe i zwraca 37,417959, -121,961954 jako dane wyjściowe.
Rozumiem, jak obliczyć odległość między dwoma punktami, na stronie http://www.movable-type.co.uk/scripts/latlong.html Rozumiem ogólną zasadę, że przy takich trzech okręgach otrzymujesz dokładnie jeden punkt nakładania się. Mętnie rozumiem matematykę potrzebną do obliczenia tego punktu za pomocą tych danych wejściowych.
Odpowiedzi:
Po tym, jak rozejrzałem się po Wikipedii i tym samym pytaniu / odpowiedzi na StackOverflow , pomyślałem, że zrobię sobie dźgnięcie i spróbuję uzupełnić luki.
Po pierwsze, Nie jestem pewien, skąd masz wynik, ale wydaje się, że jest nieprawidłowy. Wykreśliłem punkty w ArcMap, zbuforowałem je do określonych odległości, pobiegłem przeciąć na buforach, a następnie uchwyciłem wierzchołek przecięcia, aby uzyskać rozwiązania. Proponowany wynik jest zielony. Obliczyłem wartość w oknie objaśnień, czyli około 3 metry tego, co ArcMap dał dla rozwiązania uzyskanego z przecięcia.
Matematyka na stronie wikipedii nie jest taka zła, wystarczy zakryć swoje współrzędne geodezyjne kartezjańskim ECEF, który można znaleźć tutaj . warunki a / x + h można zastąpić promieniem kuli authalicznej, jeśli nie używasz elipsoidy.
Prawdopodobnie najłatwiej jest po prostu podać ci dobrze (?) Udokumentowany kod, więc tutaj jest w Pythonie
źródło
Nie jestem pewien, czy jestem naiwny, ale czy buforujesz każdy punkt według rozmiaru, a następnie przecinasz wszystkie trzy koła, które zapewniłyby ci poprawną lokalizację?
Możesz obliczyć skrzyżowanie za pomocą przestrzennych interfejsów API. Przykłady:
źródło
Poniższe uwagi wykorzystują geometrię planaryczną (tj. Musiałbyś rzutować swoje współrzędne na odpowiedni lokalny układ współrzędnych).
Moje rozumowanie z działającym przykładem w Pythonie wygląda następująco:
Weź 2 punkty danych (zadzwoń do nich
a
ib
). Zadzwoń do naszego punktu docelowegox
. Znamy już odległościax
ibx
. Odległość możemy obliczyć zaab
pomocą twierdzenia Pitagorasa.Teraz możesz obliczyć kąty tych linii:
Niestety brakuje mi czasu na udzielenie odpowiedzi, jednak teraz znasz kąty, możesz obliczyć dwie możliwe lokalizacje
x
. Następnie, korzystając z trzeciego punktu c, możesz obliczyć, która lokalizacja jest poprawna.źródło
To może zadziałać. Szybko ponownie w pythonie, możesz umieścić to w ciele funkcji xN, yN = współrzędne punktów, r1 i r2 = wartości promienia
Wartości rx i ry to wartości zwracane (powinny znajdować się w tablicy) dwóch punktów przecięcia na okręgu, jeśli to pomaga wyjaśnić.
Zrób to dla pierwszych 2 kręgów, a następnie dla pierwszego i ostatniego. Jeśli którykolwiek z wyników z pierwszej iteracji porówna się z wynikami z drugiego (prawdopodobnie w ramach pewnej tolerancji), to masz punkt przecięcia. Nie jest to świetne rozwiązanie, zwłaszcza gdy zaczynasz dodawać do procesu więcej niż punkty, ale jest to najprostsze, jakie widzę bez rozwiązywania układu równań.
źródło
Możesz używać przestrzennego API z postgis (funkcje St_Intersection, St_buffer). Jak zauważył fmark, należy również pamiętać, że Postgis stosuje algorytmy planarne, ale w przypadku małych obszarów stosowanie równomiernego przesuwania nie wprowadza dużego błędu.
źródło
GEOGRAPHY
typu, a nieGEOMETRY
typu.Zrób to w języku PHP:
źródło