Llogaritni ose kërkoni distancën e rrethit të madh midis pikave të gjerësisë dhe gjatësisë duke përdorur formulën Haversine (shembuj PHP, Python, MySQL, MSSQL)

Formula Haversine - Distanca e Rrethit të Madh - PHP, Python, MySQL

Këtë muaj kam programuar mjaft në PHP dhe MySQL në lidhje me GIS. Duke përgjuar rrjetën, në të vërtetë e kisha të vështirë të gjeja disa nga ato Llogaritjet gjeografike për të gjetur distancën midis dy vendndodhjeve, kështu që doja t'i ndaja këtu.

Harta e fluturimit Evropa me një distancë të madhe rrethi

Mënyra e thjeshtë për të llogaritur një distancë midis dy pikave është përdorimi i formulës Pitagoriane për të llogaritur hipotenuzën e një trekëndëshi (A² + B² = C²). Kjo është e njohur si Distanca euklidiane.

Ky është një fillim interesant, por nuk zbatohet me Gjeografinë, pasi distanca midis linjave të gjerësisë dhe gjatësisë është distanca jo të barabarta veç Ndërsa i afroheni ekuatorit, linjat e gjerësisë gjeografike bëhen më larg. Nëse përdorni një lloj ekuacioni të thjeshtë trekëndëshi, ai mund të masë distancën me saktësi në një vend dhe tmerrësisht të gabuar në tjetrin, për shkak të lakimit të Tokës.

Distanca e Madhe e Rrethit

Rrugët që janë përshkuar në distanca të gjata rreth Tokës njihen si Distanca e Madhe e Rrethit. Kjo është… distanca më e shkurtër midis dy pikave në një sferë është e ndryshme nga pikat në një hartë të sheshtë. Kombinoje këtë me faktin se linjat e gjerësisë dhe gjatësisë nuk janë të barabarta… dhe ke një llogaritje të vështirë.

Këtu keni një shpjegim fantastik video se si funksionojnë Rrethet e Mëdha.

Formula Haversine

Distanca duke përdorur lakimin e Tokës është e përfshirë në Formula e Haversine, e cila përdor trigonometrinë për të lejuar lakimin e tokës. Kur po gjeni distancën midis 2 vendeve në tokë (ndërsa fluturon sorra), një vijë e drejtë është me të vërtetë një hark.

Kjo është e zbatueshme në fluturimet ajrore - a keni shikuar ndonjëherë në hartën aktuale të fluturimeve dhe keni vërejtur se ato janë të harkuara? Kjo sepse është më e shkurtër të fluturosh në një hark midis dy pikave sesa direkt në vendndodhje.

PHP: Llogaritni distancën midis 2 pikave të gjatësisë dhe gjatësisë

Këtu është formula PHP për llogaritjen e distancës midis dy pikave (së bashku me konvertimin Mile vs. Kilometer) të rrumbullakosura në dy shifra dhjetore.

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

Variablat janë:

  • $Gjerësi gjeografike1 – një variabël për gjerësinë gjeografike të vendndodhjes suaj të parë.
  • $Gjitësia gjeografike1 – një variabël për gjatësinë gjeografike të vendndodhjes suaj të parë
  • $Gjerësi gjeografike2 – një variabël për gjerësinë gjeografike të vendndodhjes suaj të dytë.
  • $Gjitësia gjeografike2 – një variabël për gjatësinë gjeografike të vendndodhjes suaj të dytë.
  • $njësi – qenia e paracaktuar milje. Kjo mund të përditësohet ose kalohet si kilometra.

Python: Llogarit distancën ndërmjet 2 pikave të gjerësisë dhe gjatësisë

Gjithsesi, këtu është formula e Python për llogaritjen e distancës midis dy pikave (së bashku me konvertimin Mile vs. Kilometer) të rrumbullakosura në dy shifra dhjetore. Kredi për djalin tim, Bill Karr, i cili është një shkencëtar i të dhënave OpenINSIGHTS, për kodin.

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)

