Podałem lokalizację określoną przez szerokość i długość geograficzną. Teraz chcę obliczyć prostokąt ograniczający w odległości np. 10 kilometrów od tego punktu.
Ramka graniczna powinna być zdefiniowana jako latmin, lngmin i latmax, lngmax.
Potrzebuję tych rzeczy, aby korzystać z interfejsu API panoramio .
Czy ktoś zna formułę, jak zdobyć te punkty?
Edycja: Chłopaki, szukam formuły / funkcji, która przyjmuje lat i lng jako dane wejściowe i zwraca ramkę ograniczającą jako latmin i lngmin oraz latmax i latmin. MySQL, php, c #, javascript jest w porządku, ale także pseudokod powinien być w porządku.
Edycja: nie szukam rozwiązania, które pokazuje mi odległość 2 punktów
Odpowiedzi:
Proponuję lokalne przybliżenie powierzchni Ziemi jako kuli o promieniu podanym przez elipsoidę WGS84 na danej szerokości geograficznej. Podejrzewam, że dokładne obliczenia latMin i latMax wymagałyby funkcji eliptycznych i nie przyniosłyby znaczącego wzrostu dokładności (WGS84 sam w sobie jest przybliżeniem).
Moja implementacja jest następująca (jest napisana w Pythonie; nie testowałem jej):
EDYCJA: Poniższy kod konwertuje (stopnie, liczby pierwsze, sekundy) na stopnie + ułamki stopnia i odwrotnie (nie testowano):
źródło
Napisałem artykuł o znajdowaniu współrzędnych ograniczających:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
W artykule wyjaśniono formuły, a także przedstawiono implementację języka Java. (Pokazuje również, dlaczego formuła Federico na minimalną / maksymalną długość geograficzną jest niedokładna).
źródło
public override string ToString()
bardzo źle jest przesłonić taką globalną metodę tylko w jednym celu, lepiej po prostu dodać inną metodę, a następnie przesłonić metodę standardową, która może być używana w innych częściach aplikacji, nie dla dokładnego gis ...Tutaj przekonwertowałem odpowiedź Federico A. Ramponiego na C # dla wszystkich zainteresowanych:
źródło
Napisałem funkcję JavaScript, która zwraca cztery współrzędne kwadratu ograniczającego, biorąc pod uwagę odległość i parę współrzędnych:
źródło
minLon = void 0;
imaxLon = MAX_LON;
to nadal nie działa.centerPoint
argument to tablica składająca się z dwóch współrzędnych. Np.getBoundingBox([42.2, 34.5], 50)
-void 0
jest wyjściem CoffeeScript dla „undefined” i nie będzie miało wpływu na działanie kodu.degLat.degToRad
nie jest funkcjądegToRad
błędów „nie jest funkcją”. Nigdy nie dowiedziałem się dlaczego, aleNumber.prototype.
nie jest to dobry pomysł na taką funkcję narzędzia, więc przekonwertowałem je na normalne funkcje lokalne. Należy również zauważyć, że zwracana skrzynka to [LNG, LAT, LNG, LAT] zamiast [LAT, LNG, LAT, LNG]. Zmodyfikowałem funkcję powrotu, gdy jej użyłem, aby uniknąć nieporozumień.Ponieważ potrzebowałem bardzo przybliżonego oszacowania, więc aby odfiltrować niepotrzebne dokumenty w zapytaniu elastycznym wyszukiwaniu, zastosowałem poniższą formułę:
N = km wymagane od podanej lokalizacji. W twoim przypadku N = 10
Nie dokładne, ale poręczne.
źródło
Szukasz elipsoidalnej formuły.
Najlepsze miejsce do rozpoczęcia kodowania, jakie znalazłem, jest oparte na bibliotece Geo :: Ellipsoid firmy CPAN. Daje podstawę do tworzenia testów i porównywania wyników z ich wynikami. Użyłem go jako podstawy dla podobnej biblioteki dla PHP u mojego poprzedniego pracodawcy.
Geo :: Elipsoida
Spójrz na
location
metodę. Zadzwoń dwa razy i masz swoją skrzynkę pocztową.Nie opublikowałeś, jakiego języka używasz. Być może dostępna jest już biblioteka geokodowania.
Aha, i jeśli jeszcze tego nie rozgryzłeś, mapy Google używają elipsoidy WGS84.
źródło
Ilustracja przedstawiająca @Jana Philipa Matuscheka doskonałe wyjaśnienie (proszę o głosowanie w górę jego odpowiedzi, a nie to; dodam to, ponieważ poświęciłem trochę czasu na zrozumienie oryginalnej odpowiedzi)
Technika prostokąta granicznego optymalizacji znajdowania najbliższych sąsiadów wymagałaby wyznaczenia minimalnej i maksymalnej pary szerokości i długości geograficznej dla punktu P w odległości d. Wszystkie punkty leżące poza nimi są zdecydowanie w odległości większej niż d od tego punktu. Należy tu zwrócić uwagę na obliczenie szerokości geograficznej przecięcia, co zostało podkreślone w wyjaśnieniu Jana Philipa Matuscheka. Szerokość geograficzna przecięcia nie jest równa szerokości geograficznej punktu P, ale jest nieco od niej przesunięta. Jest to często pomijana, ale ważna część przy określaniu prawidłowej minimalnej i maksymalnej długości granicznej punktu P dla odległości d. Jest to również przydatne w weryfikacji.
Odległość haversine między (szerokość geograficzna przecięcia, długość geograficzna wzwyż) a (szerokość, długość geograficzna) punktu P jest równa odległości d.
Streszczenie Pythona tutaj https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
źródło
Oto prosta implementacja za pomocą javascript, która opiera się na konwersji stopni szerokości geograficznej na km, gdzie
1 degree latitude ~ 111.2 km
.Granice mapy obliczam z podanej szerokości i długości geograficznej na 10km szerokości.
źródło
Zaadaptowałem skrypt PHP, który znalazłem, aby to zrobić. Możesz go użyć do znalezienia rogów pudełka wokół punktu (powiedzmy 20 km na zewnątrz). Mój konkretny przykład dotyczy interfejsu API Map Google:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometers
źródło
Pracowałem nad problemem z obwiednią jako pobocznym problemem znalezienia wszystkich punktów w promieniu SrcRad statycznego punktu LAT, LONG. Było sporo obliczeń, które używają
aby obliczyć granice długości geograficznej, ale okazało się, że nie daje to wszystkich potrzebnych odpowiedzi. Ponieważ naprawdę chcesz to zrobić
Wiem, wiem, że odpowiedź powinna być taka sama, ale stwierdziłem, że tak nie było. Okazało się, że nie upewniając się, że wykonuję najpierw (SRCrad / RadEarth), a następnie dzieląc przez część Cos, pomijam niektóre punkty lokalizacji.
Po uzyskaniu wszystkich punktów obwiedni, jeśli masz funkcję, która oblicza odległość między punktami na podstawie szerokości, łatwo jest uzyskać tylko te punkty, które mają określony promień odległości od stałego punktu. Oto co zrobiłem. Wiem, że wymagało to kilku dodatkowych kroków, ale pomogło mi
źródło
To bardzo proste, wystarczy wejść na stronę panoramio, a następnie otworzyć Mapę Świata ze strony panoramio, a następnie udać się do określonej lokalizacji o wymaganej szerokości i długości geograficznej.
Następnie znalazłeś szerokość i długość geograficzną w pasku adresu, na przykład w tym adresie.
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32,739485 => szerokość geograficzna ln = 70,491211 => długość geograficzna
ten widżet Panoramio JavaScript API tworzy ramkę ograniczającą wokół pary szerokości i długości, a następnie zwraca wszystkie zdjęcia w tych granicach.
Inny typ widżetu Panoramio JavaScript API, w którym można również zmienić kolor tła za pomocą przykładu i kodu, znajduje się tutaj .
Nie pojawia się w nastroju kompozycyjnym, po opublikowaniu.
źródło
Tutaj przekonwertowałem odpowiedź Federico A. Ramponiego na PHP, jeśli ktoś jest zainteresowany:
źródło
Dzięki @Fedrico A. za wdrożenie Phyton, przeniosłem go do klasy kategorii Objective C. Tutaj jest:
Przetestowałem to i wygląda na to, że działa dobrze. Struct BoundsLocation należy zastąpić klasą, użyłem jej tylko do udostępnienia go tutaj.
źródło
Wszystkie powyższe odpowiedzi są tylko częściowo poprawne . Szczególnie w regionie takim jak Australia, zawsze zawierają biegun i obliczają bardzo duży prostokąt nawet dla 10 km.
W szczególności algorytm Jana Philipa Matuscheka pod adresem http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex obejmował bardzo duży prostokąt z (-37, -90, -180, 180) dla prawie każdego punktu w Australii. Uderza to w dużych użytkowników w bazie danych i trzeba obliczyć odległość dla wszystkich użytkowników w prawie połowie kraju.
Odkryłem, że algorytm Earth Algorithm API Drupala opracowany przez Rochester Institute of Technology działa lepiej zarówno na biegunie, jak i gdzie indziej i jest znacznie łatwiejszy do wdrożenia.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Użyj
earth_latitude_range
iearth_longitude_range
z powyższego algorytmu do obliczania prostokąta ograniczającegoI użyj wzoru obliczania odległości udokumentowanego przez mapy Google, aby obliczyć odległość
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
Aby wyszukiwać według kilometrów zamiast mil, zamień 3959 na 6371. Dla (Lat, Lng) = (37, -122) i tabeli Znaczniki z kolumnami lat i lng , wzór jest następujący:
Przeczytaj moją szczegółową odpowiedź na https://stackoverflow.com/a/45950426/5076414
źródło
Oto odpowiedź Federico Ramponiego w Go. Uwaga: bez sprawdzania błędów :(
źródło