Reiknaðu eða leitaðu að mikilli hringfjarlægð milli breiddar- og lengdarpunkta með því að nota Haversine formúluna (PHP, Python, MySQL, MSSQL dæmi)

Haversine Formúla - Mikil hringfjarlægð - PHP, Python, MySQL

Í þessum mánuði hef ég verið að forrita töluvert í PHP og MySQL með tilliti til GIS. Snuðaði um netið, ég átti í raun erfitt með að finna eitthvað af Landfræðilegir útreikningar að finna fjarlægðina milli tveggja staða svo ég vildi deila þeim hér.

Flugkort Evrópu með mikla hringvegalengd

Einfalda leiðin til að reikna fjarlægð milli tveggja punkta er að nota Pythagorean formúluna til að reikna lágþrýsting þríhyrningsins (A² + B² = C²). Þetta er þekkt sem Evuklídísk fjarlægð.

Það er áhugaverð byrjun en á ekki við landafræði þar sem fjarlægðin milli breiddar og lengdargráðu er ekki jafnar vegalengdir í sundur. Þegar þú nærð miðbaug ná breiddarlínur lengra í sundur. Ef þú notar einhvers konar einfalda þríhyrningsjöfnu getur það mælt fjarlægð nákvæmlega á einum stað og hræðilega rangt á hinum vegna sveigju jarðar.

Mikil hringvegalengd

Leiðirnar sem farnar eru langar leiðir um jörðina eru þekktar sem Mikil hringvegalengd. Það er... stysta fjarlægðin milli tveggja punkta á kúlu er önnur en punktanna á flatu korti. Sameinaðu því við þá staðreynd að breiddar- og lengdarlínur eru ekki í jafnfjarlægð... og þú hefur erfiðan útreikning.

Hér er frábær myndbandsskýring á því hvernig Great Circles virka.

Haversine formúlan

Fjarlægðin með sveigju jarðar er felld inn í Haversine formúla, sem notar þríhyrningsfræði til að gera kleift að sveigja jörðina. Þegar þú ert að finna fjarlægðina milli tveggja staða á jörðinni (eins og krákan flýgur) er bein lína í raun bogi.

Þetta á við í flugi - hefur þú einhvern tíma skoðað raunverulegt flugkort og tekið eftir því að þau eru bogin? Það er vegna þess að það er styttra að fljúga í boga milli tveggja punkta en beint á staðinn.

PHP: Reiknaðu fjarlægð milli 2 punkta breiddar- og lengdargráðu

Hér er PHP formúlan til að reikna út fjarlægðina milli tveggja punkta (ásamt Mile vs Kilometer umreikningi) námunduð að tveimur aukastöfum.

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

Breyturnar eru:

  • $Latitude1 – breyta fyrir breiddargráðu fyrstu staðsetningu þinnar.
  • $ Lengdargráða1 – breyta fyrir lengdargráðu fyrstu staðsetningu þinnar
  • $Latitude2 – breyta fyrir breiddargráðu seinni staðsetningar þinnar.
  • $ Lengdargráða2 – breyta fyrir lengdargráðu annars staðarins.
  • $eining – sjálfgefna veran kílómetra. Þetta er hægt að uppfæra eða senda sem kílómetra.

Python: Reiknaðu fjarlægð milli 2 punkta breiddar- og lengdargráðu

Engu að síður, hér er Python formúlan til að reikna út fjarlægðina milli tveggja punkta (ásamt Mile vs Kilometer umreikningi) námunduð að tveimur aukastöfum. Ég þakka syni mínum, Bill Karr, sem er gagnafræðingur fyrir OpenINSIGHTS, fyrir kóðann.

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)

Breyturnar eru:

  • breiddargráðu 1 – breyta fyrir fyrstu staðsetningu þína breiddargráða.
  • lengdargráðu 1 – breyta fyrir fyrstu staðsetningu þína lengdargráðu
  • breiddargráðu 2 – breyta fyrir seinni staðsetningu þína breiddargráða.
  • lengdargráðu 2 – breyta fyrir seinni staðsetningu þína lengdargráðu.
  • eining – sjálfgefna veran kílómetra. Þetta er hægt að uppfæra eða senda sem kílómetra.

MySQL: Að sækja allar skrár innan marka með því að reikna fjarlægð í mílum með breiddar- og lengdargráðu

