Í þ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.
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.
Þ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); }
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.
Takk kærlega Peter og Kerry! Ef þér líkar að vinna að GIS verkefnum mæli ég með:
Þakka þér kærlega fyrir... 😀
É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
Gaman að hjálpa til, vinur!
Nú er ég að leita að 'í marghyrningi' PHP falli sem mun taka fjölda raðaðra breiddar- og lengdargráðuhnita og finna út hvort annar punktur er innan eða utan marghyrningsins.
Ég fann jöfnu til að finna út hvort punktur sé í marghyrningi!
É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.
Halló David,
Ef þú ert að gera einhverja tegund af GROUP BY yfirlýsingu þarftu HAVING. Ég er ekki að gera það í dæminu hér að ofan.
Doug
Frá og með MySQL 5.x geturðu ekki notað samnefni á WHERE ákvæði sjá http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Notaðu HAVING í staðinn fyrir WHERE í ofangreindum fyrirspurnum
Þakka þér kærlega fyrir. Þú hefur unnið frábært starf. Það er það sem ég vil í raun og veru. Kærar þakkir.
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.
Ég er lánsöm að hafa lesendur miklu klárari en ég er!
🙂
Ofangreind formúla sparar mér mikinn tíma. Þakka þér kærlega fyrir.
Ég þarf líka að skipta á milli NMEA sniðsins og gráður. Ég fann formúlu á þessari slóð neðst á síðunni. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Veit einhver hvernig á að sannreyna þetta?
Þakka þér!
Harry
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
É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.
Þakka þér kærlega fyrir handritið skrifað í mysql, þurfti bara að gera smá smá lagfæringar (HAVING) 🙂
Flott starf
Ó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 ^_^
takk mikið virkar frábærlega
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.
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.
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!
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.
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í...
Skiptu út "HVAR fjarlægð" fyrir "HAVING fjarlægð".
Virkar eins og þokki, takk, Douglas!
Þ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ð.
Hæ Douglas,
takk kærlega fyrir þessa grein - þú sparaðir mér bara mikinn tíma.
gæta,
nimrod @Israel
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.
Takk kærlega virkar vel
Þakka þér kærlega fyrir þessa formúlu. Það rakaði einhvern tíma á staðsetningarverkefni í verslun sem var að éta mig.
Takk fyrir búnt. Þessi litla kóðalína sparaði mér töluverðan tíma í verslunarverkefni!
#1054 - Óþekkt dálkur 'fjarlægð' í 'hvar klausu'
samþykkja
Sama hér! Hvað er vandamálið :-/? hvernig á að leysa „fjarlægð“ – dálkavandamálið? Hjálpaðu okkur, takk!! 🙂
Prófaðu að nota HAVING í staðinn fyrir WHERE
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
í stað þess að WHERE ákvæði notar:
HAFA fjarlægð <50
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!
É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!
É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!
Kærar þakkir!
Kærar þakkir!
Ég held að kóðinn sé ekki að birtast lengur. Kannski er það firefox?
Ég prófaði bara bæði í Firefox og Chrome og það er að birtast. Reyndu aftur?
Hæ. Kærar þakkir. Þetta virkar eins og þokki.
Kærar þakkir Douglas. Þetta virkar fullkomlega.
É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?
Tim, til að fá fulla útskýringu á Haversine formúlunni (það er ekki kóði), skoðaðu grein Wikipedia: http://en.wikipedia.org/wiki/Haversine_formula
Falleg! Þetta hefur hjálpað mér gríðarlega!
Frábært stöff Douglas. Hefur þú reynt að fá skurðpunktinn miðað við Long/Lat/Bearing tveggja punkta?
Hef ekki gert það ennþá, Khanh!
Þ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!
Ég fæ alltaf villuskilaboð: Óþekktur dálkur 'Fjarlægð' í 'hvar klausu' á MySQL fyrirspurninni.
Pétur, vinsamlegast lestu í gegnum aðrar athugasemdir. Svo virðist sem sumir hafi þurft að nota aðra setningafræði fyrir WHERE / HAVING.
Þakka þér fyrir þessa frábæru grein! Prófaði bara kóðann á DB og virkaði frábærlega!
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.
Frábært að heyra, Ash!
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
sama, ég hef fundið út hvernig "aðgerðin" virkar í php
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
Kærar þakkir!!
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
Þakka þér fyrir þessa grein. Vinnur fínt með kóðann minn. 🙂
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.
Takk! Ég hef breytt færslunni aðeins... en jöfnurnar taka svo mikið pláss og eru svo langar að ég er ekki viss um að það hjálpi of mikið.
Þakka þér kærlega.
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ð
Ég mun ekki reikna fjarlægð milli tveggja ríkja
Mikið þökk fyrir tan hermoso codigo…
Þetta eru góðar cosinus aðgerðir. Ég kann ekki stærðfræði, en takk!
Frábært starf… 🙂 (y)
þ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ð;
takk ...
virkar ekki ef
„HVAR fjarlægð“
vinna ef
„AÐ HAFA fjarlægð“
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ð.
É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` “;
Takk Kupendra!
þakka þér, herra, fullkomlega.. en ég er með eina spurningu ef ég vil gefa út án aukastafa, hvað get ég þá gert..?
Takk í fara fram.
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
É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 –