Oblicz lub zapytaj o odległość wielkiego koła między punktami szerokości i długości geograficznej za pomocą formuły Haversine (przykłady PHP, Python, MySQL, MSSQL)

Haversine Formuła — odległość wielkiego koła — PHP, Python, MySQL

W tym miesiącu sporo programowałem w PHP i MySQL w odniesieniu do GIS. Szperając w sieci, trudno mi było znaleźć niektóre pliki Obliczenia geograficzne aby znaleźć odległość między dwoma lokalizacjami, więc chciałem je tutaj udostępnić.

Mapa lotów Europy z odległości ortodromy

Prostym sposobem obliczenia odległości między dwoma punktami jest użycie wzoru Pitagorasa do obliczenia przeciwprostokątnej trójkąta (A² + B² = C²). Jest to znane jako Odległość euklidesowa.

To ciekawy początek, ale nie dotyczy to geografii, ponieważ odległości między liniami szerokości i długości geograficznej są takie nie równe odległości niezależnie. W miarę zbliżania się do równika linie szerokości geograficznej oddalają się od siebie. Jeśli użyjesz jakiegoś prostego równania triangulacyjnego, może ono dokładnie zmierzyć odległość w jednym miejscu i strasznie źle w drugim, ze względu na krzywiznę Ziemi.

Odległość ortodromy

Trasy pokonywane na duże odległości wokół Ziemi są znane jako Odległość ortodromy. Czyli… najkrótsza odległość między dwoma punktami na kuli jest inna niż na płaskiej mapie. Połącz to z faktem, że linie szerokości i długości geograficznej nie są równoodległe… i otrzymasz trudną kalkulację.

Oto fantastyczny film wyjaśniający, jak działają wielkie kręgi.

Formuła Haversine

Odległość wykorzystująca krzywiznę Ziemi jest uwzględniona w Formuła Haversine, który wykorzystuje trygonometrię, aby uwzględnić krzywiznę Ziemi. Kiedy znajdujesz odległość między dwoma miejscami na ziemi (w linii prostej), linia prosta jest tak naprawdę łukiem.

Ma to zastosowanie w lotach lotniczych - czy kiedykolwiek spojrzałeś na rzeczywistą mapę lotów i zauważyłeś, że są wygięte? Dzieje się tak, ponieważ lot po łuku między dwoma punktami jest krótszy niż bezpośrednio do miejsca.

PHP: Oblicz odległość między 2 punktami szerokości i długości geograficznej

Oto wzór PHP do obliczania odległości między dwoma punktami (wraz z konwersją mil na kilometry) zaokrąglonych do dwóch miejsc po przecinku.

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
  $theta = $longitude1 - $longitude2; 
  $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
  $distance = acos($distance); 
  $distance = rad2deg($distance); 
  $distance = $distance * 60 * 1.1515; 
  switch($unit) { 
    case 'miles': 
      break; 
    case 'kilometers' : 
      $distance = $distance * 1.609344; 
  } 
  return (round($distance,2)); 
}

Zmienne to:

  • $Szerokość1 – zmienna określająca szerokość geograficzną pierwszej lokalizacji.
  • $Długość1 – zmienna określająca długość geograficzną Twojej pierwszej lokalizacji
  • $Szerokość2 – zmienna określająca szerokość geograficzną drugiej lokalizacji.
  • $Długość2 – zmienna określająca długość geograficzną drugiej lokalizacji.
  • $jednostka – domyślna istota mile. Można to zaktualizować lub przekazać jako kilometrów.

Python: Oblicz odległość między dwoma punktami szerokości i długości geograficznej

W każdym razie, oto wzór Pythona do obliczania odległości między dwoma punktami (wraz z konwersją mil na kilometry) zaokrąglonych do dwóch miejsc po przecinku. Podziękowania dla mojego syna, Billa Karra, który jest analitykiem danych dla OtwórzWglądy, dla kodu.

from numpy import sin, cos, arccos, pi, round

def rad2deg(radians):
    degrees = radians * 180 / pi
    return degrees

def deg2rad(degrees):
    radians = degrees * pi / 180
    return radians

