Analitika i testiranjeCRM i platforme podatakaMarketing alati

Izračunajte ili postavite upit za udaljenost velikog kruga između tačaka geografske širine i dužine koristeći Haversine formulu (PHP, JavaScript, Java, Python, MySQL, MSSQL primjeri)

Ovog mjeseca sam dosta programirao PHP i MySQL u odnosu na GIS. Njuškajući po mreži, bilo mi je teško pronaći neke od njih Geografski proračuni kako bih pronašao udaljenost između dvije lokacije, pa sam ih želio podijeliti ovdje.

Karta leta Europa s velikom kružnom udaljenostom

Jednostavan način izračuna udaljenosti između dvije točke je pomoću pitagorejske formule za izračunavanje hipotenuze trokuta (A² + B² = C²). Ovo je poznato kao Euklidska udaljenost.

To je zanimljiv početak, ali se ne odnosi na geografiju jer razdaljina između linija geografske širine i dužine nije jednaka. Kako se približavate ekvatoru, linije geografske širine se dalje udaljavaju. Ako koristite jednostavnu jednadžbu triangulacije, ona može precizno izmjeriti udaljenost na jednoj lokaciji, a pogrešno na drugoj, zbog zakrivljenosti Zemlje.

Udaljenost velike kružnice

Rute koje se putuju na velike udaljenosti oko Zemlje poznate su kao Velika kružna udaljenost. To jest... najkraća udaljenost između dvije tačke na sferi razlikuje se od tačaka na ravnoj karti. Kombinujte to sa činjenicom da linije geografske širine i dužine nisu jednako udaljene... i dobićete tešku kalkulaciju.

Evo fantastičnog video objašnjenja kako funkcioniraju Veliki krugovi.

Formula Haversine

Udaljenost koja koristi zakrivljenost Zemlje uključena je u Haversine formulu, koja koristi trigonometriju kako bi omogućila zakrivljenost Zemlje. Kada pronalazite udaljenost između 2 mjesta na Zemlji (zračnom linijom), prava linija je zapravo luk.

Ovo je primjenjivo u zračnom letu – da li ste ikada pogledali stvarnu kartu letova i primijetili da su zakrivljeni? To je zato što je letenje u luku između dvije točke kraće nego direktno do lokacije.

PHP: Izračunajte udaljenost između 2 tačke širine i dužine

Evo PHP formule za izračunavanje udaljenosti između dve tačke (zajedno sa konverzijom milja prema kilometru) zaokružene na dve decimale.

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

Varijable su:

  • $Latitude1 – varijabla za geografsku širinu vaše prve lokacije.
  • $Longitude1 – varijabla za geografsku dužinu vaše prve lokacije
  • $Latitude2 – varijabla za geografsku širinu vaše druge lokacije.
  • $Longitude2 – varijabla za geografsku dužinu vaše druge lokacije.
  • $unit – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.

Java: Izračunajte udaljenost između 2 tačke geografske širine i dužine

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

Varijable su:

  • geografska širina1 – varijabla za geografsku širinu vaše prve lokacije.
  • geografska dužina1 – varijabla za geografsku dužinu vaše prve lokacije
  • geografska širina2 – varijabla za geografsku širinu vaše druge lokacije.
  • geografska dužina2 – varijabla za geografsku dužinu vaše druge lokacije.
  • jedinica – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.

Javascript: Izračunajte udaljenost između 2 tačke geografske širine i dužine

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

Varijable su:

  • geografska širina1 – varijabla za geografsku širinu vaše prve lokacije.
  • geografska dužina1 – varijabla za geografsku dužinu vaše prve lokacije
  • geografska širina2 – varijabla za geografsku širinu vaše druge lokacije.
  • geografska dužina2 – varijabla za geografsku dužinu vaše druge lokacije.
  • jedinica – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.

Python: Izračunajte udaljenost između 2 tačke geografske širine i dužine

