
Bereken of bevraagteken groot sirkelafstand tussen punte van breedtegraad en lengtegraad deur gebruik te maak van die Haversine-formule (PHP, JavaScript, Java, Python, MySQL, MSSQL-voorbeelde)
Hierdie maand het ek nogal 'n bietjie in PHP en MySQL geprogrammeer met betrekking tot GIS. Snuffel rond die net, ek het eintlik 'n moeilike tyd om sommige van die te vind Geografiese berekeninge om die afstand tussen twee plekke te vind, so ek wou dit hier deel.

Die eenvoudige manier om 'n afstand tussen twee punte te bereken, is deur die Pythagorese formule te gebruik om die skuinssy van 'n driehoek te bereken (A² + B² = C²). Dit staan bekend as die Euklidiese afstand.
Dit is 'n interessante begin, maar dit is nie van toepassing op Geografie nie, aangesien die afstand tussen breedte- en lengtelyne nie gelyke afstande van mekaar is nie. Soos jy nader aan die ewenaar kom, raak breedtelyne verder uitmekaar. As jy 'n eenvoudige triangulasievergelyking gebruik, kan dit afstand akkuraat meet op een plek en verkeerd op die ander, as gevolg van die kromming van die Aarde.
Groot sirkelafstand
Die roetes wat lang afstande om die Aarde afgelê word, staan bekend as die Grootsirkelafstand. Dit wil sê... die kortste afstand tussen twee punte op 'n sfeer verskil van die punte op 'n plat kaart. Kombineer dit met die feit dat breedte- en lengtelyne nie ewe ver is nie ... en jy het 'n moeilike berekening.
Hier is 'n fantastiese video-uiteensetting van hoe Great Circles werk.
Die Haversine-formule
Die afstand wat die kromming van die Aarde gebruik, is ingesluit in die Haversine-formule, wat trigonometrie gebruik om voorsiening te maak vir die aarde se kromming. Wanneer jy die afstand tussen 2 plekke op aarde vind (soos die kraai vlieg), is 'n reguit lyn eintlik 'n boog.
Dit is van toepassing in lugvlug – het jy al ooit na die werklike kaart van vlugte gekyk en opgemerk dat hulle geboë is? Dit is omdat vlieg in 'n boog tussen twee punte korter is as direk na die ligging.
PHP: Bereken afstand tussen 2 punte van breedte en lengte
Hier is die PHP-formule vir die berekening van die afstand tussen twee punte (saam met Mile vs. Kilometer-omskakeling) afgerond tot twee desimale plekke.
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));
}
Die veranderlikes is:
- $Latitude1 – 'n veranderlike vir jou eerste ligging se breedtegraad.
- $lengtegraad1 – 'n veranderlike vir jou eerste ligging se lengtegraad
- $Latitude2 – 'n veranderlike vir jou tweede ligging se breedtegraad.
- $lengtegraad2 – 'n veranderlike vir jou tweede ligging se lengtegraad.
- $eenheid – die verstekwese myl. Dit kan opgedateer word of deurgegee word as kilometer.
Java: Bereken afstand tussen 2 punte van breedte- en lengtegraad
public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
double theta = longitude1 - longitude2;
double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit.equals("miles")) {
return Math.round(distance, 2);
} else if (unit.equals("kilometers")) {
return Math.round(distance * 1.609344, 2);
} else {
return 0;
}
}
Die veranderlikes is:
- breedtegraad 1 – 'n veranderlike vir jou eerste ligging se breedtegraad.
- lengtegraad 1 – 'n veranderlike vir jou eerste ligging se lengtegraad
- breedtegraad 2 – 'n veranderlike vir jou tweede ligging se breedtegraad.
- lengtegraad 2 – 'n veranderlike vir jou tweede ligging se lengtegraad.
- eenheid – die verstekwese myl. Dit kan opgedateer word of deurgegee word as kilometer.
Javascript: Bereken afstand tussen 2 punte van breedtegraad en lengtegraad
function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
let theta = longitude1 - longitude2;
let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit == 'miles') {
return Math.round(distance, 2);
} else if (unit == 'kilometers') {
return Math.round(distance * 1.609344, 2);
}
}
Die veranderlikes is:
- breedtegraad 1 – 'n veranderlike vir jou eerste ligging se breedtegraad.
- lengtegraad 1 – 'n veranderlike vir jou eerste ligging se lengtegraad
- breedtegraad 2 – 'n veranderlike vir jou tweede ligging se breedtegraad.
- lengtegraad 2 – 'n veranderlike vir jou tweede ligging se lengtegraad.
- eenheid – die verstekwese myl. Dit kan opgedateer word of deurgegee word as kilometer.
Python: Bereken afstand tussen 2 punte van breedte- en lengtegraad
In elk geval, hier is die Python-formule vir die berekening van die afstand tussen twee punte (saam met Mile vs. Kilometer-omskakeling) afgerond tot twee desimale plekke. Krediet aan my seun, Bill Karr wat 'n datawetenskaplike is vir Maak INSIGTE oop, vir die kode.
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)
Die veranderlikes is:
- breedtegraad 1 – 'n veranderlike vir jou eerste ligging s'n breedtegraad.
- lengtegraad 1 – 'n veranderlike vir jou eerste ligging s'n lengtegraad
- breedtegraad 2 – 'n veranderlike vir jou tweede ligging s'n breedtegraad.
- lengtegraad 2 – 'n veranderlike vir jou tweede ligging s'n lengtegraad.
- eenheid – die verstekwese myl. Dit kan opgedateer word of deurgegee word as kilometer.
MySQL: Haal alle rekords binne 'n reeks op deur afstand in myl te bereken deur breedte- en lengtegraad te gebruik
Dit is ook moontlik om SQL te gebruik om alle rekords binne 'n spesifieke afstand te bereken. In hierdie voorbeeld gaan ek MyTable in MySQL navraag doen om al die rekords te vind wat minder as of gelyk is aan veranderlike $afstand (in myl) na my ligging by $latitude en $longitude:
Die navraag om al die rekords in 'n spesifieke op te spoor afstand deur die afstand in myl te bereken tussen twee breedte- en lengtepunte is:
$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."
U moet dit aanpas:
- $ lengte - dit is 'n PHP-veranderlike waar ek die lengte van die punt deurgee.
- $ breedtegraad - dit is 'n PHP-veranderlike waar ek die lengte van die punt deurgee.
- $ afstand - dit is die afstand waarop u al die rekords minder of gelyk wil vind.
- tafel - dit is die tabel ... u wil dit vervang deur u tafelnaam.
- breedtegraad - dit is die veld van u breedtegraad.
- lengtegraad - dit is die veld van u lengtegraad.
MySQL: Haal alle rekords binne 'n reeks op deur afstand in kilometers te bereken deur breedte- en lengtegraad te gebruik
En hier is die SQL-vraag wat kilometers in MySQL gebruik:
$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."
U moet dit aanpas:
- $ lengte - dit is 'n PHP-veranderlike waar ek die lengte van die punt deurgee.
- $ breedtegraad - dit is 'n PHP-veranderlike waar ek die lengte van die punt deurgee.
- $ afstand - dit is die afstand waarop u al die rekords minder of gelyk wil vind.
- tafel - dit is die tabel ... u wil dit vervang deur u tafelnaam.
- breedtegraad - dit is die veld van u breedtegraad.
- lengtegraad - dit is die veld van u lengtegraad.
Ek het hierdie kode gebruik in 'n kaarteplatform vir ondernemings wat ons gebruik het vir 'n kleinhandelwinkel met meer as 1,000 XNUMX plekke in Noord-Amerika, en dit het pragtig gewerk.
Microsoft SQL Server Geografiese Afstand: STDistance
As jy Microsoft SQL Server gebruik, bied hulle hul eie funksie, STAfstand vir die berekening van die afstand tussen twee punte deur die Geografie-datatipe te gebruik.
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);
Hoedpunt aan Manash Sahoo, VP en argitek van Highbridge.
Baie dankie vir die deel. Dit was 'n maklike kopieer en plak werk en werk uitstekend. Jy het my baie tyd gespaar.
FYI vir enigiemand wat na C oordra:
double deg2rad(dubbel deg) { return deg*(3.14159265358979323846/180.0); }
Baie mooi stukkie plasing – het baie mooi gewerk – ek moes net die naam verander van die tafel wat die lat-long hou. Dit werk redelik vinnig om .. Ek het 'n redelike klein aantal lat-longs (< 400) maar ek dink dit sal mooi skaal. Lekker webwerf ook – ek het dit sopas by my del.icio.us-rekening gevoeg en sal gereeld terugkyk.
Baie dankie Peter en Kerry! As jy daarvan hou om aan GIS-projekte te werk, sal ek aanbeveel:
Baie dankie... 😀
Ek het die hele dag vir afstandberekeninge gesoek en die harversine-algoritme gevind, dankie dat jy die voorbeeld gegee het oor hoe om dit in 'n sql-stelling te plaas. Dankie en groete, Daniel
Bly om te help, rels vriend!
Nou is ek op soek na 'n 'in veelhoek' PHP-funksie wat 'n reeks opeenvolgende breedte- en lengtegraadkoördinate sal neem en uitvind of 'n ander punt binne of buite die veelhoek is.
Ek het die vergelyking om uit te vind of 'n punt in 'n veelhoek is!
Ek dink jou SQL het 'n stelling nodig.
in plaas van WHERE afstand <= $afstand wat jy dalk moet
gebruik HAVING afstand <= $afstand
anders dankie dat jy my 'n klomp tyd en energie gespaar het.
Hi Dawid,
As jy enige tipe GROUP BY-stelling doen, sal jy HAVING nodig hê. Ek doen dit nie in die voorbeeld hierbo nie.
Doug
Vanaf MySQL 5.x kan jy nie 'n alias op 'n WHERE-klousule gebruik nie http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Gebruik HAVING in plaas van WHERE in die bogenoemde navrae
Baie dankie. Jy het goeie werk gedoen Dis die ding wat ek eintlik wil hê. Baie dankie.
Baie dankie vir die deel van hierdie kode. Dit het my baie ontwikkelingstyd gespaar. Dankie ook aan jou lesers wat daarop gewys het dat 'n HAVING-verklaring nodig is vir MySQL 5.x. Baie behulpsaam.
Ek is geseënd om lesers baie slimmer as ek te hê!
🙂
Die bogenoemde formule spaar my baie tyd. Baie dankie.
Ek moet ook wissel tussen die NMEA-formaat en Grade. Ek het 'n formule by hierdie URL onderaan die bladsy gevind. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Weet iemand hoe om dit te verifieer?
Dankie!
Harry
Hallo,
Nog 'n vraag. Is daar 'n formule vir NMEA-stringe soos die een hieronder?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Dankie,
Harry
Ek het ook gevind dat WHERE nie vir my gewerk het nie. Het dit verander na HAVING en alles werk perfek. Ek het eers nie die opmerkings gelees nie en het dit herskryf met 'n geneste kies. Albei sal net goed werk.
Baie dankie vir die script geskryf in mysql, moes net 'n paar klein aanpassings maak (HAT) 🙂
Goeie werk
Ongelooflik nuttig, baie dankie! Ek het 'n bietjie probleme gehad met die nuwe "HAVING", eerder as "WHERE", maar sodra ek die kommentaar hier gelees het (na so 'n halfuur se tande gekners van frustrasie =P), het ek dit goed laat werk. Dankie ^_^
baie dankie werk wonderlik
Hou in gedagte dat so 'n uitgesoekte stelling baie berekeningsintensief en dus stadig sal wees. As jy baie van daardie navrae het, kan dit dinge redelik vinnig laat val.
'n Veel minder intensiewe benadering is om 'n eerste (kru) seleksie te gebruik deur 'n VIERKANTE area te gebruik wat deur 'n berekende afstand gedefinieer word, dws "kies * uit tabelnaam waar breedtegraad tussen lat1 en lat2 en lengtegraad tussen lon1 en lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, soortgelyk aan lon. latdiff ~= afstand / 111 (vir km), of afstand/69 vir myl aangesien 1 breedtegraad ~ 111 km is (effe variasie aangesien die aarde effens ovaal is, maar voldoende vir hierdie doel). londiff = afstand / (abs(cos(deg2rad(breedtegraad))*111)) — of 69 vir myl (jy kan eintlik 'n effens groter vierkant neem om rekening te hou met variasies). Neem dan die resultaat daarvan en voer dit in die radiale kies in. Moet net nie vergeet om buitegrenskoördinate in ag te neem nie – dws die bereik van aanvaarbare lengtegraad is -180 tot +180 en die bereik van aanvaarbare breedtegraad is -90 tot +90 – ingeval jou latdiff of londiff buite hierdie reeks loop . Let daarop dat dit in die meeste gevalle dalk nie van toepassing is nie, aangesien dit slegs berekeninge oor 'n lyn deur die Stille Oseaan van pool tot pool beïnvloed, hoewel dit wel 'n deel van tsjoekotka en 'n deel van alaska sny.
Wat ons hiermee bereik, is 'n aansienlike vermindering in die aantal punte waarteen jy hierdie berekening maak. As jy 'n miljoen globale punte in die databasis het wat ongeveer eweredig versprei is en jy wil binne 100 km soek, dan is jou eerste (vinnige) soektog van 'n oppervlakte 10000 vk km en sal waarskynlik ongeveer 20 resultate oplewer (gebaseer op eweredige verspreiding oor 'n oppervlakte van ongeveer 500M vk km), wat beteken dat jy die komplekse afstandberekening 20 keer vir hierdie navraag uitvoer in plaas van 'n miljoen keer.
Geringe fout in die voorbeeld... dit sal binne 50 km wees (nie 100 nie), aangesien ons na die "radius" van ons... vierkant kyk.
Fantastiese raad! Ek het eintlik met 'n ontwikkelaar gewerk wat 'n funksie geskryf het wat die binnekant vierkant getrek het en dan 'n rekursiewe funksie wat 'vierkante' om die omtrek gemaak het om die oorblywende punte in te sluit en uit te sluit. Die resultaat was 'n ongelooflike vinnige resultaat - hy kon miljoene punte in mikrosekondes evalueer.
My benadering hierbo is beslis 'kru' maar bekwaam. Weereens dankie!
doug,
Ek het probeer om mysql en php te gebruik om te evalueer of 'n lat-langpunt binne 'n veelhoek is. Weet jy of jou ontwikkelaarvriend enige voorbeelde gepubliseer het oor hoe om hierdie taak uit te voer. Of ken jy enige goeie voorbeelde. Dankie by voorbaat.
Hallo almal, dit is my toets SQL-stelling:
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
en Mysql sê vir my dat afstand, nie as 'n kolom bestaan nie, ek kan volgorde gebruik deur, ek kan dit doen sonder WAAR, en dit werk, maar nie daarmee nie ...
Vervang “WAAR afstand” met “HAT afstand”.
Werk soos 'n sjarme, dankie, Douglas!
Dit is wonderlik, maar dit is net soos die voëls vlieg. Dit sal wonderlik wees om op een of ander manier die Google Maps API hierby te probeer inkorporeer (dalk deur paaie te gebruik, ens.) Net om 'n idee te gee deur 'n ander vorm van vervoer te gebruik. Ek moet nog 'n gesimuleerde uitgloeiingsfunksie in PHP maak wat 'n doeltreffende oplossing vir die reisende verkoopsmanprobleem sal kan bied. Maar ek dink dat ek dalk van jou kode kan hergebruik om dit te doen.
Hallo Douglas,
baie dankie vir hierdie artikel - jy het my net baie tyd gespaar.
pas jou op,
nimrod @Israel
Goeie artikel! Ek het baie artikels gevind wat beskryf hoe om afstand tussen twee punte te bereken, maar ek was regtig op soek na die SQL-brokkie.
Baie dankie werk goed
Baie dankie vir hierdie formule. Dit het 'n geruime tyd geskeer op 'n winkellokasie-projek wat aan my gevreet het.
Dankie 'n bundel. Hierdie klein reëltjie kode het my aansienlike tyd gespaar in 'n winkellokasieprojek!
#1054 – Onbekende kolom 'afstand' in 'waar klousule'
goedkeur
Selfde hier! Wat is die probleem :-/? hoe om die "afstand" - Kolomprobleem op te los? Help ons asseblief!! 🙂
Probeer HAVING in plaas van WAAR
2 dae se navorsing om uiteindelik hierdie bladsy te vind wat my probleem oplos. Dit lyk of ek beter my WolframAlpha uithaal en my wiskunde opknap. Die verandering van WHERE na HAVING het my skrif in werkende toestand. DANKIE
in plaas van WHERE klousule gebruik:
MET afstand <50
Dankie Georgi. Ek het voortdurend kolom 'afstand' gekry nie. Sodra ek die WHERE na HAVING verander het, het dit soos 'n sjarme gewerk!
Ek wens dit was die eerste bladsy wat ek hieroor gevind het. Nadat ek baie verskillende opdragte probeer het, was dit die enigste een wat behoorlik gewerk het, en met minimale veranderinge wat nodig was om by my eie databasis te pas.
Thanks a lot!
Ek wens dit was die eerste bladsy wat ek hieroor gevind het. Nadat ek baie verskillende opdragte probeer het, was dit die enigste een wat behoorlik gewerk het, en met minimale veranderinge wat nodig was om by my eie databasis te pas.
Thanks a lot!
Baie dankie!
Baie dankie!
Ek dink nie die kode verskyn meer nie. Miskien is dit virefox?
Ek het sopas beide in Firefox en Chrome getoets en dit verskyn. Probeer weer?
Hi. Baie dankie. Dit werk soos 'n sjarme.
Baie dankie Douglas. Dit werk perfek.
Ek weet hierdie formule werk, maar ek kan nie sien waar die radius van die aarde in ag geneem word nie. Kan iemand my asseblief inlig?
Tim, vir 'n volledige verduideliking van die Haversine-formule (dit is nie kode nie), kyk na Wikipedia se artikel: http://en.wikipedia.org/wiki/Haversine_formula
Pragtige! Dit het my geweldig gehelp!
Groot goed Douglas. Het jy al probeer om die snypunt te kry gegewe die Long/Lat/Bearing van twee punte?
Het dit nog nie gedoen nie, Khanh!
Dankie Douglas, die SQL-navraag is presies wat ek nodig gehad het, en ek het gedink ek sal dit self moet skryf. Jy het my gered van moontlik ure se breedtegraad lengtegraad leerkurwe!
Ek kry steeds Foutboodskap: Onbekende kolom 'Afstand' in 'waar-klousule' op die MySQL-navraag.
Peter, lees asseblief deur die ander kommentaar. Dit blyk dat sommige mense 'n ander sintaksis moes gebruik vir WHERE/HAVING.
Dankie vir hierdie wonderlike artikel! Sopas die kode op my DB getoets en uitstekend gewerk!
Douglas, dankie vir hierdie wonderlike kode. Ek het my kop gekraak oor hoe om dit op my GPS-gemeenskapsportaal te doen. Jy het my ure gespaar.
Heerlik om te hoor, Ash!
dankie vir die plasing van hierdie nuttige artikel,
maar om een of ander rede wil ek vra
hoe om die afstand te kry tussen koördinate binne mysql db en koorde wat deur gebruiker in php ingevoeg is?
vir meer duidelik beskryf:
1.gebruiker moet [id] invoeg om gespesifiseerde data uit db en gebruiker self se koördinate te kies
2. die php-lêer kry die teikendata (koördinate) met [id] en bereken dan die afstand tussen gebruiker en teikenpunt
of kan jy eenvoudig afstand kry van die kode hieronder?
$qry = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“. $latitude.”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$longitude.”- `Longitude`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) as afstand VANAF `MyTabel` WAAR afstand >= ".$afstand." >>>>kan ek die afstand hiervandaan “uithaal”?
weereens dankie,
Timmy S
maak nie saak nie, ek het uitgevind hoe die "funksie" in php werk
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
Baie dankie!!
ok, alles wat ek probeer het, werk nie. Ek bedoel, wat ek het, werk, maar die afstande is ver.
Kan iemand dalk sien wat fout is met hierdie kode?
if(isset($_POST['voorgelê'])){ $z = $_POST['poskode']; $r = $_POST['radius']; eggo "Resultate vir ".$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. stad,z1.staat VANAF mrk m, zip z1, zip z2 WAAR m.poskode = z1.poskode EN z2.poskode = $z EN (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 ") ) of die $ (mysql_error()); while($row = mysql_fetch_array($sql)) { $store1 = $row['MktName'].""; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].”, “.$row['LocAddState'].” “.$ry['poskode']; $latitude1 = $ry['lat']; $longitude1 = $ry['lon']; $latitude2 = $ry['y1']; $longitude2 = $ry['x1']; $stad = $ry['stad']; $staat = $ry['staat']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = afstand($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ eggo “”; eggo "".$winkel.""; eggo $dis . " myle weg"; eggo ""; } else { eggo "".$store.""; eggo $dis . " myle weg"; eggo ""; } }}
my funksies.php-kode
funksie getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $theta = $longitude1 – $longitude2; $afstand = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $afstand = acos($afstand); $afstand = rad2deg($afstand); $afstand = $afstand * 60 * 1.1515; switch ($ eenheid) { geval 'Mi': breek; geval 'Km' : $afstand = $afstand * 1.609344; } terugkeer (ronde($afstand,2)); }
Dankie by voorbaat
Dankie vir hierdie artikel. Werk goed met my kode. 🙂
Hallo Douglas, goeie artikel. Ek het jou verduideliking van die geografiese konsepte en die kode baie interessant gevind. My enigste voorstel sal wees om die kode te spasieer en in te trek vir vertoon (soos Stackoverflow, byvoorbeeld). Ek verstaan dat jy spasie wil bespaar, maar konvensionele kodespasiëring / inkeping sal dit vir my, as 'n programmeerder, baie makliker maak om te lees en te dissekteer. In elk geval, dit is 'n klein dingetjie. Hou aan met die groot werk.
Dankie! Ek het die pos 'n bietjie aangepas ... maar die vergelykings neem soveel ruimte op en is so lank dat ek nie seker is dat dit te veel help nie.
Baie dankie.
hier terwyl ons met funksie gebruik, kry ons een tipe afstand.. terwyl navraag gebruik word, is dit 'n ander soort afstand
Ek sal nie die afstand tussen twee toestande bereken nie
Baie dankie vir tan hermoso codigo...
Dit was i goeie cosinus funksies. Ek ken nie wiskunde nie, maar dankie!
Goeie werk... 🙂 (y)
dit lyk vinniger (mysql 5.9) om twee keer die formule in die kies te gebruik en waar:
$formula = “(((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“.$latitude. ”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$longitude.”- `Longitude`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'KIES *, '.$formule.' as afstand VANAF tabel WHERE '..$formula.' <= '.$afstand;
dankie ...
werk nie as
"WAAR afstand"
werk as
“OM afstand te hê”
Baie dankie dat jy hierdie artikel geknip het. dit is baie nuttig.
PHP is aanvanklik geskep as 'n eenvoudige skrifplatform genaamd "Persoonlike tuisblad". Deesdae is PHP (die kort vir Hypertext Preprocessor) 'n alternatief van Microsoft se Active Server Pages (ASP) tegnologie.
PHP is 'n oopbron bediener-kant taal wat gebruik word vir die skep van dinamiese webblaaie. Dit kan in HTML ingebed word. PHP word gewoonlik saam met 'n MySQL-databasis op Linux/UNIX-webbedieners gebruik. Dit is waarskynlik die gewildste skriftaal.
Ek het gevind dat bogenoemde oplossing nie behoorlik werk nie.
Ek moet verander na:
$qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitude . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $longitude . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) as afstand VAN `register` “;
Dankie Kupendra!
dankie meneer, dit is perfek .. maar ek het een vraag as ek sonder desimale punt wil uitvoer, wat kan ek dan doen ..?
Thanks in advance.
Hallo, asseblief, ek sal regtig jou hulp hieroor nodig hê.
Ek het 'n kry versoek aan my web-bediener http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $breedtegraad
-2.23389 = $lengtegraad
en 20 = die afstand wat ek wil haal
Maar deur jou formule te gebruik, haal dit alle rye in my db op
$results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”*pi()/180)) * sin((lat*pi()/180 ))+cos((“.$latitude.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$lengtegraad.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) as afstand VANAF merkers MET afstand >= “.$afstand ));
[{"id":1,"name":"Frankie Johnnie & Luigo Too","adres":"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","adres":"790 Castro St, Mountain View, CA","lat":37.387138366699,"lng": -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”adres”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”adres”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”adres”:”619 Mountain Escuela View, CA”,,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza”,”adres”:”4546 El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”afstand”:16077.937560795},{“ id":7,"name":"Die kroeë en roosters","adres":"Whiteleystraat 24, Manchester","lat":53.485118865967,"lng":-2.1828699111938,"afstand":8038.7620112314}]
Ek wil net rye met 20 myl haal, maar dit bring alle rye. Asseblief wat doen ek verkeerd
Ek is op soek na 'n soortgelyke navraag, maar het 'n bietjie verskerp – kortliks is dit om alle koördinate binne 2 myl van elke koördinaat te groepeer en dan te tel hoeveel koördinate in elke groep en slegs een groep uit te voer wat die meeste koördinate het – selfs al jy het meer as een groep onder groepe wat die meeste koördinate het – voer eenvoudig die ewekansige groep uit van die groepe met dieselfde grootste getal –
Baie dankie vir die deel.