Það er líka hægt að nota SQL til að gera útreikninga til að finna allar skrár innan ákveðinnar fjarlægðar. Í þessu dæmi ætla ég að spyrja MyTable í MySQL til að finna allar skrár sem eru minna en eða jafnar breytilegu $ fjarlægð (í Miles) til staðsetningar minnar á $ breiddargráðu og $ lengdargráðu:

Fyrirspurnin um að sækja allar skrár innan ákveðins fjarlægð með því að reikna fjarlægð í mílum milli tveggja breiddar- og lengdarpunkta eru:

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

Þú verður að aðlaga þetta:

  • $ lengdargráða - þetta er PHP breyta þar sem ég er að fara framhjá lengdargráðu punktsins.
  • $ breiddargráða - þetta er PHP breyta þar sem ég er að fara framhjá lengdargráðu punktsins.
  • $ fjarlægð - þetta er fjarlægðin sem þú vilt finna allar skrárnar minni eða jafnar.
  • borð - þetta er borðið ... þú vilt skipta um það fyrir heiti borðs þíns.
  • breiddargráða - þetta er svið breiddargráðu þinnar.
  • lengdargráðu - þetta er svið lengdargráðu þinnar.

MySQL: Að sækja allar skrár innan bils með því að reikna fjarlægð í kílómetrum með breiddar- og lengdargráðu

Og hér er SQL fyrirspurnin sem notar kílómetra í 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."

Þú verður að aðlaga þetta:

  • $ lengdargráða - þetta er PHP breyta þar sem ég er að fara framhjá lengdargráðu punktsins.
  • $ breiddargráða - þetta er PHP breyta þar sem ég er að fara framhjá lengdargráðu punktsins.
  • $ fjarlægð - þetta er fjarlægðin sem þú vilt finna allar skrárnar minni eða jafnar.
  • borð - þetta er borðið ... þú vilt skipta um það fyrir heiti borðs þíns.
  • breiddargráða - þetta er svið breiddargráðu þinnar.
  • lengdargráðu - þetta er svið lengdargráðu þinnar.

Ég notaði þennan kóða í kortagerðarfyrirtæki fyrirtækisins sem við notuðum fyrir smásöluverslun með yfir 1,000 stöðum víðsvegar um Norður-Ameríku og það virkaði fallega.

Microsoft SQL Server Landfræðileg fjarlægð: STDistance

Ef þú ert að nota Microsoft SQL Server bjóða þeir upp á sína eigin virkni, STFjarlægð til að reikna út fjarlægð milli tveggja punkta með því að nota landafræðigagnagerðina.

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

Hattábending til Manash Sahoo, forstjóra og arkitekts Highbridge.

