Muszę być w stanie obliczyć ramkę ograniczającą lub okrąg dla danej szerokości geograficznej WGS84 i długości geograficznej WGS84 oraz odległości, ale nie mam pojęcia, od czego zacząć!
Odległość od startu Lat / Lon wynosiłaby 10 km lub mniej.
Czy ktoś mógłby dać mi wskazówki / przykład, jak to zrobić
Odpowiedzi:
WGS-co? WGS-84? W zależności od tego, jakiej dokładności potrzebujesz, możesz potrzebować dużo więcej informacji - domyślam się, że właśnie dlatego zostałeś odrzucony, chociaż nikt nie zadał sobie trudu, aby zostawić komentarz mówiący dlaczego.
Oto dwa sposoby:
Niedokładne, ale prawdopodobnie „wystarczająco dobre”
Jeden stopień szerokości geograficznej wynosi około 10001,9.965729 / 90 kilometrów (odległość od równika do bieguna, podzielona przez dziewięćdziesiąt stopni) lub 111,113 kilometrów, przy zastosowaniu układu odniesienia WGS-84. Jest to przybliżenie ze względu na kształt ziemi i ponieważ odległości zmieniają się w miarę zbliżania się do biegunów (jeden powód, aby używać szerokości, a nie długości geograficznej - ostatecznie odległość jednego stopnia długości geograficznej wynosi zero!) Ziemia również nie jest idealna kula. Oba są powodem, dla którego w mojej drugiej odpowiedzi należy zastosować bardziej złożone podejście oparte na projekcji i danych.
To używa stopni dziesiętnych, a nie stopni / minut / sekund.
Tak więc obwiednia będzie punktem, plus minus 0,08999 stopni. Alternatywnie możesz użyć tej liczby jako promienia, dając ci okrąg ograniczający .
Każda osoba czytająca GIS będzie drżeć. Będzie to jednak głównie dokładne, w zależności od tego, gdzie jesteś na świecie. Dla promienia 10 km powinno być dobrze.
Znacznie dokładniejszy, ale więcej kodu
Użyj biblioteki projekcji i podaj dane, itp. Polecam Proj4; jest szeroko stosowany, więc Google zwraca mnóstwo wyników z pytaniami na ten temat, a są też opakowania Delphi . Jeśli masz problemy z korzystaniem z niego, opublikuj kolejne pytanie tutaj na SO - to nie wchodzi w zakres tego pytania. Witryna Proj4 zawiera przykłady wykorzystujące podstawowe interfejsy API i chociaż są one w C, powinny być dość łatwe do przetłumaczenia. Ich odniesienie API jest najlepszym miejscem do rozpoczęcia, a następnie FAQ .
Użyłbym WGS-84 jako podstawowego układu odniesienia (reprezentacji Ziemi), chyba że znasz konkretny, którego chcesz użyć lub który został wykorzystany do utworzenia twoich współrzędnych. Jest powszechnie używany i dość dokładny.
Jeśli twoja pozycja pochodzi z Map Google (na przykład), określ rzut Mercator. Możesz użyć innej projekcji lub użyć, powiedzmy, współrzędnych UTMzamiast szerokości i długości geograficznej, w zależności od źródła danych i jeśli chcesz wysokiej dokładności dla małego obszaru lokalnego. (UTM ma wiele stref, z których każda zmienia zniekształcenie, dzięki czemu wewnątrz tej strefy jest bardzo dokładna; jeśli użyjesz strefy dla współrzędnych poza nią, zniekształcenie znacznie wzrośnie, gdy odsuniesz się. Jeśli zobaczysz całą ziemię rzutowaną z jednej strefa, może być nierozpoznawalna. Ale w obrębie strefy tłumaczenia UTM będą tak dobre, jak to tylko możliwe. Współrzędne są ogólnie określone w metrach, a nie w stopniach, więc może być bardziej przydatne dla ciebie, biorąc pod uwagę, że potrzebujesz 10 km promień. 10 km jest łatwo w obrębie jednej strefy, wystarczy wybrać odpowiednią strefę na podstawie współrzędnej środka. Jedynym trudnym zagadnieniem jest zbliżenie się do granicy: jest to powszechna sytuacja i jest w porządku, po prostu bądźspójny w sposobie wyboru, którego używasz . Proj4 pozwoli ci także na tłumaczenie rzutów, dzięki czemu możesz przejść z Mercator WGS-84 lat / long do strefy UTM n , na przykład, lub do dwóch stref UTM).
źródło
Zakładając, że chcesz wykonać zapytanie w bazie danych, prawdopodobnie chcesz przeprowadzić szybkie (niedokładne) wyszukiwanie, a następnie dokładnie obliczyć odległość dla powstałych miejsc. Czy to twój scenariusz?
Następująca funkcja (w PHP przepraszam) z grubsza obliczy różnice w szerokości i długości geograficznej. Różnice te zależą od szerokości geograficznej punktu wyszukiwania. Użyj ich (z małą tolerancją), aby szybko przeszukać bazę danych. Pole można obliczyć po prostu za pomocą szerokości i szerokości geograficznej -deltaLatitude oraz długości i długości geograficznej + -deltaLongitude.
Dzięki formule haverine możesz obliczyć odległości na kuli. Użyj go dla każdego ze znalezionych miejsc, aby uzyskać „dokładną” odległość. W ten sposób możesz sprawdzić, czy dwa miejsca znajdują się w określonym promieniu (koło zamiast pudełka).
źródło
Aby sprawdzić, czy lat / lon znajduje się w obrębie lub poza okręgiem ograniczającym, musisz obliczyć odległość od referencyjnego lat / lon do punktu lat / lon, który chcesz przetestować. Ponieważ twoja odległość wynosi 10 km lub mniej, spróbuję użyć przybliżenia Equirectangular, aby uzyskać odległość, a nie Haversine ze względu na prostotę. Aby uzyskać odległość w km:
Ważna uwaga: lat / lon w tej formule są w radianach, a nie stopniach. Typowa wartość EarthRadius to 6371 km, co zwróci odległość w jednostkach km. Teraz jest to prosty test, czy odległość znajduje się w kręgu, czy poza nim. Jeśli koło ograniczające działa, wybrałbym to.
W przypadku prostokąta ograniczającego przyjmuję, że chcesz zdefiniować prostokąt równolegle do równika. Następnie obliczyłem narożniki obwiedni za pomocą obliczeń zasięgu / łożyska (łożyska to 45 stopni, 135 stopni, 225 stopni i 315 stopni). Stamtąd zakładam, że nie ma cię wokół biegunów i wykorzystaj punkt w teście wielokąta.
źródło
Poniżej znajduje się kod T-SQL, którego używam do budowania obwiedni w SQL-Server 2012. W moim przypadku otrzymuję wartości dziesiętne dla Lat, Long. Używam tego, aby szybko ograniczyć liczbę wierszy, zanim użyję
STDistance
funkcji SQL, aby sprawdzić, czy wyniki rzeczywiście znajdują się w określonej odległości. Funkcje geograficzne są bardzo kosztowne w SQL Server, dlatego budując obwiednię, jestem w stanie znacznie zmniejszyć liczbę operacji, które trzeba wykonać.źródło