CRM og dataplattformerAnalytics og testingmarkedsførings~~POS=TRUNC

Beregn eller spør etter stor sirkelavstand mellom bredde- og lengdepunkter ved å bruke Haversine-formelen (PHP, JavaScript, Java, Python, MySQL, MSSQL-eksempler)

Denne måneden har jeg programmert ganske mye i PHP og MySQL med hensyn til GIS. Snokende rundt på nettet hadde jeg faktisk vanskelig for å finne noe av Geografiske beregninger for å finne avstanden mellom to steder, så jeg ønsket å dele dem her.

Flykart Europa med stor sirkelavstand

Den enkle måten å beregne en avstand mellom to punkter på er å bruke den pythagoreiske formelen til å beregne hypotenusen til en trekant (A² + B² = C²). Dette er kjent som Euklidisk avstand.

Det er en interessant start, men det gjelder ikke med geografi siden avstanden mellom breddegrad og lengdegrad er ikke like avstander fra hverandre. Når du kommer nærmere ekvator, kommer breddelinjene lenger fra hverandre. Hvis du bruker en slags enkel trianguleringsligning, kan den måle avstanden nøyaktig på det ene stedet og veldig galt på det andre, på grunn av jordens krumning.

Stor sirkelavstand

Rutene som reises lange avstander rundt jorden er kjent som Stor sirkelavstand. Det vil si... den korteste avstanden mellom to punkter på en kule er forskjellig fra punktene på et flatt kart. Kombiner det med det faktum at bredde- og lengdegradslinjene ikke er like langt ... og du har en vanskelig beregning.

Her er en fantastisk videoforklaring på hvordan Great Circles fungerer.

Haversine-formelen

Avstanden ved hjelp av jordens krumning er innlemmet i Haversine formel, som bruker trigonometri for å tillate krumning av jorden. Når du finner avstanden mellom to steder på jorden (i luftlinje), er en rett linje virkelig en bue.

Dette gjelder i flytur - har du noen gang sett på det faktiske kartet over flyreiser og lagt merke til at de er buede? Det er fordi det er kortere å fly i en bue mellom to punkter enn direkte til stedet.

PHP: Beregn avstand mellom 2 punkter i bredde og lengdegrad

Her er PHP-formelen for å beregne avstanden mellom to punkter (sammen med Mile vs. Kilometer-konvertering) avrundet til to desimaler.

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)); 
}

Variablene er:

  • $Latitude1 – en variabel for breddegraden til det første stedet.
  • $Lengdegrad1 – en variabel for den første plasseringens lengdegrad
  • $Latitude2 – en variabel for den andre plasseringens breddegrad.
  • $Lengdegrad2 – en variabel for den andre plasseringens lengdegrad.
  • $enhet – standard vesen miles. Dette kan oppdateres eller sendes som kilometer.

Java: Beregn avstanden mellom 2 bredde- og lengdepunkter

public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
    double theta = longitude1 - longitude2;
    double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit.equals("miles")) {
        return Math.round(distance, 2);
    } else if (unit.equals("kilometers")) {
        return Math.round(distance * 1.609344, 2);
    } else {
        return 0;
    }
}

Variablene er:

  • breddegrad 1 – en variabel for breddegraden til det første stedet.
  • lengdegrad 1 – en variabel for den første plasseringens lengdegrad
  • breddegrad 2 – en variabel for den andre plasseringens breddegrad.
  • lengdegrad 2 – en variabel for den andre plasseringens lengdegrad.
  • enhet – standard vesen miles. Dette kan oppdateres eller sendes som kilometer.

Javascript: Beregn avstanden mellom 2 bredde- og lengdepunkter

function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
    let theta = longitude1 - longitude2;
    let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit == 'miles') {
        return Math.round(distance, 2);
    } else if (unit == 'kilometers') {
        return Math.round(distance * 1.609344, 2);
    }
}

Variablene er:

  • breddegrad 1 – en variabel for breddegraden til det første stedet.
  • lengdegrad 1 – en variabel for den første plasseringens lengdegrad
  • breddegrad 2 – en variabel for den andre plasseringens breddegrad.
  • lengdegrad 2 – en variabel for den andre plasseringens lengdegrad.
  • enhet – standard vesen miles. Dette kan oppdateres eller sendes som kilometer.