def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
    
    theta = longitude1 - longitude2
    
    distance = 60 * 1.1515 * rad2deg(
        arccos(
            (sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) + 
            (cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
        )
    )
    
    if unit == 'miles':
        return round(distance, 2)
    if unit == 'kilometers':
        return round(distance * 1.609344, 2)

Zmienne to:

  • szerokość geograficzna1 – zmienna dla Twojej pierwszej lokalizacji szerokość.
  • długość geograficzna1 – zmienna dla Twojej pierwszej lokalizacji długość geograficzna
  • szerokość geograficzna2 – zmienna dla Twojej drugiej lokalizacji szerokość.
  • długość geograficzna2 – zmienna dla Twojej drugiej lokalizacji długość geograficzna.
  • jednostka – domyślna istota mile. Można to zaktualizować lub przekazać jako kilometrów.

MySQL: Pobieranie wszystkich rekordów z określonego zakresu poprzez obliczanie odległości w milach na podstawie szerokości i długości geograficznej

Możliwe jest również użycie SQL do obliczenia, aby znaleźć wszystkie rekordy w określonej odległości. W tym przykładzie zamierzam wysłać zapytanie do MyTable w MySQL, aby znaleźć wszystkie rekordy, które są mniejsze lub równe zmiennej odległości $ (w milach) do mojej lokalizacji na $ latitude i $ longitude:

Zapytanie o pobranie wszystkich rekordów w ramach określonego dystans poprzez obliczenie odległości w milach między dwoma punktami szerokości i długości geograficznej są:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."

Musisz to dostosować:

  • $ longitude - to jest zmienna PHP, w której podaję długość geograficzną punktu.
  • $ latitude - to jest zmienna PHP, w której podaję długość geograficzną punktu.
  • $ odległość - jest to odległość, na jaką chciałbyś znaleźć wszystkie rekordy mniejsze lub równe.
  • stół - to jest stół… będziesz chciał go zastąpić nazwą swojego stołu.
  • szerokość - to jest pole twojej szerokości geograficznej.
  • długość geograficzna - to jest pole twojej długości geograficznej.

MySQL: Pobieranie wszystkich rekordów z określonego zakresu poprzez obliczanie odległości w kilometrach przy użyciu szerokości i długości geograficznej

A oto zapytanie SQL używające kilometrów w MySQL:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."

Musisz to dostosować:

  • $ longitude - to jest zmienna PHP, w której podaję długość geograficzną punktu.
  • $ latitude - to jest zmienna PHP, w której podaję długość geograficzną punktu.
  • $ odległość - jest to odległość, na jaką chciałbyś znaleźć wszystkie rekordy mniejsze lub równe.
  • stół - to jest stół… będziesz chciał go zastąpić nazwą swojego stołu.
  • szerokość - to jest pole twojej szerokości geograficznej.
  • długość geograficzna - to jest pole twojej długości geograficznej.

Użyłem tego kodu w korporacyjnej platformie mapowania, której używaliśmy w sklepie detalicznym z ponad 1,000 lokalizacji w Ameryce Północnej i działał pięknie.

Odległość geograficzna Microsoft SQL Server: STDistance

Jeśli korzystasz z Microsoft SQL Server, oferują one własną funkcję, STOdległość do obliczania odległości między dwoma punktami przy użyciu typu danych Geografia.

DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);  
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);  
SELECT @g.STDistance(@h);  

Cynk kapelusza dla Manash Sahoo, wiceprezesa i architekta Highbridge.