77 Comments

  1. 1

    Þakka þér kærlega fyrir að deila. Þetta var auðvelt afrita og líma verk og virkar frábærlega. Þú hefur sparað mér mikinn tíma.
    FYI fyrir alla sem flytja til C:
    tvöfaldur deg2rad(tvöfaldur stig) { return deg*(3.14159265358979323846/180.0); }

  2. 2

    Mjög gott innlegg - virkaði mjög vel - ég þurfti aðeins að breyta nafninu á borðinu sem geymir lat-long. Það virkar frekar hratt að .. Ég er með frekar lítið af lat-longs (< 400) en ég held að þetta myndi skalast ágætlega. Fín síða líka - ég er nýbúinn að bæta henni við del.icio.us reikninginn minn og mun athuga reglulega.

  3. 4
  4. 5

    Ég leitaði allan daginn að fjarlægðarútreikningum og fann harversine reikniritið, þökk sé þér fyrir að gefa dæmið um hvernig á að setja það í sql yfirlýsingu. Takk og kveðja, Daníel

  5. 8

    Ég held að SQL þinn þurfi að hafa yfirlýsingu.
    í staðinn fyrir WHERE fjarlægð <= $fjarlægð sem þú gætir þurft
    notaðu HAVING distance <= $distance

    annars takk fyrir að spara mér tíma og orku.

  6. 10
  7. 11
  8. 12

    Takk kærlega fyrir að deila þessum kóða. Það sparaði mér mikinn þróunartíma. Einnig þakka lesendum þínum fyrir að benda á að HAVING yfirlýsing er nauðsynleg fyrir MySQL 5.x. Mjög hjálplegt.

  9. 14
  10. 15

    Halló,

    Önnur spurning. Er til formúla fyrir NMEA strengi eins og þann hér að neðan?

    1342.7500,N,10052.2287,E

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

    Takk,
    Harry

  11. 16

    Ég fann líka að WHERE virkaði ekki fyrir mig. Breytti því í HAVING og allt virkar fullkomið. Í fyrstu las ég ekki athugasemdirnar og endurskrifaði þær með því að nota hreiðrað val. Hvort tveggja mun virka bara vel.

  12. 17
  13. 18

    Ótrúlega hjálplegt, takk kærlega! Ég var í smá vandræðum með nýja "HAVING", frekar en "HVAR", en þegar ég las athugasemdirnar hér (eftir um það bil hálftíma að gnísta tennur af gremju =P), þá fékk ég það að virka vel. Þakka þér ^_^

  14. 19
  15. 20

    Hafðu í huga að valin fullyrðing eins og þessi verður mjög reikningslega mikil og því hæg. Ef þú ert með mikið af þessum fyrirspurnum getur það fest hlutina mjög fljótt.

    Miklu minna ákafur nálgun er að keyra fyrsta (grófa) val með því að nota FERÐINGA svæði sem er skilgreint með reiknuðum fjarlægð þ.e. "velja * úr töfluheiti þar sem breiddargráðu milli lat1 og lat2 og lengdargráðu milli lon1 og lon2". lat1 = markbreiddargráðu – latdiff, lat2 = markbreiddargráðu + latdiff, svipað og lon. latdiff ~= vegalengd / 111 (fyrir km), eða vegalengd/69 fyrir mílur þar sem 1 breiddargráðu er ~ 111 km (smá breyting þar sem jörðin er örlítið sporöskjulaga, en nægjanleg í þessu skyni). londiff = vegalengd / (abs(cos(deg2rad(breiddargráðu))*111)) — eða 69 fyrir mílur (þú getur í raun tekið aðeins stærri ferning til að taka tillit til afbrigða). Taktu síðan niðurstöðuna af því og færðu hana inn í geislamyndaðan val. Bara ekki gleyma að gera grein fyrir hnitum utan marka – þ.e. svið ásættanlegrar lengdar er -180 til +180 og svið ásættanlegrar breiddar er -90 til +90 - ef latdiff eða londiff keyrir utan þessa sviðs . Athugaðu að í flestum tilfellum gæti þetta ekki átt við þar sem það hefur aðeins áhrif á útreikninga yfir línu í gegnum Kyrrahafið frá pól til póls, þó það skerist hluta af chukotka og hluta af alaska.

    Það sem við náum með þessu er veruleg fækkun á fjölda punkta sem þú gerir þennan útreikning á. Ef þú ert með milljón alþjóðlega punkta í gagnagrunninum sem er nokkurn veginn jafnt dreift og þú vilt leita innan 100 km, þá er fyrsta (hraða) leit þín á svæði 10000 sq km og mun líklega skila um 20 niðurstöðum (byggt á jafnri dreifingu yfir a yfirborðsflatarmál um 500M sq km), sem þýðir að þú keyrir flókna fjarlægðarútreikninginn 20 sinnum fyrir þessa fyrirspurn í stað milljón sinnum.

    • 21

      Minniháttar mistök í dæminu... það væri innan við 50 km (ekki 100) þar sem við erum að horfa á „radíus“ á... ferningnum okkar.

      • 22

        Frábær ráð! Ég vann í raun með þróunaraðila sem skrifaði fall sem dró innra ferninginn og síðan endurkvæma fall sem gerði 'ferninga' í kringum jaðarinn til að innihalda og útiloka punktana sem eftir eru. Niðurstaðan var ótrúlega hröð niðurstaða - hann gat metið milljónir stiga á míkrósekúndum.

        Nálgun mín hér að ofan er örugglega „gróf“ en fær. Takk aftur!

        • 23

          Doug,

          Ég hef verið að reyna að nota mysql og php til að meta hvort lat long point sé innan marghyrnings. Veistu hvort þróunarvinur þinn hafi birt einhver dæmi um hvernig eigi að framkvæma þetta verkefni. Eða þekkir þú einhver góð dæmi. Með fyrirfram þökk.

  16. 24

    Hæ allir, þetta er SQL prófunarsetningin mín:

    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 er að segja mér að fjarlægð sé ekki til sem dálkur, ég get notað röð eftir, ég get gert það án WHERE, og það virkar, en ekki með því...

  17. 26

    Þetta er frábært, en það er alveg eins og fuglarnir fljúga. Það væri frábært að reyna að fella google maps API inn í þetta einhvern veginn (kannski með því að nota vegi o.s.frv.) Bara til að gefa hugmynd með því að nota annað form flutninga. Ég á enn eftir að búa til herma glæðingaraðgerð í PHP sem myndi geta boðið upp á skilvirka lausn á vandamálinu fyrir farandsölumenn. En ég held að ég gæti endurnýtt eitthvað af kóðanum þínum til að gera það.

  18. 27
  19. 28

    Góð grein! Ég fann fullt af greinum sem lýsa því hvernig á að reikna fjarlægð milli tveggja punkta en ég var virkilega að leita að SQL bútinum.

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

    2 daga rannsókn til að finna loksins þessa síðu sem leysir vandamálið mitt. Það lítur út fyrir að ég ætti að slíta WolframAlpha-inn minn og endurskoða stærðfræðina. Breytingin úr WHERE í HAVING hefur handritið mitt í lagi. ÞAKKA ÞÉR FYRIR

  25. 37
    • 38

      Takk Georgi. Ég hélt áfram að fá dálk 'fjarlægð' fannst ekki. Þegar ég breytti WHERE yfir í HAVING virkaði það eins og töfrandi!

  26. 39

    Ég vildi að þetta væri fyrsta síðan sem ég fann á þessu. Eftir að hafa prófað margar mismunandi skipanir var þetta sú eina sem virkaði rétt og með lágmarksbreytingum sem þarf til að passa við minn eigin gagnagrunn.
    Takk a einhver fjöldi!

  27. 40

    Ég vildi að þetta væri fyrsta síðan sem ég fann á þessu. Eftir að hafa prófað margar mismunandi skipanir var þetta sú eina sem virkaði rétt og með lágmarksbreytingum sem þarf til að passa við minn eigin gagnagrunn.
    Takk a einhver fjöldi!

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

    Ég veit að þessi formúla virkar, en ég get ekki séð hvar radíus jarðar er tekinn með í reikninginn. Getur einhver frætt mig, vinsamlegast?

  34. 49
  35. 50
  36. 52

    Þakka þér Douglas, SQL fyrirspurnin er nákvæmlega það sem ég þurfti og ég hélt að ég yrði að skrifa hana sjálfur. Þú hefur bjargað mér frá hugsanlega klukkustundum af breiddarlengdarnámsferil!

  37. 53
  38. 55
  39. 56

    Douglas, takk fyrir þennan ótrúlega kóða. Ég hef verið að klikka á því hvernig á að gera þetta á GPS samfélagsgáttinni minni. Þú hefur sparað mér klukkustundir.

  40. 58

    takk fyrir að birta þessa gagnlegu grein,  
    en af ​​einhverjum ástæðum langar mig að spyrja
    hvernig á að fá fjarlægðina milli coords inni í mysql db og coords sett inn í php af notanda?
    til að lýsa betur:
    1.notandi verður að setja inn [id] til að velja tilgreind gögn úr db og hnitum notandans sjálfs
    2. php skráin fáðu markgögnin (hnitin) með því að nota [id] og reiknaðu síðan fjarlægðina milli notanda og markpunkts

    eða geturðu einfaldlega fengið fjarlægð frá kóðanum hér að neðan?

    $qry = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“. $breiddargráða.“*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$lengdargráða.“- `Lengdargráða`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) sem fjarlægð FRÁ `MyTable` WHERE distance >= “.$distance.” >>>>get ég "tekið út" fjarlægðina héðan?
    takk aftur,
    Timmy S

  41. 60

    allt í lagi, allt sem ég hef reynt virkar ekki. Ég meina, það sem ég hef virkar, en vegalengdirnar eru langt undan.

    Gæti einhver hugsanlega séð hvað er rangt við þennan kóða?

    if(isset($_POST['sent inn'])){ $z = $_POST['póstnúmer']; $r = $_POST['radíus']; echo „Niðurstöður fyrir „.$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 FRÁ mrk m, zip z1, zip z2 HVAR 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 ") ) eða deyja (mysql_error()); while($row = mysql_fetch_array($sql)) { $store1 = $row['MktName'].""; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].”, “.$row['LocAddState'].” “.$row['póstnúmer']; $latitude1 = $röð['lat']; $lengdargráða1 = $röð['lon']; $breiddargráðu2 = $röð['y1']; $lengdargráða2 = $röð['x1']; $city = $row['city']; $ríki = $röð['ríki']; $dis = getnew($breiddargráða1, $lengdargráða1, $breiddargráða2, $lengdargráða2, $eining = 'Mi'); // $dis = fjarlægð($lat1, $lon1, $lat2, $lon2); $verified = $row['staðfest']; if($verified == '1'){ echo “”; echo "".$store.""; echo $dis . " langt í burtu"; bergmál ""; } else { echo “”.$store.””; echo $dis . " langt í burtu"; bergmál ""; } }}

    functions.php kóðann minn
    fall getnew($breiddargráða1, $lengdargráða1, $lengdargráða2, $lengdargráða2, $unit = 'Mi') { $theta = $lengdargráða1 – $lengdargráða2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $fjarlægð = acos($fjarlægð); $fjarlægð = rad2deg($fjarlægð); $fjarlægð = $fjarlægð * 60 * 1.1515; switch($unit) { case 'Mi': brot; tilfelli 'Km' : $fjarlægð = $fjarlægð * 1.609344; } return (round($fjarlægð,2)); }

    Með fyrirfram þökk

  42. 61
  43. 62

    Hey Douglas, frábær grein. Mér fannst útskýringin þín á landfræðilegu hugtökum og kóðanum mjög áhugaverð. Eina tillagan mín væri að pláss og draga inn kóðann til að sýna (eins og Stackoverflow, til dæmis). Mér skilst að þú viljir spara pláss, en hefðbundið kóðabil/inndráttur myndi gera það miklu auðveldara fyrir mig, sem forritara, að lesa og kryfja. Allavega, það er lítið mál. Haltu áfram frábæru starfi.

  44. 64
  45. 65

    hér á meðan við notum með aðgerð erum við að fá eina tegund af fjarlægð .. meðan við notum fyrirspurn þess að koma önnur tegund af fjarlægð

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

    það virðist fljótlegra (mysql 5.9) að nota tvöfalda formúluna í valinu og hvar:
    $formula = “(((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“.$latitude. ”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$lengdargráða.“- `Lengdargráða`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)“;
    $sql = 'SELECT *, '.$formula.' sem fjarlægð FRÁ töflu WHERE '..$formula.' <= '.$fjarlægð;

  51. 71
  52. 72

    Takk kærlega fyrir að klippa þessa grein. hún er mjög gagnleg.
    PHP var fyrst búið til sem einfaldur forskriftarvettvangur sem heitir „Persónuleg heimasíða“. Nú á dögum er PHP (stutt fyrir Hypertext Preprocessor) valkostur við Active Server Pages (ASP) tækni Microsoft.

    PHP er opinn uppspretta netþjónahlið tungumál sem er notað til að búa til kraftmiklar vefsíður. Það er hægt að fella það inn í HTML. PHP er venjulega notað í tengslum við MySQL gagnagrunn á Linux/UNIX vefþjónum. Það er líklega vinsælasta forskriftarmálið.

  53. 73

    Ég fann að ofangreind lausn virkaði ekki rétt.
    Ég þarf að breyta í:

    $qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $breiddargráðu . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((“ . $lengdargráða . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) sem fjarlægð FRÁ `register` “;

  54. 75
  55. 76

    Halló, vinsamlegast ég mun virkilega þurfa hjálp þína við þetta.

    Ég lagði fram beiðni á vefþjóninum mínum http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $breiddargráða
    -2.23389 = $lengdargráða
    og 20 = fjarlægðin sem ég vil sækja

    Hins vegar með því að nota formúluna þína, þá sækir það allar línur í dbinu mínu

    $results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”*pi()/180)) * sin((lat*pi()/180 ))+cos((“.$breiddargráðu.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$lengdargráðu.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) sem fjarlægð FRÁ merkjum HAVINGAR fjarlægð >= “.$fjarlægð ));

    [{“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 Mountain Escuela View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza”,”address”:”4546 El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”fjarlægð”:16077.937560795},{“ id”:7,”name”:”Bararnir og grillin”,,”address”:”24 Whiteley Street, Manchester”,,”lat”:53.485118865967,”lng”:-2.1828699111938,”fjarlægð”:8038.7620112314}]

    Ég vil sækja bara raðir með 20 mílur en það færir allar raðir. Vinsamlegast hvað er ég að gera rangt

  56. 77

    Ég er að leita að svipaðri fyrirspurn en jók aðeins – í stuttu máli er þetta að flokka öll hnit innan 2 mílna frá hverju hniti og telja síðan hversu mörg hnit í hverjum hópi og gefa aðeins út einn hóp sem hefur flest hnit – jafnvel þótt þú ert með fleiri en einn hóp meðal hópa sem eru með flest hnit – sendu einfaldlega út slembihópinn úr hópunum með sömu stærstu töluna –

Hvað finnst þér?

Þessi síða notar Akismet til að draga úr ruslpósti. Lærðu hvernig ummæli þín eru unnin.