Python: Beregn avstanden mellom 2 bredde- og lengdepunkter

Uansett, her er Python-formelen for å beregne avstanden mellom to punkter (sammen med Mile vs. Kilometer-konvertering) avrundet til to desimaler. Takk til sønnen min, Bill Karr, som er dataforsker for Åpne INSIGHTS, for koden.

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)

Variablene er:

  • breddegrad 1 – en variabel for din første plassering breddegrad.
  • lengdegrad 1 – en variabel for din første plassering lengdegrad
  • breddegrad 2 – en variabel for din andre plassering breddegrad.
  • lengdegrad 2 – en variabel for din andre plassering lengdegrad.
  • enhet – standard vesen miles. Dette kan oppdateres eller sendes som kilometer.

MySQL: Henter alle poster innenfor et område ved å beregne avstand i miles ved bruk av breddegrad og lengdegrad

Det er også mulig å bruke SQL til å gjøre en beregning for å finne alle poster innenfor en bestemt avstand. I dette eksemplet skal jeg spørre MyTable i MySQL for å finne alle postene som er mindre enn eller lik variabel $ avstand (i Miles) til min plassering på $ latitude og $ longitude:

Spørsmålet for å hente alle postene i et bestemt avstand ved å beregne avstanden i miles mellom to breddepunkter og lengdegrad er:

$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."

Du må tilpasse dette:

  • $ lengdegrad - dette er en PHP-variabel der jeg passerer punktets lengdegrad.
  • latitude - dette er en PHP-variabel der jeg passerer punktets lengdegrad.
  • $ avstand - dette er avstanden du vil finne alle postene mindre eller lik.
  • bord - dette er tabellen ... du vil erstatte den med bordnavnet ditt.
  • breddegrad - dette er feltet for din breddegrad.
  • lengdegrad - dette er ditt lengdegrad.

MySQL: Henter alle poster innenfor et område ved å beregne avstand i kilometer ved å bruke breddegrad og lengdegrad

Og her er SQL-spørringen som bruker kilometer i 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."

Du må tilpasse dette:

  • $ lengdegrad - dette er en PHP-variabel der jeg passerer punktets lengdegrad.
  • latitude - dette er en PHP-variabel der jeg passerer punktets lengdegrad.
  • $ avstand - dette er avstanden du vil finne alle postene mindre eller lik.
  • bord - dette er tabellen ... du vil erstatte den med bordnavnet ditt.
  • breddegrad - dette er feltet for din breddegrad.
  • lengdegrad - dette er ditt lengdegrad.

Jeg brukte denne koden i en kartleggingsplattform for bedrifter som vi brukte for en butikk med over 1,000 steder over hele Nord-Amerika, og det fungerte vakkert.

Microsoft SQL Server Geografisk Avstand: STDistance

Hvis du bruker Microsoft SQL Server, tilbyr de sin egen funksjon, STDistance for å beregne avstanden mellom to punkter ved hjelp av datatypen Geografi.

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);  

Hattip til Manash Sahoo, VP og arkitekt for Highbridge.

Douglas Karr

Douglas Karr er grunnleggeren av Martech Zone og en anerkjent ekspert på digital transformasjon. Douglas har hjulpet til med å starte flere vellykkede MarTech-oppstarter, har hjulpet til med due diligence på over 5 milliarder dollar i Martech-oppkjøp og -investeringer, og fortsetter å lansere sine egne plattformer og tjenester. Han er medgründer av Highbridge, et konsulentfirma for digital transformasjon. Douglas er også en publisert forfatter av en Dummies guide og en bok om lederskap for bedrifter.