Variablat janë:

  • gjerësia1 – një variabël për vendndodhjen tuaj të parë gjerësi.
  • gjatësia gjeografike 1 – një variabël për vendndodhjen tuaj të parë gjatësi
  • gjerësia2 – një variabël për vendndodhjen tuaj të dytë gjerësi.
  • gjatësia gjeografike 2 – një variabël për vendndodhjen tuaj të dytë gjatësi.
  • njësi – qenia e paracaktuar milje. Kjo mund të përditësohet ose kalohet si kilometra.

MySQL: Marrja e të gjitha regjistrimeve brenda një diapazoni duke llogaritur distancën në milje duke përdorur gjerësinë dhe gjatësinë gjeografike

Alsoshtë gjithashtu e mundur të përdorni SQL për të bërë një llogaritje për të gjetur të gjitha rekordet brenda një distance të caktuar. Në këtë shembull, unë jam duke shkuar për të kërkuar MyTable në MySQL për të gjetur të gjitha rekordet që janë më pak ose të barabartë me ndryshueshme $ distancë (në Miles) në vendndodhjen time në $ gjerësi dhe $ gjatësi:

Kërkesa për marrjen e të gjitha rekordeve brenda një specifik distancë duke llogaritur distancën në milje midis dy pikave të gjerësisë dhe gjatësisë janë:

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

Do të duhet ta personalizoni këtë:

  • gjatësi $ - kjo është një variabël PHP ku po kaloj gjatësinë e pikës.
  • gjerësia $ - kjo është një variabël PHP ku po kaloj gjatësinë e pikës.
  • distanca $ - kjo është distanca që dëshironi të gjeni të gjitha rekordet më pak ose të barabarta.
  • tryezë - kjo është tabela ... ju do të dëshironi ta zëvendësoni atë me emrin tuaj të tabelës.
  • gjerësi - kjo është fusha e gjerësisë suaj gjeografike.
  • gjatësi - kjo është fusha e gjatësisë suaj.

MySQL: Marrja e të gjitha regjistrimeve brenda një intervali duke llogaritur distancën në kilometra duke përdorur gjerësinë dhe gjatësinë gjeografike

Dhe këtu është pyetja SQL duke përdorur kilometra në 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."

Do të duhet ta personalizoni këtë:

  • gjatësi $ - kjo është një variabël PHP ku po kaloj gjatësinë e pikës.
  • gjerësia $ - kjo është një variabël PHP ku po kaloj gjatësinë e pikës.
  • distanca $ - kjo është distanca që dëshironi të gjeni të gjitha rekordet më pak ose të barabarta.
  • tryezë - kjo është tabela ... ju do të dëshironi ta zëvendësoni atë me emrin tuaj të tabelës.
  • gjerësi - kjo është fusha e gjerësisë suaj gjeografike.
  • gjatësi - kjo është fusha e gjatësisë suaj.

Unë e shfrytëzova këtë kod në një platformë të hartëzimit të ndërmarrjeve që e shfrytëzuam për një dyqan me pakicë me mbi 1,000 vende në të gjithë Amerikën e Veriut dhe funksionoi bukur.

Distanca gjeografike e Microsoft SQL Server: STDistance

Nëse jeni duke përdorur Microsoft SQL Server, ata ofrojnë funksionin e tyre, Distanca ST për llogaritjen e distancës ndërmjet dy pikave duke përdorur llojin e të dhënave Gjeografia.

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

Këshillë për kapelën Manash Sahoo, VP dhe Arkitekt i Highbridge.