U svakom slučaju, evo Python formule za izračunavanje udaljenosti između dvije tačke (zajedno sa konverzijom milja u odnosu na kilometar) zaokružene na dvije decimale. Svaka čast mom sinu, Billu Karru koji radi kao Data Scientist OpenINSIGHTS, za kod.

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)

Varijable su:

  • geografska širina1 – varijabla za vašu prvu lokaciju širina.
  • geografska dužina1 – varijabla za vašu prvu lokaciju zemljopisnu dužinu
  • geografska širina2 – varijabla za vašu drugu lokaciju širina.
  • geografska dužina2 – varijabla za vašu drugu lokaciju zemljopisnu dužinu.
  • jedinica – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.

MySQL: Dohvaćanje svih zapisa unutar raspona izračunavanjem udaljenosti u miljama koristeći geografsku širinu i dužinu

Također je moguće koristiti SQL za izračunavanje svih zapisa unutar određene udaljenosti. U ovom primjeru, postavit ću upit MyTable u MySQL da pronađem sve zapise koji su manji ili jednaki promjenljivoj udaljenosti (u miljama) do moje lokacije na $latitude i $longitude:

Upit za dohvaćanje svih zapisa unutar određenog rastojanje izračunavanjem udaljenosti u miljama između dvije tačke geografske širine i dužine su:

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

Morat ćete prilagoditi ovo:

  • $ zemljopisne dužine - ovo je PHP varijabla gdje prolazim dužinu točke.
  • $ geografska širina - ovo je PHP varijabla gdje prolazim dužinu točke.
  • $ udaljenost - ovo je udaljenost na kojoj biste željeli pronaći sve zapise manje ili jednake.
  • sto - ovo je tablica ... to ćete htjeti zamijeniti imenom svoje tablice.
  • širina - ovo je polje vaše geografske širine.
  • zemljopisnu dužinu - ovo je polje vaše geografske dužine.

MySQL: Dohvaćanje svih zapisa unutar raspona izračunavanjem udaljenosti u kilometrima koristeći geografsku širinu i dužinu

I evo SQL upita koji koristi kilometre u 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."

Morat ćete prilagoditi ovo:

  • $ zemljopisne dužine - ovo je PHP varijabla gdje prolazim dužinu točke.
  • $ geografska širina - ovo je PHP varijabla gdje prolazim dužinu točke.
  • $ udaljenost - ovo je udaljenost na kojoj biste željeli pronaći sve zapise manje ili jednake.
  • sto - ovo je tablica ... to ćete htjeti zamijeniti imenom svoje tablice.
  • širina - ovo je polje vaše geografske širine.
  • zemljopisnu dužinu - ovo je polje vaše geografske dužine.

Koristila sam ovaj kod u platformi za mapiranje preduzeća, koju smo koristili za maloprodaju sa preko 1,000 lokacija širom Sjeverne Amerike, i to je djelovalo lijepo.

Microsoft SQL Server Geografska udaljenost: STDistance

Ako koristite Microsoft SQL Server, oni nude svoju vlastitu funkciju, STDistance za izračunavanje udaljenosti između dvije tačke koristeći tip podataka Geografija.

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

Šešir za Manash Sahoo, potpredsjednik i arhitekta Highbridge.

Douglas Karr

Douglas Karr je osnivač Martech Zone i priznati stručnjak za digitalnu transformaciju. Douglas je pomogao u pokretanju nekoliko uspješnih MarTech startupa, pomogao je u due diligenceu od preko 5 milijardi dolara u Martech akvizicijama i investicijama, te nastavlja sa lansiranjem vlastitih platformi i usluga. On je suosnivač Highbridge, konsultantska firma za digitalnu transformaciju. Douglas je također objavljeni autor Dummie's vodiča i knjige o poslovnom liderstvu.

Vezani članci