Komentarze 77

  1. 1

    Bardzo dziękuję za udostępnienie. To była łatwa praca kopiowania i wklejania i działa świetnie. Zaoszczędziłeś mi dużo czasu.
    FYI dla każdego, kto przenosi się na C:
    double deg2rad (double deg) {return deg * (3.14159265358979323846 / 180.0); }

  2. 2

    Bardzo fajny post - działał bardzo ładnie - musiałem tylko zmienić nazwę stołu, na którym znajduje się łata. Działa dość szybko, aby ... Mam dość małą liczbę łat (<400), ale myślę, że to by się dobrze skalowało. Ładna strona też - właśnie dodałem ją do mojego konta del.icio.us i będę regularnie sprawdzać.

  3. 4
  4. 5
  5. 8

    myślę, że twój SQL potrzebuje instrukcji posiadania.
    zamiast WHERE odległość <= $ odległość, której możesz potrzebować
    użyj HAVING odległość <= $ odległość

    w przeciwnym razie dziękuję za zaoszczędzenie czasu i energii.

  6. 10
  7. 11
  8. 12

    Dziękuję bardzo za udostępnienie tego kodu. Zaoszczędziło mi to dużo czasu na rozwój. Dziękuję również czytelnikom za wskazanie, że oświadczenie HAVING jest konieczne dla MySQL 5.x. Bardzo pomocny.

  9. 14
  10. 15
  11. 16

    Stwierdziłem również, że GDZIE nie działa dla mnie. Zmieniłem go na MIEĆ i wszystko działa idealnie. Na początku nie przeczytałem komentarzy i przepisałem je, używając zagnieżdżonego wyboru. Oba będą działać dobrze.

  12. 17
  13. 18

    Niezwykle pomocny, bardzo dziękuję! Miałem trochę problemów z nowym „MAMY”, a nie „GDZIE”, ale kiedy przeczytałem tutaj komentarze (po około pół godzinie zgrzytania zębami z frustracji = P), udało mi się sprawnie działać. Dziękuję ^ _ ^

  14. 19
  15. 20

    Należy pamiętać, że takie polecenie typu select będzie bardzo intensywne obliczeniowo, a zatem powolne. Jeśli masz dużo takich zapytań, może to dość szybko przytłumić.

    O wiele mniej intensywnym podejściem jest wykonanie pierwszego (surowego) wyboru przy użyciu obszaru KWADRAT zdefiniowanego przez obliczoną odległość, tj. „Wybierz * z nazwy tabeli, gdzie szerokość geograficzna między lat1 i lat2 oraz długość geograficzna między lon1 i lon2”. lat1 = targetlatitude - latdiff, lat2 = targetlatitude + latdiff, podobnie jak lon. latdiff ~ = odległość / 111 (dla km) lub odległość / 69 dla mil, ponieważ 1 stopień szerokości geograficznej to ~ 111 km (niewielka zmiana, ponieważ ziemia jest lekko owalna, ale wystarczająca do tego celu). londiff = odległość / (abs (cos (deg2rad (szerokość geograficzna)) * 111)) - lub 69 na mile (w rzeczywistości można wziąć nieco większy kwadrat, aby uwzględnić różnice). Następnie weź wynik tego i wprowadź go do radialnego wyboru. Po prostu nie zapomnij wziąć pod uwagę współrzędnych poza granicami - tj. Zakres dopuszczalnej długości geograficznej wynosi od -180 do +180, a zakres dopuszczalnej szerokości wynosi od -90 do +90 - na wypadek, gdyby twój latdiff lub londiff wykraczał poza ten zakres . Zauważ, że w większości przypadków może to nie mieć zastosowania, ponieważ wpływa tylko na obliczenia na linii przechodzącej przez ocean Pacyfiku od bieguna do bieguna, chociaż przecina część czukotki i część Alaski.

    W ten sposób osiągamy znaczne zmniejszenie liczby punktów, na podstawie których dokonujesz tych obliczeń. Jeśli masz milion punktów globalnych w bazie danych rozmieszczonych z grubsza równomiernie i chcesz wyszukiwać w promieniu 100 km, to twoje pierwsze (szybkie) wyszukiwanie obejmuje obszar 10000 km20 i prawdopodobnie przyniesie około 500 wyników (przy równomiernym rozmieszczeniu na powierzchni około 20 mln kmXNUMX), co oznacza, że ​​dla tego zapytania wykonujesz złożone obliczenia odległości XNUMX razy, a nie milion razy.

    • 21
      • 22

        Fantastyczna rada! Właściwie pracowałem z programistą, który napisał funkcję, która wyciągnęła wewnętrzny kwadrat, a następnie funkcję rekurencyjną, która utworzyła „kwadraty” na obwodzie, aby uwzględnić i wykluczyć pozostałe punkty. Rezultatem był niesamowicie szybki wynik - potrafił ocenić miliony punktów w mikrosekundach.

        Moje podejście powyżej jest zdecydowanie „surowe”, ale możliwe. Dzięki jeszcze raz!

        • 23

          Doug,

          Próbowałem użyć mysql i php, aby ocenić, czy długa łata znajduje się w wielokącie. Czy wiesz, czy Twój znajomy programista opublikował jakieś przykłady, jak wykonać to zadanie. Czy znasz jakieś dobre przykłady. Z góry dziękuję.

  16. 24

    Cześć wszystkim, to jest moja testowa instrukcja SQL:

    SELECT DISTINCT area_id, (
    (
    (
    acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
    `lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
    `lat_dec` * pi( ) /180 )
    ) * cos( (
    ( 51.02 - `lon_dec` ) * pi( ) /180 )
    )
    )
    ) *180 / pi( )
    ) *60 * 1.1515 * 1.609344
    ) AS distance
    FROM `post_codes` WHERE distance <= 50

    a MySQL mówi mi, że odległość, nie istnieje jako kolumna, mogę użyć kolejności według, mogę to zrobić bez GDZIE i to działa, ale nie z nim…

  17. 26

    To jest świetne, ale tak jak ptaki latają. Byłoby wspaniale spróbować w jakiś sposób włączyć do tego Google Maps API (może przy użyciu dróg itp.) Tylko po to, aby dać pomysł za pomocą innej formy transportu. Nadal nie stworzyłem funkcji symulowanego wyżarzania w PHP, która byłaby w stanie zaoferować wydajne rozwiązanie problemu komiwojażera. Ale myślę, że być może uda mi się ponownie wykorzystać w tym celu część twojego kodu.

  18. 27
  19. 28

    Dobry artykuł! Znalazłem wiele artykułów opisujących sposób obliczania odległości między dwoma punktami, ale naprawdę szukałem fragmentu kodu SQL.

  20. 29
  21. 30
  22. 31
  23. 32
  24. 36

    2 dni poszukiwań, aby w końcu znaleźć tę stronę, która rozwiązuje mój problem. Wygląda na to, że lepiej wyskoczę z mojego WolframAlpha i poprawię matematykę. Zmiana z WHERE na HAVING sprawia, że ​​mój skrypt działa. DZIĘKUJĘ CI

  25. 37
    • 38

      Dzięki Georgi. Ciągle otrzymuję kolumnę „odległość” nie znaleziono. Raz zmieniłem GDZIE na POSIADAŁO to zadziałało jak urok!

  26. 39

    Chciałbym, żeby to była pierwsza strona, jaką znalazłem na tym. Po wypróbowaniu wielu różnych poleceń była to jedyna, która działała poprawnie i wymagała minimalnych zmian, aby dopasować moją własną bazę danych.
    Wielkie dzięki!

  27. 40

    Chciałbym, żeby to była pierwsza strona, jaką znalazłem na tym. Po wypróbowaniu wielu różnych poleceń była to jedyna, która działała poprawnie i wymagała minimalnych zmian, aby dopasować moją własną bazę danych.
    Wielkie dzięki!

  28. 41
  29. 42
  30. 43
  31. 45
  32. 46
  33. 47

    Wiem, że ten wzór działa, ale nie widzę, gdzie jest brany pod uwagę promień Ziemi. Czy ktoś może mnie oświecić, proszę?

  34. 49
  35. 50
  36. 52

    Dziękuję Douglas, zapytanie SQL jest dokładnie tym, czego potrzebowałem i pomyślałem, że będę musiał go napisać samodzielnie. Uratowałeś mnie od możliwych godzin krzywej uczenia się szerokości geograficznej!

  37. 53
  38. 55

    Dziękuję za ten wspaniały artykuł! Właśnie przetestowałem kod w mojej bazie danych i działało świetnie! 

  39. 56
  40. 58

    dziękuję za opublikowanie tego pomocnego artykułu,  
    ale z jakiegoś powodu chciałbym zapytać
    jak uzyskać odległość między współrzędnymi wewnątrz bazy mysql a współrzędnymi wstawionymi do php przez użytkownika?
    aby dokładniej opisać:
    1. użytkownik musi wstawić [id], aby wybrać określone dane z bazy danych i współrzędne samego użytkownika
    2. plik php pobierz dane celu (współrzędne) za pomocą [id], a następnie oblicz odległość między użytkownikiem a punktem docelowym

    czy może po prostu uzyskać odległość od poniższego kodu?

    $ qry = „SELECT *, (((acos (sin ((„. $ latitude. ”) * pi () / 180)) * sin ((„ Latitude ”* pi () / 180)) + cos ((„. $ latitude. ”* pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((". $ longitude." - `Longitude`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) jako odległość OD `MyTable` WHERE distance> =". $ Distance. " >>>> czy mogę „usunąć” odległość stąd?
    dzięki jeszcze raz,
    Timmy S.

  41. 60

    ok, wszystko czego próbowałem nie działa. To znaczy to, co mam, działa, ale odległości są dalekie.

    Czy ktokolwiek mógłby zobaczyć, co jest nie tak z tym kodem?

    if (isset ($ _ POST ['przesłane'])) {$ z = $ _POST ['kod pocztowy']; $ r = $ _POST ['promień']; echo “Wyniki dla”. $ z; $ sql = mysql_query („SELECT DISTINCT m.zipcode, m.MktName, m.LocAddSt, m.LocAddCity, m.LocAddState, m.x1, m.y1, m.verified, z1.lat, z2.lon, z1. city, z1.state OD mrk m, zip z1, zip z2 GDZIE m.zipcode = z1.zipcode AND z2.zipcode = $ z AND (3963 * acos (truncate (sin (z2.lat / 57.2958) * sin (m. y1 / 57.2958) + cos (z2.lat / 57.2958) * cos (m.y1 / 57.2958) * cos (m.x1 / 57.2958 - z2.lon / 57.2958), 8))) <= $ r ") lub umrzeć (mysql_error ()); while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. "”; $ store = $ row ['LocAddSt']. ””; $ store. = $ row ['LocAddCity']. ”,„. $ row ['LocAddState']. ” „. $ Row ['kod pocztowy']; $ latitude1 = $ row ['lat']; $ longitude1 = $ row ['lon']; $ latitude2 = $ row ['y1']; $ longitude2 = $ row ['x1']; $ city = $ row ['city']; $ stan = $ wiersz ['stan']; $ dis = getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi'); // $ dis = odległość ($ lat1, $ lon1, $ lat2, $ lon2); $ zweryfikowane = $ wiersz ['zweryfikowane']; if ($ zweryfikowane == '1') {echo „”; echo „”. $ sklep. ””; echo $ dis. " mile stąd"; Echo ""; } else {echo „”. $ sklep. ””; echo $ dis. " mile stąd"; Echo ""; }}}

    mój kod functions.php
    funkcja getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2; $ odległość = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ); $ odległość = acos ($ odległość); $ odległość = rad2deg ($ odległość); $ odległość = $ odległość * 60 * 1.1515; switch ($ unit) {case 'Mi': break; przypadek „Km”: $ odległość = $ odległość * 1.609344; } return (round ($ distance, 2)); }

    Z góry dziękuję

  42. 61
  43. 62

    Hej Douglas, świetny artykuł. Uważam, że twoje wyjaśnienie pojęć geograficznych i kodu jest naprawdę interesujące. Moją jedyną sugestią byłoby spacje i wcięcie kodu do wyświetlania (na przykład Stackoverflow). Rozumiem, że chcesz zaoszczędzić miejsce, ale konwencjonalne odstępy / wcięcia w kodzie znacznie ułatwiłyby mi jako programistowi czytanie i analizowanie. W każdym razie to drobiazg. Kontynuuj wspaniałą pracę.

  44. 64
  45. 65

    tutaj podczas korzystania z funkcji otrzymujemy jeden rodzaj odległości ... podczas gdy przy zapytaniu nadchodzi inny rodzaj odległości

  46. 66
  47. 67
  48. 68
  49. 69
  50. 70

    wydaje się szybsze (mysql 5.9) dwukrotne użycie formuły w selekcji i gdzie:
    $ formuła = „(((acos (sin ((„. $ latitude. ”) * pi () / 180)) * sin ((„ Latitude ”* pi () / 180)) + cos ((„. $ latitude. ”* Pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((". $ Longitude." - `Longitude`) * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) ”;
    $ sql = 'SELECT *,'. $ formula. ' jako odległość OD tabeli GDZIE '.. $ wzór.' <= '. $ odległość;

  51. 71
  52. 72

    Wielkie dzięki za przeczytanie tego artykułu. Jest bardzo pomocny.
    Początkowo PHP zostało stworzone jako prosta platforma skryptowa o nazwie „Osobista strona główna”. Obecnie PHP (skrót od Hypertext Preprocessor) jest alternatywą technologii Microsoft Active Server Pages (ASP).

    PHP jest językiem serwerowym typu open source, używanym do tworzenia dynamicznych stron internetowych. Może być osadzony w HTML. PHP jest zwykle używane w połączeniu z bazą danych MySQL na serwerach WWW Linux / UNIX. Jest to prawdopodobnie najpopularniejszy język skryptowy.

  53. 73

    Powyższe rozwiązanie nie działa poprawnie.
    Muszę zmienić na:

    $ qqq = "SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((". $ latitude. “* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((". $ longitude." - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) jako odległość OD „rejestru”;

  54. 75
  55. 76

    Witam, naprawdę będę potrzebować twojej pomocy w tej sprawie.

    Wysłałem żądanie pobierania do mojego serwera internetowego http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = szerokość geograficzna $
    -2.23389 = długość geograficzna $
    a 20 = odległość, którą chcę odzyskać

    Jednak przy użyciu formuły pobiera wszystkie wiersze w mojej bazie danych

    $ wyniki = DB :: select (DB :: raw ("SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((lat * pi () / 180 )) + cos ((„. $ latitude.” * pi () / 180)) * cos ((lat * pi () / 180)) * cos (((„. $ longitude.” - lng) * pi ( ) / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) jako odległość OD znaczników HAVING odległość> = ". $ Odległość));

    [{„Id”: 1, ”name”: ”Frankie Johnnie & Luigo Too”, ”address”: ”939 W El Camino Real, Mountain View, CA”, „lat”: 37.386337280273, „lng”: - 122.08582305908, „Distance”: 16079.294719663}, {„id”: 2, ”name”: ”Amici's East Coast Pizzeria”, „address”: ”790 Castro St, Mountain View, CA”, „lat”: 37.387138366699, „lng”: -122.08323669434, „distance”: 16079.175940152}, {„id”: 3, ”name”: ”Kapp's Pizza Bar & Grill”, „address”: ”191 Castro St, Mountain View, CA”, „lat”: 37.393886566162, ”Lng”: - 122.07891845703, ”distance”: 16078.381373826}, {„id”: 4, ”name”: ”Round Table Pizza: Mountain View”, „address”: ”570 N Shoreline Blvd, Mountain View, CA”, ”Lat”: 37.402652740479, ”lng”: - 122.07935333252, ”distance”: 16077.420540582}, {„id”: 5, ”name”: ”Tony & Alba's Pizza & Pasta”, „address”: ”619 Escuela Ave, Mountain View, CA ”,„ lat ”: 37.394012451172,„ lng ”: - 122.09552764893,„ distance ”: 16078.563225154}, {„ id ”: 6,„ name ”:” Oregano's Wood-Pizza ”,„ address ”:” 4546 El Camino Real, Los Altos, CA ”,„ lat ”: 37.401725769043,„ lng ”: - 122.11464691162,„ distance ”: 16077.937560795}, {„ id ”: 7,„ name ”:„ Bary i grille ”,„ address ”:„ 24 Whiteley Street, Manchester ”,„ lat ”: 53.485118865967,„ lng ”: - 2.1828699111938,„ distance ”: 8038.7620112314}]

    Chcę pobrać tylko rzędy z 20 milami, ale to pokazuje wszystkie rzędy. Proszę, co robię źle

  56. 77

    Szukam podobnego zapytania, ale nieco przyspieszonego – w skrócie oznacza to zgrupowanie wszystkich współrzędnych w promieniu 2 mil od każdej współrzędnej, a następnie policzenie, ile współrzędnych w każdej grupie i wyprowadzenie tylko jednej grupy, która ma najwięcej współrzędnych – nawet jeśli masz więcej niż jedną grupę wśród grup o największej liczbie współrzędnych – po prostu wypisz losową grupę z grup o tej samej największej liczbie –

Co o tym myślisz?

Ta strona używa Akismet do redukcji spamu. Dowiedz się, jak przetwarzane są dane komentarza.