77 Comments

  1. 1

    Faleminderit shumë për ndarjen. Kjo ishte një punë e lehtë për të kopjuar dhe ngjitur dhe funksionon shkëlqyeshëm. Më ke kursyer shumë kohë.
    FYI për këdo që transferon në C:
    double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }

  2. 2

    Një pjesë shumë e bukur e postimit - funksionoi shumë mirë - m'u desh të ndryshoja vetëm emrin e tavolinës që mbante lat-long. Ajo funksionon shumë shpejt për të.. Unë kam një numër mjaft të vogël të lat-longs (< 400) por mendoj se kjo do të shkallëzohej mirë. Faqe e bukur gjithashtu – sapo e shtova në llogarinë time del.icio.us dhe do ta kontrolloj përsëri rregullisht.

  3. 4
  4. 5

    Kërkova gjatë gjithë ditës për llogaritjet e distancës dhe gjeta algoritmin harversine, faleminderit që dhatë shembullin se si ta vendosni atë në një deklaratë sql. Faleminderit dhe përshëndes, Daniel

  5. 8

    Unë mendoj se SQL-ja juaj ka nevojë për një deklaratë që ka.
    në vend të WHERE distance <= $distance mund t'ju duhet
    përdorni HAVING distance <= $distance

    përndryshe faleminderit që më kurseve shumë kohë dhe energji.

  6. 10
  7. 11
  8. 12

    Faleminderit shumë për ndarjen e këtij kodi. Më kurseu shumë kohë zhvillimi. Gjithashtu, faleminderit lexuesve tuaj që theksuan se një deklaratë HAVING është e nevojshme për MySQL 5.x. Shume e dobishme.

  9. 14
  10. 15

    Përshëndetje,

    Një pyetje tjetër. A ka një formulë për vargjet NMEA si kjo më poshtë?

    1342.7500,N,10052.2287,E

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

    Thanks,
    Harry

  11. 16

    Gjithashtu zbulova se WHERE nuk funksionoi për mua. Ndryshuar atë në HAVING dhe gjithçka funksionon në mënyrë perfekte. Në fillim nuk i lexova komentet dhe i rishkrova duke përdorur një përzgjedhje të ndërthurur. Të dyja do të funksionojnë mirë.

  12. 17
  13. 18

    Tepër e dobishme, faleminderit shumë! Unë kisha disa probleme me "HAVING"-in e ri, në vend të "WHERE", por sapo lexova komentet këtu (pas rreth gjysmë ore kërcitje dhëmbësh nga frustrimi =P), e kuptova që funksiononte mirë. Faleminderit ^_^

  14. 19
  15. 20

    Mbani në mend se një deklaratë e zgjedhur si kjo do të jetë shumë intensive nga ana llogaritëse dhe për këtë arsye e ngadaltë. Nëse keni shumë nga ato pyetje, mund t'i bllokojë gjërat mjaft shpejt.

    Një qasje shumë më pak intensive është të ekzekutoni një përzgjedhje të parë (të papërpunuar) duke përdorur një zonë SQUARE të përcaktuar nga një distancë e llogaritur p.sh. "zgjidhni * nga emri i tabelës ku gjerësia midis lat1 dhe lat2 dhe gjatësia gjeografike midis lon1 dhe lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, e ngjashme me lon. latdiff ~= distanca / 111 (për km), ose distanca/69 për milje pasi 1 shkallë e gjerësisë gjeografike është ~ 111 km (ndryshim i lehtë pasi toka është pak ovale, por e mjaftueshme për këtë qëllim). londiff = distanca / (abs(cos(deg2rad(gjerësi gjeografike))*111)) - ose 69 për milje (mund të merrni një katror pak më të madh për të llogaritur variacionet). Pastaj merrni rezultatin dhe futeni në përzgjedhjen radiale. Thjesht mos harroni të merrni parasysh koordinatat jashtë kufijve - p.sh. diapazoni i gjatësisë së pranueshme është -180 deri +180 dhe diapazoni i gjerësisë gjeografike të pranueshme është -90 deri +90 - në rast se latdiff ose londiff juaj shkon jashtë këtij diapazoni . Vini re se në shumicën e rasteve kjo mund të mos jetë e zbatueshme pasi ndikon vetëm në llogaritjet mbi një vijë përmes oqeanit paqësor nga pol në pol, megjithëse kryqëzon një pjesë të chukotka-s dhe një pjesë të Alaskës.

    Ajo që ne arrijmë me këtë është një reduktim i ndjeshëm i numrit të pikëve kundrejt të cilave ju bëni këtë llogaritje. Nëse keni një milion pikë globale në bazën e të dhënave të shpërndara afërsisht në mënyrë të barabartë dhe dëshironi të kërkoni brenda 100 km, atëherë kërkimi juaj i parë (i shpejtë) është i një sipërfaqeje prej 10000 km katrore dhe ndoshta do të japë rreth 20 rezultate (bazuar në shpërndarjen e barabartë mbi një sipërfaqja prej rreth 500 milion km katrore), që do të thotë se ju e kryeni llogaritjen komplekse të distancës 20 herë për këtë pyetje në vend të një milion herë.

    • 21
      • 22

        Këshillë fantastike! Unë në fakt punova me një zhvillues i cili shkroi një funksion që tërhiqte katrorin e brendshëm dhe më pas një funksion rekurziv që bënte 'katrore' rreth perimetrit për të përfshirë dhe përjashtuar pikat e mbetura. Rezultati ishte një rezultat tepër i shpejtë - ai mund të vlerësonte miliona pikë në mikrosekonda.

        Qasja ime e mësipërme është padyshim 'e papërpunuar' por e aftë. Faleminderit perseri!

        • 23

          Doug,

          Unë jam përpjekur të përdor mysql dhe php për të vlerësuar nëse një pikë e gjatë lat është brenda një poligoni. A e dini nëse miku juaj zhvillues ka publikuar ndonjë shembull se si ta kryeni këtë detyrë? Apo dini ndonjë shembull të mirë. Faleminderit paraprakisht.

  16. 24

    Përshëndetje të gjithëve, kjo është deklarata ime e testit 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

    dhe Mysql po më thotë se distanca, nuk ekziston si kolonë, mund ta përdor porosinë sipas, mund ta bëj pa WHERE, dhe funksionon, por jo me të…

  17. 26

    Kjo është e mrekullueshme, megjithatë është ashtu siç fluturojnë zogjtë. Do të ishte mirë të provoni dhe të përfshini API-në e hartave të Google në këtë disi (ndoshta duke përdorur rrugë etj.) Thjesht për të dhënë një ide duke përdorur një formë tjetër transporti. Ende nuk kam bërë një funksion të simuluar të pjekjes në PHP që do të ishte në gjendje të ofronte një zgjidhje efikase për problemin e shitësit udhëtues. Por unë mendoj se mund të jem në gjendje të ripërdor disa nga kodet tuaja për ta bërë këtë.

  18. 27
  19. 28

    artikull i mirë! Gjeta shumë artikuj që përshkruanin se si të llogarisja distancën midis dy pikave, por me të vërtetë po kërkoja për fragmentin SQL.

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

    2 ditë kërkime për të gjetur më në fund këtë faqe që zgjidh problemin tim. Me sa duket, më mirë të heq WolframAlpha-n time dhe të studioj matematikën time. Ndryshimi nga WHERE në HAVING e ka skenarin tim në gjendje pune. FALEMINDERIT

  25. 37
  26. 39

    Do të doja që kjo të ishte faqja e parë që do të gjeja në këtë. Pasi provova shumë komanda të ndryshme, kjo ishte e vetmja që funksionoi siç duhet, dhe me ndryshime minimale të nevojshme për të përshtatur bazën time të të dhënave.
    Thanks a lot!

  27. 40

    Do të doja që kjo të ishte faqja e parë që do të gjeja në këtë. Pasi provova shumë komanda të ndryshme, kjo ishte e vetmja që funksionoi siç duhet, dhe me ndryshime minimale të nevojshme për të përshtatur bazën time të të dhënave.
    Thanks a lot!

  28. 41
  29. 42
  30. 43
  31. 45
  32. 46
  33. 47
  34. 49
  35. 50
  36. 52

    Faleminderit Douglas, pyetja SQL është pikërisht ajo që më duhej dhe mendova se do të më duhej ta shkruaja vetë. Më keni shpëtuar nga orët e gjata të kurbës së të mësuarit të gjatësisë gjeografike!

  37. 53
  38. 55
  39. 56
  40. 58

    faleminderit për postimin e këtij artikulli të dobishëm,  
    por për disa arsye do të doja të pyesja
    si të marrim distancën midis kordave brenda mysql db dhe kordave të futura në php nga përdoruesi?
    për të përshkruar më qartë:
    1.përdoruesi duhet të fusë [id] për zgjedhjen e të dhënave të specifikuara nga db dhe koordinatat e vetë përdoruesit
    2. skedari php merr të dhënat e synuara (koordinat) duke përdorur [id] dhe më pas llogarit distancën midis përdoruesit dhe pikës së synuar

    apo thjesht mund të marrësh distancë nga kodi më poshtë?

    $qry = “SELECT *,(((acos(sin((“.$gjerësi.”*pi()/180)) * sin((`Gjerësia`*pi()/180))+cos((“. $gjerësi."*pi()/180)) * cos((`Gjerësi gjeografike`*pi()/180)) * cos(((".$gjatësi."- `Gjatesia gjeografike`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) si distancë NGA `Tabela ime` WHERE distanca >= ".$distance." >>>>mund ta "heq" distancën nga këtu?
    faleminderit perseri,
    Timmy S

  41. 60

    ok, gjithçka që kam provuar nuk funksionon. Domethënë, ajo që kam funksionon, por distancat janë shumë larg.

    A mundet dikush të shohë se çfarë nuk shkon me këtë kod?

    if(isset($_POST['dorëzuar'])){ $z = $_POST['kodi postar']; $r = $_POST['rrezja']; jehonë “Rezultatet për “.$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. qytet,z1.state NGA mrk m, zip z1, zip z2 WHERE m.zipcode = z1.zipcode DHE 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 ") ose die <= (mysql_error()); while($row = mysql_fetch_array($sql)) {$store1 = $row['MktName'].""; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." “.$row['zipcode']; $gjerësi1 = $rresht['lat']; $longitude1 = $rresht['lon']; $gjerësi2 = $rresht['y1']; $gjatësi2 = $rresht['x1']; $qytet = $rresht['qytet']; $state = $rresht['gjendja']; $dis = getnew($gjerësi1, $gjerësi1, $gjerësi2, $gjerësi2, $njësi = 'Mi'); // $dis = distanca ($lat1, $lon1, $lat2, $lon2); $verifikuar = $rresht['verifikuar']; if($verified == '1'){ jehonë ""; echo “”.$store.””; jehonë $dis . " milje larg"; jehonë ""; } else { echo “”.$store.””; jehonë $dis . " milje larg"; jehonë ""; } }}

    funksionet e mia.kodi php
    funksioni getnew($gjerësi1, $gjerësi1, $gjerësi2, $gjatësi2, $njësi = 'Mi') { $theta = $gjatësi1 – $gjatësi2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $distance = acos($distance); $distanca = rad2deg($distanca); $distance = $distance * 60 * 1.1515; switch($unit) { case 'Mi': break; rasti 'Km' : $distance = $distance * 1.609344; } return (round($distance,2)); }

    Thank you in advance

  42. 61
  43. 62

    Hej Douglas, artikull i mrekullueshëm. Më dukej shumë interesant shpjegimi juaj për konceptet gjeografike dhe kodin. Sugjerimi im i vetëm do të ishte vendosja e hapësirës dhe futja e kodit për shfaqje (si Stackoverflow, për shembull). Unë e kuptoj që ju dëshironi të ruani hapësirën, por ndarja/dhënia e kodit konvencionale do ta bënte shumë më të lehtë për mua, si programues, leximin dhe zbërthimin. Gjithsesi, kjo është një gjë e vogël. Vazhdoni punën e madhe.

  44. 64
  45. 65
  46. 66
  47. 67
  48. 68
  49. 69
  50. 70

    duket më e shpejtë (mysql 5.9) të përdorësh dy herë formulën në përzgjedhje dhe ku:
    $formula = "(((acos(sin((".$gjerësi."*pi()/180)) * sin((`Gjerësi gjeografike"*pi()/180))+cos((".$gjerësi. "*pi()/180)) * cos((`Gjerësia gjeografike`*pi()/180)) * cos(((".$gjatësi."- `Gjatesia gjeografike`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
    $sql = 'SELECT *, '.$formula.' si distanca NGA tabela WHERE '..$formula.' <= '.$distance;

  51. 71
  52. 72

    Faleminderit shumë për prerjen e këtij artikulli, është shumë i dobishëm.
    PHP fillimisht u krijua si një platformë e thjeshtë skriptimi e quajtur "Personal Home Page". Në ditët e sotme PHP (shkurtorja për Hypertext Preprocessor) është një alternativë e teknologjisë së Microsoft Active Server Pages (ASP).

    PHP është një gjuhë me burim të hapur nga ana e serverit e cila përdoret për krijimin e faqeve dinamike të internetit. Mund të futet në HTML. PHP zakonisht përdoret në lidhje me një bazë të dhënash MySQL në serverët e internetit Linux/UNIX. Është ndoshta gjuha më e njohur e shkrimit.

  53. 73

    Kam gjetur se zgjidhja e mësipërme nuk funksionon siç duhet.
    Më duhet të ndryshoj në:

    $qqq = "SELECT *,(((acos(sin((".$gjerësi."*pi()/180)) * sin((`latt`*pi()/180))+cos((" . $gjerësi . "*pi()/180)) * cos((`latt`*pi()/180)) * cos(((" . $gjatësi . "- `gjatë`)*pi()/180) )))*180/pi())*60*1.1515) si distanca NGA `regjistrim` “;

  54. 75
  55. 76

    Përshëndetje, ju lutem do të më duhet vërtet ndihma juaj për këtë.

    Bëra një kërkesë për të marrë në serverin tim të internetit http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $gjerësi
    -2.23389 = $gjatësi
    dhe 20 = distanca që dua të marr

    Megjithatë, duke përdorur formulën ju, ajo rimerr të gjitha rreshtat në db-në time

    $results = DB::select( DB::raw("SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((lat*pi()/180 ))+cos((".$gjerësi."*pi()/180)) * cos((lat*pi()/180)) * cos(((".$gjatësi."- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) si distanca NGA shënuesit që kanë distancë >= “.$distanca ));

    [{“id”:1,”emri”:”Frankie Johnnie & Luigo Too”,”adresa”:”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","adresa":"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 Street, Mountain View, CA”,”lat”:37.393886566162 "lng":-122.07891845703,"distance":16078.381373826},{"id":4,"name":"Picza e tryezës së rrumbullakët: 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 Mountain A619,Escu”: View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Pica e rigonit të djegur me dru”4546”37.401725769043”adresa El Camino Real, Los Altos, CA”,”lat”:122.11464691162,”lng”:-16077.937560795,”distance”:7},{“ id”:24,”emri”:”Bare dhe skarë”,”adresa”:”Rruga Whiteley 53.485118865967, Manchester”,”lat”:2.1828699111938,”lng”:-8038.7620112314,”distanca”:XNUMX]]

    Unë dua të rifitoj vetëm rreshtat me 20 milje, por i sjell të gjitha rreshtat. Ju lutem çfarë po bëj gabim

  56. 77

    Unë jam duke kërkuar për një pyetje të ngjashme, por u rrit pak - me pak fjalë, kjo është për të grupuar të gjitha koordinatat brenda 2 miljeve nga secila koordinatë dhe më pas numëron sa koordinata në secilin grup dhe nxjerr vetëm një grup që ka më shumë koordinata - edhe nëse ju keni më shumë se një grup midis grupeve që kanë numrin më të madh të koordinatave - thjesht nxirrni grupin e rastësishëm nga grupet me të njëjtin numër më të madh -

Çfarë mendoni ju?

Kjo faqe përdor Akismet për të reduktuar spamin. Mësoni se si përpunohet komenti juaj.