78 Komentari

  1. Hvala vam puno na dijeljenju. Ovo je bio lak posao kopiranja i lijepljenja i odlično funkcionira. Uštedeli ste mi puno vremena.
    FYI za sve koji portiraju na C:
    double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }

  2. Vrlo lijepa objava – funkcionirala je jako lijepo – morao sam samo promijeniti ime stola sa lat-long. Radi prilično brzo da.. Imam relativno mali broj lat-longs (< 400), ali mislim da bi ovo bilo dobro skalirati. I dobra stranica – upravo sam je dodao na svoj del.icio.us nalog i redovno ću provjeravati.

    1. Drago mi je pomoći, rails prijatelju!

      Sada sam u potrazi za PHP funkcijom 'u poligonu' koja će uzeti niz sekvencioniranih koordinata geografske širine i dužine i otkriti da li je druga tačka unutar ili izvan poligona.

  3. Mislim da je vašem SQL-u potreban iskaz.
    umjesto WHERE distance <= $distance možda ćete trebati
    koristite HAVING distance <= $distance

    inače hvala što si mi uštedio gomilu vremena i energije.

  4. Hvala vam puno što ste podijelili ovaj kod. To mi je uštedilo dosta vremena za razvoj. Takođe, hvala vašim čitaocima što su istakli da je izjava HAVING neophodna za MySQL 5.x. Vrlo korisno.

  5. Zdravo,

    Drugo pitanje. Postoji li formula za NMEA stringove poput one ispod?

    1342.7500,N,10052.2287,E

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

    hvala,
    Harry

  6. Također sam otkrio da WHERE ne radi za mene. Promijenio u HAVING i sve radi savršeno. U početku nisam čitao komentare i prepisao sam ih koristeći ugniježđeni odabir. Oba će raditi sasvim dobro.

  7. Nevjerovatno korisno, hvala vam puno! Imao sam problema sa novim “IMATI”, a ne “GDJE”, ali kada sam pročitao komentare ovdje (nakon otprilike pola sata frustrirano škrgutanja zubima =P), dobro sam uspio. Hvala ^_^

  8. Imajte na umu da će takva odabrana izjava biti računski vrlo intenzivna i stoga spora. Ako imate puno tih upita, stvari mogu brzo da se završe.

    Mnogo manje intenzivan pristup je pokretanje prvog (sirovog) odabira koristeći KVADRATNU oblast definisanu izračunatom rastojanjem, tj. “odaberite * iz naziva tabele gde je geografska širina između lat1 i lat2 i dužina između lon1 i lon2”. lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, slično kao i lon. latdiff ~= udaljenost / 111 (za km), ili udaljenost/69 za milje jer je 1 stepen geografske širine ~ 111 km (mala varijacija jer je zemlja blago ovalna, ali dovoljna za ovu svrhu). londiff = udaljenost / (abs(cos(deg2rad(latitude))*111)) — ili 69 za milje (zapravo možete uzeti malo veći kvadrat da biste uzeli u obzir varijacije). Zatim uzmite rezultat toga i unesite ga u radijalni odabir. Samo ne zaboravite da uzmete u obzir koordinate izvan granica – tj. raspon prihvatljive geografske dužine je -180 do +180, a raspon prihvatljive geografske širine je -90 do +90 — u slučaju da vaš latdiff ili londiff ide izvan ovog raspona . Imajte na umu da u većini slučajeva ovo možda nije primjenjivo jer utječe samo na proračune preko linije kroz Tihi ocean od pola do pola, iako siječe dio Čukotke i dio Aljaske.

    Ono što time postižemo je značajno smanjenje broja bodova prema kojima vršite ovu kalkulaciju. Ako imate milion globalnih tačaka u bazi podataka raspoređenih otprilike ravnomjerno i želite da pretražujete u krugu od 100 km, tada je vaša prva (brza) pretraga površine 10000 kvadratnih kilometara i vjerovatno će dati oko 20 rezultata (zasnovano na ravnomjernoj distribuciji na površine oko 500M kvadratnih kilometara), što znači da za ovaj upit izvodite složeno izračunavanje udaljenosti 20 puta umjesto milion puta.

      1. Fantastičan savjet! Zapravo sam radio sa programerom koji je napisao funkciju koja je povukla unutrašnji kvadrat, a zatim rekurzivnu funkciju koja je napravila 'kvadrate' oko perimetra da bi uključila i isključila preostale tačke. Rezultat je bio neverovatno brz rezultat – mogao je da proceni milione poena u mikrosekundama.

        Moj gore navedeni pristup je definitivno 'grub', ali sposoban. Hvala još jednom!

        1. Doug,

          Pokušavao sam da koristim mysql i php da procenim da li je duga tačka lat unutar poligona. Znate li da li je vaš prijatelj programer objavio ikakve primjere kako da izvršite ovaj zadatak. Ili znate neki dobar primjer. Hvala unaprijed.

  9. Zdravo svima ovo je moj test SQL izraz:

    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 mi govori da udaljenost, ne postoji kao kolona, ​​mogu koristiti poredak po, mogu to učiniti bez WHERE, i radi, ali ne sa njim...

  10. Ovo je sjajno, međutim to je baš kao što ptice lete. Bilo bi sjajno pokušati i na neki način uključiti API google maps (možda korištenjem cesta itd.) Samo da date ideju koristeći drugačiji oblik prijevoza. Još uvek treba da napravim simuliranu funkciju žarenja u PHP-u koja bi bila u stanju da ponudi efikasno rešenje za problem trgovačkog putnika. Ali mislim da ću možda moći ponovo upotrijebiti dio vašeg koda da to učinim.

  11. Dobar članak! Pronašao sam mnogo članaka koji opisuju kako izračunati udaljenost između dvije tačke, ali sam zaista tražio SQL isječak.

  12. 2 dana istraživanja da konačno pronađem ovu stranicu koja rješava moj problem. Izgleda da je bolje da izbacim svoju WolframAlpha-u i popravim matematiku. Promjena sa WHERE na HAVING ima moju skriptu u radnom stanju. HVALA TI

  13. Volio bih da je ovo prva stranica koju sam pronašao o ovome. Nakon pokušaja mnogih različitih komandi, ovo je jedina koja je ispravno radila i sa minimalnim promjenama potrebnim da bi se uklopila u moju vlastitu bazu podataka.
    Puno hvala!

  14. Volio bih da je ovo prva stranica koju sam pronašao o ovome. Nakon pokušaja mnogih različitih komandi, ovo je jedina koja je ispravno radila i sa minimalnim promjenama potrebnim da bi se uklopila u moju vlastitu bazu podataka.
    Puno hvala!

  15. hvala na objavi ovog korisnog članka,  
    ali iz nekog razloga želim da pitam
    kako dobiti udaljenost između koordinata unutar mysql db-a i koordinata koje je korisnik umetnuo u php?
    za jasnije opisati:
    1.korisnik mora umetnuti [id] za odabir specificiranih podataka iz db-a i samih korisnika
    2. php fajl dobija ciljne podatke (koorde) koristeći [id], a zatim izračunava udaljenost između korisnika i ciljne tačke

    ili jednostavno možete dobiti udaljenost od koda ispod?

    $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) kao udaljenost OD `MyTable` GDJE udaljenost >= “.$distance.” >>>>mogu li odavde "izvući" udaljenost?
    hvala još jednom,
    Timmy S

  16. ok, sve što sam probao ne radi. Mislim, ono što imam radi, ali udaljenosti su velike.

    Da li bi neko mogao da vidi šta nije u redu sa ovim kodom?

    if(isset($_POST['submitted'])){ $z = $_POST['zipcode']; $r = $_POST['radijus']; echo “Rezultati za “.$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. grad,z1.state FROM mrk m, zip z1, zip z2 GDJE m.zipcode = z1.zipcode I z2.zipcode = $z I (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 ) ) ili <= ) ) ") (mysql_error()); while($row = mysql_fetch_array($sql)) { $store1 = $row['MktName']."”; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." “.$row['zipcode']; $latitude1 = $red['lat']; $longitude1 = $red['lon']; $latitude2 = $red['y1']; $longitude2 = $red['x1']; $city = $row['grad']; $state = $row['state']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = distance($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ echo “”; echo “.$store.””; echo $dis . " miljama daleko"; echo “”; } else { echo “.$store.””; echo $dis . " miljama daleko"; echo “”; } }}

    moj kod functions.php
    funkcija 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)) ); $distanca = akos($udaljenost); $distanca = rad2deg($distanca); $distance = $distance * 60 * 1.1515; switch($unit) { case 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } povratak (okrugli($distance,2)); }

    Unaprijed hvala

  17. Hej Douglase, odličan članak. Vaše objašnjenje geografskih koncepata i šifre bilo mi je zaista zanimljivo. Moj jedini prijedlog bi bio da razmaknete i uvučete kod za prikaz (kao Stackoverflow, na primjer). Razumijem da želite uštedjeti prostor, ali konvencionalni razmak/uvlačenje koda bi mi, kao programeru, mnogo olakšalo čitanje i seciranje. U svakom slučaju, to je mala stvar. Nastavite sa odličnim radom.

  18. čini se bržim (mysql 5.9) koristiti dvostruku formulu u odabiru i gdje:
    $formula = “(((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 = 'IZABIR *, '.$formula.' kao udaljenost OD tabele WHERE '..$formula.' <= '.$distance;

  19. Hvala puno što ste pročitali ovaj članak, od velike je pomoći.
    PHP je isprva kreiran kao jednostavna platforma za skriptiranje pod nazivom “Personal Home Page”. Danas je PHP (skraćenica od Hypertext Preprocessor) alternativa Microsoftovoj tehnologiji Active Server Pages (ASP).

    PHP je jezik otvorenog koda na strani servera koji se koristi za kreiranje dinamičkih web stranica. Može se ugraditi u HTML. PHP se obično koristi u sprezi sa MySQL bazom podataka na Linux/UNIX web serverima. To je vjerovatno najpopularniji skriptni jezik.

  20. Našao sam da gore navedeno rješenje ne radi kako treba.
    Moram promijeniti u:

    $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) kao udaljenost OD `registra` “;

  21. Zdravo, molim vas, zaista će mi trebati vaša pomoć oko ovoga.

    Napravio sam zahtjev za preuzimanje svom web serveru
    53.47792 = $latitude
    -2.23389 = $dužina
    i 20 = udaljenost koju želim pronaći

    Međutim, koristeći vašu formulu, dohvaća sve redove u mojoj db

    $results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”))pi()/180)) * sin((latpi()/180))+cos((“.$latitude.”pi()/180)) * cos((latpi()/180)) * cos(((.$longitude.”- lng)pi()/180))))180/pi())601.1515*1.609344) kao rastojanje OD markera KOJI IMAJU rastojanje >= “.$distance ));

    [{“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”,”adresa”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”adresa”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”adresa Escuela”:619”: View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Origano's Wood-Fired Pizza:””4546 El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”distance”:16077.937560795},{“ id”:7,”name”:”Šarkovi i roštilji”,”adresa”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”distance”:8038.7620112314

    Želim da dohvatim samo redove sa 20 milja, ali to donosi sve redove. Molim te šta radim pogrešno

  22. Tražim sličan upit, ali sam se malo pojačao – ukratko, ovo je grupirati sve koordinate unutar 2 milje od svake koordinate, a zatim izbrojati koliko koordinata u svakoj grupi i ispisati samo jednu grupu koja ima najviše koordinata – čak i ako imate više od jedne grupe među grupama koje imaju najveći broj koordinata – jednostavno ispišite slučajnu grupu iz grupa s istim najvećim brojem –

Šta ti misliš?

Ova stranica koristi Akismet kako bi smanjila neželjenu poštu. Saznajte kako se podaci vašeg komentara obrađuju.