Ĉi-monate mi programis sufiĉe en PHP kaj MySQL rilate al GIS. Promenante ĉirkaŭ la reto, mi efektive malfacile trovis iujn el la Geografiaj kalkuloj por trovi la distancon inter du lokoj do mi volis dividi ilin ĉi tie.
La simpla maniero kalkuli distancon inter du punktoj estas uzi la pitagorean formulon por kalkuli la hipotenuzon de triangulo (A² + B² = C²). Ĉi tio estas konata kiel la Eŭklida distanco.
Tio estas interesa komenco, sed ĝi ne validas kun Geografio, ĉar la distanco inter latitudaj kaj longitudaj linioj estas ne egalaj distancoj aparte. Kiam vi proksimiĝas al la ekvatoro, latitudaj linioj pli disiĝas. Se vi uzas ian simplan triangulan ekvacion, ĝi eble mezuros distancon precize en unu loko kaj terure malĝuste en la alia, pro la kurbeco de la Tero.
Granda Ronda Distanco
La vojoj trairataj longajn distancojn ĉirkaŭ la Tero estas nomataj Granda Ronda Distanco. Tio estas... la plej mallonga distanco inter du punktoj sur sfero estas malsama ol la punktoj sur plata mapo. Kombinu tion kun la fakto, ke la latitudo kaj longitudo linioj ne estas samdistancaj... kaj vi havas malfacilan kalkulon.
Jen fantazia videoklarigo pri kiel funkcias Grandaj Rondoj.
La Haversina Formulo
La distanco uzanta la kurbecon de la Tero estas inkluzivita en la Haversina formulo, kiu uzas trigonometrion por permesi la kurbecon de la tero. Kiam vi trovas la distancon inter 2 lokoj sur la tero (kiel korvo flugas), rekto estas vere arko.
Ĉi tio aplikeblas en aera flugo - ĉu vi iam rigardis la efektivan mapon de flugoj kaj rimarkis, ke ili estas arkaj? Tio estas ĉar pli mallongas flugi en arko inter du punktoj ol rekte al la loko.
PHP: Kalkulu Distancon Inter 2 Latitudoj kaj Longeco
Jen la PHP-formulo por kalkuli la distancon inter du punktoj (kune kun Mile vs. Kilometer-konverto) rondigita al du decimalaj lokoj.
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));
}
La variabloj estas:
- $Latitudo1 – variablo por la latitudo de via unua loko.
- $Longitudo1 – variablo por la longitudo de via unua loko
- $Latitudo2 – variablo por la latitudo de via dua loko.
- $Longitudo2 – variablo por la longitudo de via dua loko.
- $unuo – la defaŭlta estaĵo miloj. Ĉi tio povas esti ĝisdatigita aŭ pasita kiel kilometroj.
Python: Kalkuli Distancon Inter 2 Poentoj de Latitudo kaj Longitudo
Ĉiuokaze, jen la Python-formulo por kalkuli la distancon inter du punktoj (kune kun Mile vs. Kilometer konvertiĝo) rondigita al du decimalaj lokoj. Dankon al mia filo, Bill Karr, kiu estas Datuma Sciencisto por OpenINSIGHTS, por la kodo.
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)
La variabloj estas:
- latitudo1 – variablo por via unua loko latitudo.
- longitudo1 – variablo por via unua loko longitudo
- latitudo2 – variablo por via dua loko latitudo.
- longitudo2 – variablo por via dua loko longitudo.
- unuo – la defaŭlta estaĵo miloj. Ĉi tio povas esti ĝisdatigita aŭ pasita kiel kilometroj.
MySQL: Reakiro Ĉiuj Rekordoj Ene de Intervalo Kalkulante Distancon En Mejloj Uzante Latitudon kaj Longitudon
Eblas ankaŭ uzi SQL por fari kalkulon por trovi ĉiujn registrojn ene de specifa distanco. En ĉi tiu ekzemplo, mi pridemandos MyTable en MySQL por trovi ĉiujn registrojn malpli ol aŭ egalajn al varia $ distanco (en Mejloj) al mia loko je $ latitudo kaj $ longitudo:
La konsulto por rekuperi ĉiujn registrojn en specifa malproksimo kalkulante distancon en mejloj inter du punktoj de latitudo kaj longitudo estas:
$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."
Vi bezonos agordi ĉi tion:
- $ longitudo - Jen PHP-variablo, kie mi preterpasas la longitudon de la punkto.
- $ latitudo - Jen PHP-variablo, kie mi preterpasas la longitudon de la punkto.
- $ distanco - ĉi tiu estas la distanco, kiun vi ŝatus trovi ĉiujn registrojn malpli aŭ egala al.
- tablo - jen la tabelo ... vi volos anstataŭigi tion per via tabela nomo.
- latitudo - jen la kampo de via latitudo.
- longitudo - jen la kampo de via longitudo.
MySQL: Prenante Ĉiujn Rekordojn Ene de Intervalo Kalkulante Distancon En Kilometroj Uzante Latitudon kaj Longitudon
Kaj jen la SQL-konsulto uzanta kilometrojn en 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."
Vi bezonos agordi ĉi tion:
- $ longitudo - Jen PHP-variablo, kie mi preterpasas la longitudon de la punkto.
- $ latitudo - Jen PHP-variablo, kie mi preterpasas la longitudon de la punkto.
- $ distanco - ĉi tiu estas la distanco, kiun vi ŝatus trovi ĉiujn registrojn malpli aŭ egala al.
- tablo - jen la tabelo ... vi volos anstataŭigi tion per via tabela nomo.
- latitudo - jen la kampo de via latitudo.
- longitudo - jen la kampo de via longitudo.
Mi uzis ĉi tiun kodon en platformo pri entreprena mapado, kiun ni uzis por podetala butiko kun pli ol 1,000 lokoj tra Nordameriko kaj ĝi funkciis bele.
Microsoft SQL Server Geografia Distanco: STDistance
Se vi uzas Microsoft SQL-Servilon, ili ofertas sian propran funkcion, STDistanco por kalkuli la distancon inter du punktoj uzante la Geografia datumtipo.
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);
Ĉapelpinto al Manash Sahoo, VP kaj Arkitekto de Highbridge.
Koran dankon pro kundivido. Ĉi tio estis facila kopii kaj alglui laboron kaj funkcias bonege. Vi savis min multe da tempo.
FYI por iu ajn portanta al C:
duobla deg2rad (duobla grado) { return deg*(3.14159265358979323846/180.0); }
Tre bela peco de afiŝo - tre bone funkciis - mi devis nur ŝanĝi la nomon de la tablo tenanta la lat-longon. Ĝi funkcias sufiĉe rapide al.. Mi havas sufiĉe malgrandan nombron da lat-longoj (< 400) sed mi pensas, ke tio skalus bele. Ankaŭ bela retejo - mi ĵus aldonis ĝin al mia konto del.icio.us kaj rekontrolos regule.
Koran dankon Peter kaj Kerry! Se vi ŝatas labori pri GIS-projektoj, mi rekomendus:
Koran dankon... 😀
Mi serĉis la tutan tagon por distanckalkuloj kaj trovis la harversine-algoritmon, dankon al vi pro doni la ekzemplon pri kiel meti ĝin en sql-deklaro. Dankon kaj saluton, Daniel
Mi ĝojas helpi, rails amiko!
Nun mi serĉas PHP-funkcion 'en Plurangulo', kiu prenos tabelon de sinsekvaj latitudo kaj longitudo koordinatoj kaj eltrovos ĉu alia punkto estas ene aŭ ekstere de la plurangulo.
Mi trovis la ekvacio por eltrovi ĉu punkto en plurlatero!
Mi pensas, ke via SQL bezonas havantan deklaron.
anstataŭ WHERE distanco <= $distance vi eble bezonos
uzu HAVING distancon <= $distance
alie dankon pro ŝpari al mi amason da tempo kaj energio.
Saluton David,
Se vi faras ian ajn deklaron GROUP BY, vi bezonos HAVING. Mi ne faras tion en la supra ekzemplo.
Doug
De MySQL 5.x, vi ne povas uzi kaŝnomon sur WHERE-frazo vidu http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Uzu HAVING anstataŭ WHERE en la supraj demandoj
Dankegon. Vi faris bonegan laboron. Tion mi vere volas. Multaj dankoj.
Koran dankon pro dividi ĉi tiun kodon. Ĝi ŝparis al mi multe da disvolva tempo. Ankaŭ, dankon al viaj legantoj pro atentigi, ke HAVING-deklaro estas necesa por MySQL 5.x. Tre helpema.
Mi estas benita havi legantojn multe pli lertajn ol mi!
🙂
La supra formulo ŝparas al mi multan tempon. Dankegon.
Mi ankaŭ devas ŝanĝi inter la formato NMEA kaj Gradoj. Mi trovis formulon ĉe ĉi tiu URL ĉe la malsupro de la paĝo. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Ĉu iu scias kiel kontroli ĉi tion?
Dankon!
Harry
saluton,
Alia demando. Ĉu ekzistas formulo por NMEA-ŝnuroj kiel tiu ĉi sube?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
danke,
Harry
Mi ankaŭ trovis, ke KIE ne funkciis por mi. Ŝanĝis ĝin al HAVING kaj ĉio funkcias perfekte. Komence mi ne legis la komentojn kaj reverkis ĝin uzante nestitan elekton. Ambaŭ funkcios bone.
Koran dankon pro la skripto skribita en mysql, nur devis fari kelkajn etajn ĝustigojn (HAVANTE) 🙂
Bonan laboron
Nekredeble helpema, koran dankon! Mi havis kelkajn problemojn kun la nova "HAVING", prefere ol "KIE", sed post kiam mi legis la komentojn ĉi tie (post ĉirkaŭ duonhoro de grincado de miaj dentoj pro frustriĝo =P), mi bonege funkciis. Dankon ^_^
multan dankon funkcias bonege
Memoru, ke elekta deklaro tia estos tre kompute intensa kaj tial malrapida. Se vi havas multajn el tiuj demandoj, ĝi povas malbonigi aferojn sufiĉe rapide.
Multe malpli intensa aliro estas prizorgi unuan (krudan) elekton uzante Kvadratan areon difinitan per kalkulita distanco t.e. "elektu * el tabelnomo kie latitudo inter lat1 kaj lat2 kaj longitudo inter lon1 kaj lon2". lat1 = cellatitude – latdiff, lat2 = cellatitude + latdiff, simile kun lon. latdiff ~= distanco / 111 (por km), aŭ distanco/69 por mejloj ĉar 1 grado de latitudo estas ~ 111 km (malgranda variado ĉar tero estas iomete ovala, sed sufiĉa por tiu celo). londiff = distanco / (abs(cos(deg2rad(latitudo))*111)) — aŭ 69 por mejloj (vi efektive povas preni iom pli grandan kvadraton por kalkuli variadojn). Tiam prenu la rezulton de tio kaj enigu ĝin en la radialan elekton. Nur ne forgesu prikalkuli eksterlimajn koordinatojn - te la intervalo de akceptebla longitudo estas -180 ĝis +180 kaj la intervalo de akceptebla latitudo estas -90 ĝis +90 - se via latdiff aŭ londiff kuras ekster ĉi tiu intervalo. . Notu ke en la plej multaj kazoj tio eble ne estas uzebla ĉar ĝi nur influas kalkulojn super linio tra la Pacifika oceano de poluso ĝis poluso, kvankam ĝi intersekcas parton de Chukotka kaj parton de Alaska.
Kion ni sukcesas per tio estas grava redukto de la nombro da punktoj, kontraŭ kiuj vi faras ĉi tiun kalkulon. Se vi havas milionon da tutmondaj poentoj en la datumbazo distribuitaj proksimume egale kaj vi volas serĉi ene de 100 km, tiam via unua (rapida) serĉo estas de areo 10000 kvadrataj km kaj verŝajne donos ĉirkaŭ 20 rezultojn (surbaze de egala distribuo super surfacareo de ĉirkaŭ 500M kvadrataj km), kio signifas, ke vi ruligas la kompleksan distancokalkulon 20 fojojn por ĉi tiu demando anstataŭ milionoble.
Malgranda eraro en la ekzemplo... tio estus por ene de 50 km (ne 100) ĉar ni rigardas la "radiuson" de nia... kvadrato.
Mirinda konsilo! Mi fakte laboris kun programisto, kiu skribis funkcion, kiu tiris la internan kvadraton kaj poste rekursivan funkcion, kiu faris 'kvadratojn' ĉirkaŭ la perimetro por inkluzivi kaj ekskludi la ceterajn punktojn. La rezulto estis nekredeble rapida rezulto - li povis taksi milionojn da punktoj en mikrosekundoj.
Mia aliro supre estas sendube 'kruda' sed kapabla. Redankon!
Doug,
Mi provis uzi mysql kaj php por taksi ĉu lat longa punkto estas ene de plurangulo. Ĉu vi scias, ĉu via programisto-amiko publikigis iujn ekzemplojn pri kiel plenumi ĉi tiun taskon. Aŭ ĉu vi konas iujn bonajn ekzemplojn. Antaŭdankon.
Saluton al ĉiuj, jen mia prova SQL-deklaro:
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
kaj Mysql diras al mi, ke distanco, ne ekzistas kiel kolumno, mi povas uzi ordon per, mi povas fari ĝin sen KIE, kaj ĝi funkcias, sed ne kun ĝi...
Anstataŭigu "KIEL-distancon" per "HAVANTA distanco".
Funkcias kiel ĉarmo, dankon, Douglas!
Ĉi tio estas bonega, tamen ĝi estas same kiel la birdoj flugas. Estus bonege provi kaj korpigi la google maps API al ĉi tio iel (eble uzante vojojn ktp.) Nur por doni ideon uzante malsaman transportformon. Mi ankoraŭ devas fari ŝajnigan annealing-funkcion en PHP, kiu kapablus oferti efikan solvon al la problemo de vojaĝa vendisto. Sed mi pensas, ke mi eble povos reuzi iom da via kodo por fari tion.
Saluton Douglas,
koran dankon pro ĉi tiu artikolo - vi ĵus ŝparis al mi multe da tempo.
zorgu,
nimrod @Israelo
Bona artikolo! Mi trovis multajn artikolojn priskribantajn kiel kalkuli distancon inter du punktoj sed mi vere serĉis la SQL-fragmenton.
Dankon multe funkcias bone
Koran dankon pro ĉi tiu formulo. Ĝi razis iom da tempo en vendeja loko projekto kiu manĝis ĉe mi.
Dankon pakaĵo. Ĉi tiu kodlinio ŝparis al mi konsiderindan tempon en vendeja loko-projekto!
#1054 - Nekonata kolono 'distanco' en 'kie-frazo'
aprobi
Ankaŭ mi! Kio estas la problemo :-/? kiel solvi la "distancon" - Kolumna problemo? Helpu nin, mi petas!! 🙂
Provu uzi HAVING anstataŭ WHERE
2 tagoj da esploro por finfine trovi ĉi tiun paĝon, kiu solvas mian problemon. Ŝajnas, ke mi pli bone elprenu mian WolframAlpha kaj pliprofundigu mian matematikon. La ŝanĝo de KIE al HAVING havas mian skripton en funkciado. DANKON
anstataŭ WHERE klaŭzo uzu:
HAVAN distancon < 50
Dankon Georgi. Mi daŭre ricevis kolumnon 'distancon' ne trovitan. Unufoje mi ŝanĝas la KIE al HAVO ĝi funkciis kiel ĉarmo!
Mi deziras, ke ĉi tio estu la unua paĝo, kiun mi trovus pri ĉi tio. Post provi multajn malsamajn komandojn ĉi tiu estis la sola kiu funkciis ĝuste, kaj kun minimumaj ŝanĝoj necesaj por konveni mian propran datumbazon.
Multaj dankoj!
Mi deziras, ke ĉi tio estu la unua paĝo, kiun mi trovus pri ĉi tio. Post provi multajn malsamajn komandojn ĉi tiu estis la sola kiu funkciis ĝuste, kaj kun minimumaj ŝanĝoj necesaj por konveni mian propran datumbazon.
Multaj dankoj!
Multaj dankoj!
Multaj dankoj!
Mi pensas, ke la kodo ne plu aperas. Eble ĝi estas fajrvulpo?
Mi ĵus provis ambaŭ en Firefox kaj Chrome kaj ĝi aperas. Provu denove?
Saluton. Multaj dankoj. Ĉi tio funkcias kiel ĉarmo.
Dankegon Douglas. Ĉi tio funkcias perfekte.
Mi scias, ke ĉi tiu formulo funkcias, sed mi ne povas vidi kie la radiuso de la tero estas konsiderata. Ĉu iu povas lumigi min, mi petas?
Tim, por plena klarigo pri la formulo Havesine (tio ne estas kodo), rigardu la artikolon de Vikipedio: http://en.wikipedia.org/wiki/Haversine_formula
Bela! Ĉi tio ege helpis min!
Bonegaj aferoj Douglas. Ĉu vi provis akiri la intersekcan punkton donita la Longa / Lat / Portanta de du punktoj?
Ankoraŭ ne faris tion, Khanh!
Dankon Douglas, la SQL-Demando estas ĝuste tio, kion mi bezonis, kaj mi pensis, ke mi mem devos skribi ĝin. Vi savis min de eble horoj da latitudina longitudo lernkurbo!
Mi daŭre ricevas Erarmesaĝon: Nekonata kolumno 'Distanco' en 'kie klaŭzo' sur la MySQL-Demando.
Peter, bonvolu tralegi la aliajn komentojn. Ŝajnas, ke iuj homoj devis uzi alian sintakson por KIE/HAVADO.
Dankon pro ĉi tiu bonega artikolo! Nur testis la kodon sur mia DB kaj bonege funkciis!
Douglas, dankon pro ĉi tiu mirinda kodo. Mi ekscitis kiel fari tion sur mia GPS-komunuma portalo. Vi ŝparis al mi horojn.
Bonege aŭdi, Ash!
dankon pro afiŝado de ĉi tiu helpema artikolo,
sed ial mi ŝatus demandi
kiel akiri la distancon inter coords en mysql db kaj coords enmetitaj al php de uzanto?
por pli klare priskribi:
1.uzanto devas enmeti [id] por elekti specifitajn datumojn el db kaj la koordoj de la uzanto mem
2.la php-dosiero ricevas la celajn datumojn (koordojn) uzante [id] kaj poste kalkulu distancon inter uzanto kaj celpunkto
aŭ ĉu simple povas atingi distancon de la suba kodo?
$qry = “SELECT *,(((acos(sin((“.$latitudo.”*pi()/180)) * sin((`Latitudo`*pi()/180))+cos((“. $latitudo.”*pi()/180)) * cos((`Latitudo`*pi()/180)) * cos((((“.$longitudo.”- `Longitudo`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) kiel distanco DE `MyTable` WHERE distanco >= “.$distance.” >>>>ĉu mi povas "elpreni" la distancon de ĉi tie?
Redankon,
Timmy S
ne gravas, mi eltrovis kiel la "funkcio" funkcias en php
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
multaj dankoj!!
bone, ĉio, kion mi provis, ne funkcias. Mi volas diri, tio, kion mi havas, funkcias, sed la distancoj estas tre malproksimaj.
Ĉu iu povus vidi kio estas malĝusta kun ĉi tiu kodo?
if(isset($_POST['submetita'])){ $z = $_POST['kodo']; $r = $_POST['radiuso']; echo “Rezultoj por “.$z; $sql = mysql_query(“SELECT DISTINCT m.zipkodo, m.MktName,m.LocAddSt,m.LocAddCity,m.LocAddState,m.x1,m.y1,m.verified,z1.lat,z2.lon,z1. urbo,z1.state DE mrk m, zip z1, zip z2 KIE m.zipcode = z1.zipcode KAJ z2.zipcode = $z KAJ (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 ) ) ) aŭ <= $e ") (mysql_eraro()); while($vico = mysql_fetch_array( $sql)) { $vendejo1 = $vico['MktName']."”; $vendejo = $row['LocAddSt'].””; $vendejo .= $row['LocAddCity'].”, “.$row['LocAddState'].” “.$vico['kodo']; $latitudo1 = $vico['lat']; $longitudo1 = $vico['lon']; $latitudo2 = $vico['y1']; $longitudo2 = $vico['x1']; $urbo = $vico['urbo']; $stato = $vico['stato']; $dis = getnew($latitudo1, $longitudo1, $latitudo2, $longitudo2, $unuo = 'Mi'); // $dis = distanco($lat1, $lon1, $lat2, $lon2); $kontrolita = $vico['kontrolita']; if($kontrolita == '1'){ eĥo “”; echo “”.$vendejo.””; echo $dis . ”mejlo(j) for”; eĥo “”; } else { echo “”.$vendejo.””; echo $dis . ”mejlo(j) for”; eĥo “”; } }}
miaj funkcioj.php-kodo
function getnew($latitudo1, $longitudo1, $latitudo2, $longitudo2, $unuo = 'Mi') { $theta = $longitudo1 – $longitudo2; $distanco = (sin(deg2rad($latitudo1)) * sin(deg2rad($latitudo2))) + (cos(deg2rad($latitudo1)) * cos(deg2rad($latitudo2)) * cos(deg2rad($theta)) ); $distance = acos($distance); $distanco = rad2deg($distanco); $distanco = $distanco * 60 * 1.1515; switch($unuo) { case 'Mi': break; kazo 'Km' : $distanco = $distanco * 1.609344; } reveno (ronda($distanco,2)); }
Antaŭdankon
Dankon pro ĉi tiu artikolo. Funkcias bone kun mia kodo. 🙂
Hej Douglas, bonega artikolo. Mi trovis vian klarigon pri la geografiaj konceptoj kaj la kodo vere interesa. Mia nura sugesto estus spacigi kaj indentigi la kodon por montriĝo (kiel Stackoverflow, ekzemple). Mi komprenas, ke vi volas konservi spacon, sed konvencia kodinterspacigo/indentaĵo multe plifaciligus al mi, kiel programisto, legi kaj dissekci. Ĉiuokaze, tio estas malgranda afero. Daŭrigu la bonegan laboron.
Dankon! Mi iomete modifis la afiŝon... sed la ekvacioj okupas tiom da spaco kaj estas tiom longaj, ke mi ne certas, ke ĝi tro helpas.
Multan dankon.
ĉi tie dum uzado kun funkcio ni ricevas unu specon de distanco..dum uzado de demando ĝia venanta alia speco de distanco
Mi ne kalkulos distancon inter du ŝtatoj
Multan dankon por tan bela codigo…
Ĉi tio estas bonaj kosinusaj funkcioj. Mi ne scias matematikon, sed dankon!
Bonega Laboro... 🙂 (y)
ŝajnas pli rapide (mysql 5.9) uzi dufoje la formulon en la elekto kaj kie:
$formulo = “(((acos(sin((“.$latitudo.”*pi()/180)) * sin((`Latitudo`*pi()/180))+cos(((“.$latitudo. ”*pi()/180)) * cos((`Latitudo`*pi()/180)) * cos(((“.$longitudo.”- `Longitudo`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'SELECT *, '.$formulo.' kiel distanco DE tablo WHERE '..$formulo.' <= '.$distanco;
Dankon…
ne funkcias se
"KIE distanco"
laborante se
"HAVANTE distancon"
Multan dankon pro tondi ĉi tiun artikolon. Ĝi estas tre helpema.
PHP komence estis kreita kiel simpla skriptplatformo nomita "Persona Hejmpaĝo". Nuntempe PHP (la mallongigo de Hypertext Preprocessor) estas alternativo de la teknologio de Active Server Pages (ASP) de Mikrosofto.
PHP estas malfermfonta servilflanka lingvo, kiu estas uzata por krei dinamikajn retpaĝojn. Ĝi povas esti enigita en HTML. PHP estas kutime uzata kune kun MySQL-datumbazo sur Linukso/UNIKsaj retserviloj. Ĝi estas verŝajne la plej populara skriptlingvo.
Mi trovis, ke ĉi-supra solvo ne funkcias ĝuste.
Mi devas ŝanĝi al:
$qqq = “SELECT *,(((acos(sin((“.$latitudo.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitudo . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $longitudo . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) kiel distanco DE `registro` “;
Dankon Kupendra!
dankon sinjoro laboranta perfekte.. sed mi havas unu demandon, se mi volas eligi sen dekuma punkto, kion mi povas fari..?
Antaŭdankon.
Saluton, bonvolu, mi vere bezonos vian helpon pri tio.
Mi faris ricevpeton al mia retservilo http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $latitudo
—2.23389 = $longitudo
kaj 20 = la distanco, kiun mi volas preni
Tamen uzante vian formulon, ĝi retrovas ĉiujn vicojn en mia db
$rezultoj = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitudo.”*pi()/180)) * sin((lat*pi()/180 ))+cos((“.$latitudo.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$longitudo.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) kiel distanco DE markiloj HAVING distanco >= “.$distance ));
[{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”adreso”:”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”,”adreso”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”adreso”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Ronda Tablo Pico: Mountain View”,”adreso”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”adreso”:”619 Escuela Ave, Mountain” View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pico”,”adreso4546”:”37.401725769043” El Camino Real, Los Altos, CA”,”lat”:122.11464691162,”lng”:-16077.937560795,”distance”:7},{“ id”:24,”name”:”La trinkejoj kaj kradoj”,”adreso”:”53.485118865967 Whiteley Street, Manĉestro”,”lat”:2.1828699111938,”lng”:-8038.7620112314,”distance”:XNUMX}]
Mi volas preni nur vicojn kun 20 mejloj sed ĝi alportas ĉiujn vicojn. Bonvolu, kion mi malbone faras
Mi serĉas similan demandon sed iom pliiĝis - mallonge ĉi tio estas grupigi ĉiujn koordinatojn ene de 2 mejloj de ĉiu koordinato kaj poste kalkuli kiom da koordinatoj en ĉiu grupo kaj eligi nur unu grupon kiu havas la plej multajn koordinatojn - eĉ se vi havas pli ol unu grupon inter grupoj kiuj havas la plej grandan nombron da koordinatoj - simple eligu la hazardan grupon el la grupoj kun la sama plej granda nombro -