78 Kommentarer

  1. Tusen takk for at du deler. Dette var en enkel kopierings- og limjobb og fungerer utmerket. Du har spart meg for mye tid.
    Til info for alle som porterer til C:
    dobbel grader2rad(dobbel grader) { returgrad*(3.14159265358979323846/180.0); }

  2. Veldig fint innlegg – fungerte veldig bra – jeg måtte bare endre navnet på bordet som holder lat-long. Det fungerer ganske raskt å.. Jeg har et rimelig lite antall lat-longs (< 400), men jeg tror dette vil skaleres fint. Fin side også – jeg har nettopp lagt den til del.icio.us-kontoen min og vil sjekke tilbake regelmessig.

  3. Jeg søkte hele dagen etter avstandsberegninger og fant harversine-algoritmen, takket være deg for å gi eksempelet på hvordan du setter det i en sql-setning. Takk og hilsen, Daniel

    1. Glad for å hjelpe, rails venn!

      Nå er jeg på leting etter en "i polygon" PHP-funksjon som vil ta en rekke sekvenserte bredde- og lengdegradskoordinater og finne ut om et annet punkt er innenfor eller utenfor polygonet.

  4. Jeg tror din SQL trenger en ha-setning.
    i stedet for WHERE-avstand <= $avstand du kanskje må
    bruk HAVING avstand <= $distanse

    ellers takk for at du sparte meg for mye tid og energi.

  5. Tusen takk for at du deler denne koden. Det sparte meg for mye utviklingstid. Også takk til leserne dine for å påpeke at en HAVING-erklæring er nødvendig for MySQL 5.x. Veldig hjelpsom.

  6. Hallo,

    Et annet spørsmål. Finnes det en formel for NMEA-strenger som den nedenfor?

    1342.7500,N,10052.2287,E

    $GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B

    Takk,
    Harry

  7. Jeg fant også ut at WHERE ikke fungerte for meg. Endret den til HAVING og alt fungerer perfekt. Først leste jeg ikke kommentarene og skrev den om ved å bruke et nestet utvalg. Begge vil fungere helt fint.

  8. Utrolig nyttig, tusen takk! Jeg hadde noen problemer med den nye "HAVING", i stedet for "HVOR", men når jeg leste kommentarene her (etter omtrent en halvtimes gnisning av tenner i frustrasjon =P), fikk jeg det til å fungere fint. Takk ^_^

  9. Husk at et utvalgt utsagn som dette vil være svært beregningsmessig intenst og derfor sakte. Hvis du har mange av disse spørsmålene, kan det gå i stykker ganske raskt.

    En mye mindre intens tilnærming er å kjøre et første (rå) utvalg ved å bruke et KVADRAT område definert av en beregnet avstand, dvs. "velg * fra tabellnavn der breddegrad mellom lat1 og lat2 og lengdegrad mellom lon1 og lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, lignende med lon. latdiff ~= avstand / 111 (for km), eller avstand/69 for miles siden 1 breddegrad er ~ 111 km (liten variasjon siden jorden er litt oval, men tilstrekkelig for dette formålet). londiff = avstand / (abs(cos(deg2rad(breddegrad))*111)) — eller 69 for miles (du kan faktisk ta en litt større firkant for å ta høyde for variasjoner). Ta så resultatet av det og mat det inn i det radielle utvalg. Bare ikke glem å ta hensyn til koordinater utenfor grensene - dvs. området for akseptabel lengdegrad er -180 til +180 og området for akseptabel breddegrad er -90 til +90 - i tilfelle latdiff eller londiff løper utenfor dette området . Merk at i de fleste tilfeller kan dette ikke være aktuelt siden det bare påvirker beregninger over en linje gjennom Stillehavet fra pol til pol, selv om det krysser en del av chukotka og en del av alaska.

    Det vi oppnår med dette er en betydelig reduksjon i antall poeng som du gjør denne beregningen mot. Hvis du har en million globale poeng i databasen fordelt omtrent jevnt og du ønsker å søke innenfor 100 km, så er ditt første (raske) søk på et område på 10000 20 kvadratkilometer og vil sannsynligvis gi omtrent 500 resultater (basert på jevn fordeling over en overflateareal på ca. 20M kvadratkilometer), noe som betyr at du kjører den komplekse avstandsberegningen XNUMX ganger for denne spørringen i stedet for en million ganger.

    1. Mindre feil i eksemplet... det vil være innenfor 50 km (ikke 100) siden vi ser på "radiusen" til... kvadratet vårt.

      1. Fantastisk råd! Jeg jobbet faktisk med en utvikler som skrev en funksjon som trakk den indre firkanten og deretter en rekursiv funksjon som laget "firkanter" rundt omkretsen for å inkludere og ekskludere de resterende punktene. Resultatet var et utrolig raskt resultat – han kunne evaluere millioner av poeng i mikrosekunder.

        Min tilnærming ovenfor er definitivt "rå", men dyktig. Takk igjen!

        1. Doug,

          Jeg har prøvd å bruke mysql og php for å evaluere om et lat langt punkt er innenfor en polygon. Vet du om utviklervennen din publiserte noen eksempler på hvordan du kan utføre denne oppgaven. Eller kjenner du noen gode eksempler. Takk på forhånd.

  10. Hei alle sammen, dette er min test SQL-setning:

    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

    og Mysql forteller meg at avstand, ikke eksisterer som en kolonne, jeg kan bruke rekkefølge etter, jeg kan gjøre det uten WHERE, og det fungerer, men ikke med det...

  11. Dette er flott, men det er akkurat som fuglene flyr. Det ville være flott å prøve å inkorporere google maps API til dette på en eller annen måte (kanskje ved hjelp av veier osv.) Bare for å gi en idé ved å bruke en annen form for transport. Jeg har ennå ikke laget en simulert annealing-funksjon i PHP som vil kunne tilby en effektiv løsning på det reisende selgerproblemet. Men jeg tror at jeg kanskje kan gjenbruke noe av koden din for å gjøre det.

  12. Bra artikkel! Jeg fant mange artikler som beskriver hvordan man beregner avstanden mellom to punkter, men jeg var virkelig ute etter SQL-kodebiten.

    1. Samme her! Hva er problemet :-/? hvordan løser du "avstanden" - kolonneproblemet? Hjelp oss, vær så snill!! 🙂

  13. 2 dager med research for å endelig finne denne siden som løser problemet mitt. Det ser ut til at jeg bør ta ut WolframAlpha og friske opp matematikken min. Endringen fra WHERE til HAVING har skriptet mitt i orden. TAKK SKAL DU HA

  14. Jeg skulle ønske dette var den første siden jeg fant på denne. Etter å ha prøvd mange forskjellige kommandoer var dette den eneste som fungerte riktig, og med minimale endringer som trengs for å passe til min egen database.
    Thanks a lot!

  15. Jeg skulle ønske dette var den første siden jeg fant på denne. Etter å ha prøvd mange forskjellige kommandoer var dette den eneste som fungerte riktig, og med minimale endringer som trengs for å passe til min egen database.
    Thanks a lot!

  16. Jeg vet at denne formelen fungerer, men jeg kan ikke se hvor jordens radius er tatt i betraktning. Kan noen opplyse meg, vær så snill?

  17. takk for at du la ut denne nyttige artikkelen,  
    men av en eller annen grunn vil jeg spørre
    hvordan få avstanden mellom coords inne i mysql db og coords satt inn i php av brukeren?
    for mer tydelig beskrivelse:
    1.bruker må sette inn [id] for å velge spesifiserte data fra db og brukerens koordiner
    2. php-filen henter måldataene (koordinater) ved hjelp av [id] og beregner deretter avstanden mellom bruker og målpunkt

    eller kan du bare få avstand fra koden nedenfor?

    $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) som avstand FRA `MyTable` WHERE distance >= ".$distance." >>>>kan jeg "ta ut" avstanden herfra?
    takk igjen,
    Timmy S

  18. ok, alt jeg har prøvd fungerer ikke. Jeg mener, det jeg har fungerer, men avstandene er langt unna.

    Kan noen se hva som er galt med denne koden?

    if(isset($_POST['innsendt'])){ $z = $_POST['postnummer']; $r = $_POST['radius']; echo "Resultater for ".$z; $sql = mysql_query(“VELG DISTINCT m.zipcode, m.MktName,m.LocAddSt,m.LocAddCity,m.LocAddState,m.x1,m.y1,m.verified,z1.lat,z2.lon,z1. by,z1.stat FRA mrk m, zip z1, zip z2 WHERE m.zipcode = z1.zipcode OG z2.zipcode = $z OG (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 ") ) <= $ (mysql_error()); while($row = mysql_fetch_array( $sql )) { $store1 = $row['MktName'].""; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].”, “.$row['LocAddState'].” ".$row['postnummer']; $latitude1 = $row['lat']; $longitude1 = $row['lon']; $latitude2 = $rad['y1']; $lengde2 = $rad['x1']; $city = $row['city']; $state = $row['state']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = avstand($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ echo “”; ekko "".$store.""; ekko $dis . "mil(er) unna"; ekko ""; } else { echo "".$store.""; ekko $dis . "mil(er) unna"; ekko ""; } }}

    min functions.php-kode
    funksjon getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $theta = $longitude1 – $longitude2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $avstand = acos($avstand); $avstand = rad2deg($avstand); $avstand = $avstand * 60 * 1.1515; switch($unit) { case 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } retur (runde($avstand,2)); }

    Takk på forhånd

  19. Hei Douglas, flott artikkel. Jeg syntes forklaringen din av de geografiske konseptene og koden var veldig interessant. Mitt eneste forslag ville være å mellomrom og rykke inn koden for visning (som Stackoverflow, for eksempel). Jeg forstår at du ønsker å spare plass, men konvensjonell kodeavstand/innrykk vil gjøre det mye lettere for meg, som programmerer, å lese og dissekere. Uansett, det er en liten ting. Fortsett den gode jobben.

  20. her mens du bruker med funksjon får vi en type avstand.. mens du bruker query, kommer det en annen type avstand

  21. det virker raskere (mysql 5.9) å bruke to ganger formelen i select og hvor:
    $formula = “(((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“.$latitude. ”*pi()/180)) * cos((`Breddegrad`*pi()/180)) * cos(((“.$lengdegrad.”- `Lengdegrad`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)";
    $sql = 'VELG *, '.$formula.' som avstand FRA tabellen WHERE '..$formula.' <= '.$distanse;

  22. Tusen takk for at du klippet denne artikkelen. Den er veldig nyttig.
    PHP ble først opprettet som en enkel skriptplattform kalt "Personal Home Page". I dag er PHP (forkortelsen for Hypertext Preprocessor) et alternativ til Microsofts Active Server Pages (ASP) teknologi.

    PHP er et åpen kildekode-språk på serversiden som brukes til å lage dynamiske nettsider. Det kan bygges inn i HTML. PHP brukes vanligvis sammen med en MySQL-database på Linux/UNIX-webservere. Det er sannsynligvis det mest populære skriptspråket.

  23. Jeg fant at løsningen ovenfor ikke fungerer som den skal.
    Jeg må bytte til:

    $qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitude . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $lengdegrad . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) som avstand FRA `register` “;

  24. Hei, jeg vil virkelig trenge din hjelp med dette.

    Jeg sendte en get-forespørsel til webserveren min http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $breddegrad
    -2.23389 = $lengdegrad
    og 20 = avstanden jeg ønsker å hente

    Men ved å bruke formelen din, henter den alle rader i db

    $results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”*pi()/180)) * sin((lat*pi()/180 ))+cos((“.$latitude.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$lengdegrad.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) som avstand FRA markører HAR avstand >= “.$distanse ));

    [{"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","adresse":"619, Escuela View, CA”,,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza”,”adresse”:”4546 El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”distance”:16077.937560795},{“ id":7,"name":"Barene og grillene","adresse":"24 Whiteley Street, Manchester","lat":53.485118865967,"lng":-2.1828699111938,"distance":8038.7620112314}]

    Jeg ønsker å hente bare rader med 20 miles, men det gir alle rader. Vennligst hva gjør jeg galt

  25. Jeg ser etter et lignende søk, men har økt litt – kort fortalt er dette å gruppere alle koordinater innenfor 2 miles fra hver koordinat og deretter telle hvor mange koordinater i hver gruppe og skrive ut bare én gruppe som har flest koordinater – selv om du har mer enn én gruppe blant grupper som har flest antall koordinater – bare skriv ut den tilfeldige gruppen fra gruppene med samme største tall –

Hva tror du?

Dette nettstedet bruker Akismet for å redusere spam. Lær hvordan kommentaren din behandles.

Relaterte artikler