
Calculeu o consulteu una gran distància de cercle entre punts de latitud i longitud mitjançant la fórmula Havesine (exemples PHP, JavaScript, Java, Python, MySQL, MSSQL)
Aquest mes he estat programant una mica en PHP i MySQL respecte a GIS. Mirant per la xarxa, em va costar trobar-ne alguns Càlculs geogràfics per trobar la distància entre dues ubicacions, així que volia compartir-les aquí.

La forma senzilla de calcular la distància entre dos punts és utilitzar la fórmula pitagòrica per calcular la hipotenusa d’un triangle (A² + B² = C²). Això es coneix com el Distància euclidiana.
Aquest és un començament interessant, però no s'aplica a la geografia, ja que la distància entre les línies de latitud i longitud no són distàncies iguals entre si. A mesura que t'acostes a l'equador, les línies de latitud s'allunyen més. Si utilitzeu una equació de triangulació senzilla, pot mesurar la distància amb precisió en una ubicació i incorrecta en l'altra, a causa de la curvatura de la Terra.
Distància Gran Cercle
Les rutes recorregudes llargues distàncies al voltant de la Terra es coneixen com la Distància del Gran Cercle. És a dir... la distància més curta entre dos punts d'una esfera difereix dels punts d'un mapa pla. Combineu-ho amb el fet que les línies de latitud i longitud no són equidistants... i teniu un càlcul difícil.
Aquí teniu una fantàstica explicació en vídeo de com funcionen els grans cercles.
La Fórmula Haversine
La distància utilitzant la curvatura de la Terra s'incorpora a la fórmula Havesine, que utilitza la trigonometria per permetre la curvatura de la Terra. Quan trobeu la distància entre 2 llocs de la terra (en línia recta), una línia recta és en realitat un arc.
Això és aplicable al vol aeri. Alguna vegada has mirat el mapa real dels vols i has notat que estan arquejats? Això és perquè volar en un arc entre dos punts és més curt que directament a la ubicació.
PHP: Calculeu la distància entre 2 punts de latitud i longitud
Aquí teniu la fórmula PHP per calcular la distància entre dos punts (juntament amb la conversió de milla en quilòmetre) arrodonida a dos decimals.
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));
}
Les variables són:
- $Latitude1 – una variable per a la latitud de la vostra primera ubicació.
- $Longitud1 – una variable per a la longitud de la vostra primera ubicació
- $Latitude2 – una variable per a la latitud de la vostra segona ubicació.
- $Longitud2 – una variable per a la longitud de la vostra segona ubicació.
- $unitat - el ser per defecte milles. Això es pot actualitzar o passar com a quilòmetres.
Java: calcula la distància entre 2 punts de latitud i longitud
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;
}
}
Les variables són:
- latitud 1 – una variable per a la latitud de la vostra primera ubicació.
- longitud 1 – una variable per a la longitud de la vostra primera ubicació
- latitud 2 – una variable per a la latitud de la vostra segona ubicació.
- longitud 2 – una variable per a la longitud de la vostra segona ubicació.
- unitat - el ser per defecte milles. Això es pot actualitzar o passar com a quilòmetres.
Javascript: calcula la distància entre 2 punts de latitud i longitud
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);
}
}
Les variables són:
- latitud 1 – una variable per a la latitud de la vostra primera ubicació.
- longitud 1 – una variable per a la longitud de la vostra primera ubicació
- latitud 2 – una variable per a la latitud de la vostra segona ubicació.
- longitud 2 – una variable per a la longitud de la vostra segona ubicació.
- unitat - el ser per defecte milles. Això es pot actualitzar o passar com a quilòmetres.
Python: calcula la distància entre 2 punts de latitud i longitud
De totes maneres, aquí teniu la fórmula de Python per calcular la distància entre dos punts (juntament amb la conversió de milla a quilòmetre) arrodonida a dos decimals. Crèdit al meu fill, Bill Karr, que és un científic de dades OpenINSIGHTS, pel codi.
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)
Les variables són:
- latitud 1 – una variable per a la vostra primera ubicació latitud.
- longitud 1 – una variable per a la vostra primera ubicació longitud
- latitud 2 – una variable per a la vostra segona ubicació latitud.
- longitud 2 – una variable per a la vostra segona ubicació longitud.
- unitat - el ser per defecte milles. Això es pot actualitzar o passar com a quilòmetres.
MySQL: recuperant tots els registres dins d'un rang calculant la distància en milles amb latitud i longitud
També és possible utilitzar SQL per calcular tots els registres dins d'una distància específica. En aquest exemple, vaig a consultar MyTable a MySQL per trobar tots els registres que siguin menors o iguals a la variable $distancia (en milles) a la meva ubicació a $latitud i $longitud:
La consulta per recuperar tots els registres d'un determinat document distància calculant la distància en milles entre dos punts de latitud i longitud són:
$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."
Haureu de personalitzar això:
- $ longitud - Aquesta és una variable PHP on estic passant la longitud del punt.
- $ latitud - Aquesta és una variable PHP on estic passant la longitud del punt.
- $ distància - aquesta és la distància a la qual voldríeu trobar tots els registres menys o iguals.
- taula - aquesta és la taula ... voldreu substituir-la pel nom de la vostra taula.
- latitud - aquest és el camp de la vostra latitud.
- longitud - aquest és el camp de la vostra longitud.
MySQL: recuperant tots els registres dins d'un rang calculant la distància en quilòmetres utilitzant latitud i longitud
I aquí teniu la consulta SQL que utilitza quilòmetres a 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."
Haureu de personalitzar això:
- $ longitud - Aquesta és una variable PHP on estic passant la longitud del punt.
- $ latitud - Aquesta és una variable PHP on estic passant la longitud del punt.
- $ distància - aquesta és la distància a la qual voldríeu trobar tots els registres menys o iguals.
- taula - aquesta és la taula ... voldreu substituir-la pel nom de la vostra taula.
- latitud - aquest és el camp de la vostra latitud.
- longitud - aquest és el camp de la vostra longitud.
He utilitzat aquest codi en una plataforma de mapes empresarials que hem utilitzat per a una botiga minorista amb més de 1,000 ubicacions a tota Amèrica del Nord i ha funcionat molt bé.
Distància geogràfica de Microsoft SQL Server: STDistance
Si utilitzeu Microsoft SQL Server, ofereixen la seva pròpia funció, STDistance per calcular la distància entre dos punts mitjançant el tipus de dades Geography.
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);
Punta de barret a Manash Sahoo, vicepresident i arquitecte de Highbridge.
Moltes gràcies per compartir. Aquesta va ser una tasca fàcil de copiar i enganxar i funciona molt bé. M'has estalviat molt de temps.
Per a qualsevol persona que porti a C:
double deg2rad (doble grau) { retorn deg* (3.14159265358979323846/180.0); }
Una publicació molt bonica - va funcionar molt bé - només vaig haver de canviar el nom de la taula que sostenia el lat-long. Funciona bastant ràpid per... Tinc un nombre raonablement petit de lat-longs (< 400), però crec que això s'escalaria bé. Un lloc agradable també: l'acabo d'afegir al meu compte del.icio.us i tornaré a comprovar-ho regularment.
Moltes gràcies Peter i Kerry! Si t'agrada treballar en projectes GIS, et recomano:
Moltes gràcies... 😀
Vaig buscar durant tot el dia els càlculs de la distància i vaig trobar l'algoritme harversine, gràcies a vosaltres per donar l'exemple de com posar-lo en una instrucció SQL. Gràcies i salutacions, Daniel
Encantat d'ajudar, amic rails!
Ara estic a la recerca d'una funció PHP "al polígon" que prendrà una sèrie de coordenades de latitud i longitud seqüenciades i esbrinarà si un altre punt es troba dins o fora del polígon.
Vaig trobar el equació per esbrinar si un punt d'un polígon!
Crec que el vostre SQL necessita una declaració havent.
en lloc de WHERE distància <= $distància que potser necessiteu
utilitzeu HAVING distance <= $distance
en cas contrari gràcies per estalviar-me un munt de temps i energia.
Hola David,
Si esteu fent qualsevol tipus de declaració GROUP BY, necessitareu HAVING. No ho faig a l'exemple anterior.
Doug
A partir de MySQL 5.x, no podeu utilitzar un àlies en una clàusula WHERE http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Utilitzeu HAVING en lloc de WHERE a les consultes anteriors
Moltes gràcies. Heu fet una gran feina, això és el que realment vull. Moltes gràcies.
Moltes gràcies per compartir aquest codi. Em va estalviar molt temps de desenvolupament. A més, gràcies als vostres lectors per assenyalar que una instrucció HAVING és necessària per a MySQL 5.x. Molt util.
Estic afortunat de tenir lectors molt més intel·ligents que jo!
🙂
La fórmula anterior m'està estalviant molt de temps. Moltes gràcies.
També he de canviar entre el format NMEA i els graus. He trobat una fórmula en aquest URL a la part inferior de la pàgina. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Algú sap com comprovar-ho?
Gràcies!
Harry
Hola,
Una altra pregunta. Hi ha una fórmula per a les cadenes NMEA com la següent?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Gràcies,
Harry
També vaig trobar que WHERE no em funcionava. Ho hem canviat a HAVING i tot funciona perfectament. Al principi no vaig llegir els comentaris i els vaig reescriure amb una selecció imbricada. Tots dos funcionaran bé.
Moltes gràcies per l'script escrit en mysql, només havia de fer alguns ajustos menors (TENIR) 🙂
Gran feina
Increïblement útil, moltes gràcies! Estava tenint alguns problemes amb el nou "TENIR", en lloc de "ON", però un cop vaig llegir els comentaris aquí (després d'aproximadament mitja hora d'esquerre les dents de frustració =P), ho vaig fer funcionar bé. Gràcies ^_^
moltes gràcies funciona molt bé
Tingueu en compte que una declaració seleccionada com aquesta serà molt computacionalment intensa i, per tant, lenta. Si teniu moltes d'aquestes consultes, les coses poden empantanar-se amb força rapidesa.
Un enfocament molt menys intens és executar una primera selecció (crua) utilitzant una àrea QUADRADA definida per una distància calculada, és a dir, "seleccionar * del nom de la taula on la latitud entre lat1 i lat2 i la longitud entre lon1 i lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, semblant amb lon. latdiff ~= distància / 111 (per km), o distància / 69 per milles, ja que 1 grau de latitud és ~ 111 km (lleu variació ja que la terra és lleugerament ovalada, però suficient per a aquest propòsit). londiff = distància / (abs (cos (deg2rad (latitud)) * 111)) — o 69 per milles (en realitat podeu agafar un quadrat una mica més gran per tenir en compte les variacions). A continuació, agafeu el resultat i introduïu-lo a la selecció radial. No oblideu tenir en compte les coordenades fora dels límits, és a dir, el rang de longitud acceptable és de -180 a +180 i el rang de latitud acceptable és de -90 a +90, en cas que el vostre latdiff o londiff estigui fora d'aquest rang. . Tingueu en compte que en la majoria dels casos això pot no ser aplicable, ja que només afecta els càlculs sobre una línia a través de l'oceà Pacífic de pol a pol, tot i que talla part de Chukotka i part d'Alaska.
El que aconseguim amb això és una reducció significativa del nombre de punts contra els quals feu aquest càlcul. Si teniu un milió de punts globals a la base de dades distribuïts aproximadament de manera uniforme i voleu cercar en un termini de 100 km, la vostra primera cerca (ràpida) és d'una àrea de 10000 km quadrats i probablement donarà uns 20 resultats (basats en una distribució uniforme en un superfície d'uns 500 milions de km²), el que significa que s'executa el complex càlcul de la distància 20 vegades per a aquesta consulta en lloc d'un milió de vegades.
Petit error en l'exemple... això seria per a 50 km (no 100) ja que estem mirant el "radi" de la nostra... plaça.
Un consell fantàstic! De fet, vaig treballar amb un desenvolupador que va escriure una funció que estirava el quadrat interior i després una funció recursiva que feia "quadrats" al voltant del perímetre per incloure i excloure els punts restants. El resultat va ser un resultat increïblement ràpid: podia avaluar milions de punts en microsegons.
El meu enfocament anterior és definitivament "cru", però capaç. Gràcies de nou!
Doug,
He estat intentant utilitzar mysql i php per avaluar si un punt llarg lat es troba dins d'un polígon. Saps si el teu amic desenvolupador va publicar algun exemple sobre com realitzar aquesta tasca. O coneixeu algun bon exemple. Gràcies per endavant.
Hola a tots, aquesta és la meva declaració SQL de prova:
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
i Mysql em diu que la distància, no existeix com a columna, puc utilitzar l'ordre per, ho puc fer sense ON, i funciona, però no amb ella...
Substituïu "WHERE distance" per "HAVING distance".
Funciona com un encant, gràcies, Douglas!
Això és fantàstic, però és igual que els ocells volen. Seria fantàstic provar d'incorporar l'API de Google Maps a això d'alguna manera (potser utilitzant carreteres, etc.) Només per donar-nos una idea amb una forma de transport diferent. Encara he de fer una funció de recuit simulada en PHP que pugui oferir una solució eficient al problema del venedor ambulant. Però crec que potser podré reutilitzar part del vostre codi per fer-ho.
Hola Douglas,
Moltes gràcies per aquest article, m'heu estalviat molt de temps.
cuidar,
nimrod @Israel
Bon article! Vaig trobar molts articles que descriuen com calcular la distància entre dos punts, però realment estava buscant el fragment SQL.
Moltes gràcies funciona bé
Moltes gràcies per aquesta fórmula. Em va afaitar una mica de temps en un projecte d'ubicació de botiga que em menjava.
Gràcies un paquet. Aquesta petita línia de codi em va estalviar un temps considerable en un projecte d'ubicació de botiga!
#1054 – Columna desconeguda "distància" a la "clàusula on"
aprovar
El mateix aquí! Quin és el problema :-/? com resoldre el problema de la "distància" - columna? Ajuda'ns, si us plau!! 🙂
Proveu d'utilitzar HAVING en lloc de ON
2 dies d'investigació per trobar finalment aquesta pàgina que resol el meu problema. Sembla que és millor que tregui el meu WolframAlpha i repassi les meves matemàtiques. El canvi de ON a HAVING té el meu script en ordre de funcionament. GRÀCIES
en comptes d'utilitzar la clàusula WHERE:
TENIR distància < 50
Gràcies Georgi. No s'ha trobat la columna "distància". Una vegada que canvio el ON per TENIR, va funcionar com un encant!
M'agradaria que aquesta fos la primera pàgina que trobés sobre això. Després d'haver provat moltes ordres diferents, aquesta va ser l'única que va funcionar correctament i amb canvis mínims necessaris per adaptar-se a la meva pròpia base de dades.
Moltes gràcies!
M'agradaria que aquesta fos la primera pàgina que trobés sobre això. Després d'haver provat moltes ordres diferents, aquesta va ser l'única que va funcionar correctament i amb canvis mínims necessaris per adaptar-se a la meva pròpia base de dades.
Moltes gràcies!
Moltes gràcies!
Moltes gràcies!
No crec que el codi aparegui més. Potser és Firefox?
Acabo de provar tant a Firefox com a Chrome i està apareixent. Torna-ho a provar?
Hola. Moltes gràcies. Això funciona com un encant.
Moltes gràcies Douglas. Això funciona perfectament.
Sé que aquesta fórmula funciona, però no veig on es té en compte el radi de la terra. Algú em pot il·luminar, si us plau?
Tim, per obtenir una explicació completa de la fórmula de Havesine (no és codi), consulta l'article de la Viquipèdia: http://en.wikipedia.org/wiki/Haversine_formula
Bonic! Això m’ha ajudat moltíssim!
Grans coses Douglas. Heu provat d'obtenir el punt d'intersecció donat el Long/Lat/Bearing de dos punts?
Encara no ho he fet, Khanh!
Gràcies Douglas, la consulta SQL és exactament el que necessitava i vaig pensar que l'hauria d'escriure jo mateix. M'has estalviat possiblement hores de corba d'aprenentatge latitud longitud!
Continuo rebent missatge d'error: columna desconeguda "Distància" a "clàusula on" a la consulta MySQL.
Pere, si us plau, llegiu els altres comentaris. Sembla que algunes persones van haver d'utilitzar una sintaxi diferent per ON/TENIR.
Gràcies per aquest gran article! Acabo de provar el codi a la meva base de dades i va funcionar molt bé!
Douglas, gràcies per aquest codi increïble. M'he estat trencant el cap sobre com fer-ho al meu portal de la comunitat GPS. M'has estalviat hores.
Genial escoltar-ho, Ash!
gràcies per publicar aquest article útil,
però per alguna raó m'agradaria preguntar
Com obtenir la distància entre les coordenades dins de mysql db i les coordenades inserides a php per l'usuari?
per descriure amb més claredat:
1.l'usuari ha d'inserir [id] per seleccionar les dades especificades de la base de dades i les coordenades del propi usuari
2. El fitxer php obté les dades de destinació (coords) mitjançant [id] i després calcula la distància entre l'usuari i el punt de destinació
o simplement podeu obtenir distància del codi següent?
$qry = “SELECT *,(((acos(sin((“.$latitud.”*pi()/180)) * sin((`Latitud`*pi()/180))+cos((“. $latitud.”*pi()/180)) * cos((`Latitud`*pi()/180)) * cos(((“.$longitud.”- `Longitud`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) com a distància FROM `MyTable` WHERE distància >= ".$distance". >>>>Puc "treure" la distància des d'aquí?
gràcies de nou,
Timmy S
No importa, he esbrinat com funciona la "funció" a PHP
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
moltes gràcies!!
d'acord, tot el que he provat no funciona. Vull dir, el que tinc funciona, però les distàncies són molt allunyades.
Algú podria veure què passa amb aquest codi?
if(isset($_POST['enviat'])){ $z = $_POST['codi postal']; $r = $_POST['radi']; echo “Resultats per a “.$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 FROM mrk m, zip z1, zip z2 ON m.zipcode = z1.zipcode AND z2.zipcode = $z AND (3963 * acos( truncate( sin( z2.lat / 57.2958 ) * sin( m. y1 / 57.2958 ) + cos( z2.lat / 57.2958 ) * cos ( m.y1 / 57.2958 ) * cos ( m.x1 / 57.2958 – z2.lon / 57.2958 ) , 8 ) ) ) o <= $e ") (mysql_error()); while($fila = mysql_fetch_array($sql)) { $store1 = $fila['MktName']."”; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].”, “.$row['LocAddState']”. “.$fila['codi postal']; $latitud1 = $fila['lat']; $longitud1 = $fila['lon']; $latitud2 = $fila['y1']; $longitud2 = $fila['x1']; $ciutat = $fila['ciutat']; $estat = $fila['estat']; $dis = getnew($latitud1, $longitud1, $latitud2, $longitud2, $unitat = 'Mi'); // $dis = distància($lat1, $lon1, $lat2, $lon2); $verificat = $fila['verificat']; if($verificat == '1'){ echo “”; echo “”.$botiga.””; echo $dis . " molt lluny"; eco ""; } else { echo “”.$magatzem.””; echo $dis . " molt lluny"; eco ""; } }}
el meu codi functions.php
funció getnew($latitud1, $longitud1, $latitud2, $longitud2, $unitat = 'Mi') { $theta = $longitud1 – $longitud2; $distància = (sin(deg2rad($latitud1)) * sin(deg2rad($latitud2))) + (cos(deg2rad($latitud1)) * cos(deg2rad($latitud2)) * cos(deg2rad($theta)) ); $distància = acos($distància); $distància = rad2deg($distància); $distància = $distància * 60 * 1.1515; switch($unitat) { cas 'Mi': break; cas 'Km' : $distància = $distància * 1.609344; } retorn (rodona($distància,2)); }
Gràcies per endavant
Gràcies per aquest article. Funciona bé amb el meu codi. 🙂
Hola Douglas, gran article. He trobat molt interessant la teva explicació dels conceptes geogràfics i del codi. El meu únic suggeriment seria espaiar i sagnar el codi per mostrar-lo (com Stackoverflow, per exemple). Entenc que voleu estalviar espai, però l'espaiat / sagnat de codi convencional em faria molt més fàcil, com a programador, llegir i disseccionar. De totes maneres, això és poca cosa. Continua amb la gran feina.
Gràcies! He modificat una mica la publicació... però les equacions ocupen tant espai i són tan llargues que no estic segur que ajudi massa.
Moltes gràcies.
aquí mentre utilitzem amb la funció estem obtenint un tipus de distància... mentre que utilitzeu la consulta, ve un altre tipus de distància
No calcularé la distància entre dos estats
Moltes gràcies per tan hermoso codigo...
Aquestes són bones funcions de cosinus. No sé matemàtiques, però gràcies!
Gran feina... 🙂 (i)
sembla més ràpid (mysql 5.9) utilitzar el doble de la fórmula a la selecció i on:
$fórmula = “(((acos(sin((“.$latitud.”*pi()/180)) * sin((`Latitud`*pi()/180))+cos(((“.$latitud. ”*pi()/180)) * cos((`Latitud`*pi()/180)) * cos(((“.$longitud.”- `Longitud`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'SELECT *, '.$formula.' com a distància de la taula WHERE '..$formula.' <= '.$distància;
gràcies ...
no funciona si
"ON distància"
treballant si
“TENIR distància”
Moltes gràcies per escoltar aquest article. És molt útil.
PHP es va crear al principi com una plataforma de scripts senzilla anomenada "Pàgina d'inici personal". Avui en dia, PHP (abreviatura de Hypertext Preprocessor) és una alternativa a la tecnologia Active Server Pages (ASP) de Microsoft.
PHP és un llenguatge de codi obert del costat del servidor que s'utilitza per crear pàgines web dinàmiques. Es pot incrustar en HTML. PHP s'utilitza normalment juntament amb una base de dades MySQL en servidors web Linux/UNIX. És probablement el llenguatge de script més popular.
Vaig trobar que la solució anterior no funcionava correctament.
He de canviar a:
$qqq = “SELECT *,(((acos(sin((“.$latitud.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitud . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $longitud . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) com a distància FROM `registre` “;
Gràcies Kupendra!
gràcies senyor treballant perfectament.. però tinc una pregunta si vull sortir sense coma decimal, què puc fer...?
Gràcies per endavant.
Hola, si us plau, necessitaré la vostra ajuda en això.
Vaig fer una sol·licitud d'obtenció al meu servidor web http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $latitud
-2.23389 = $longitud
i 20 = la distància que vull recuperar
Tanmateix, utilitzant la vostra fórmula, recupera totes les files del meu DB
$resultats = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”*pi()/180)) * sin((lat*pi()/180) ))+cos((“.$latitud.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$longitud.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) com a distància DES dels marcadors HAVING distance >= “.$distance ));
[{“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 Escuela Ave, Mountain 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,”distància”:16077.937560795},{“ id”:7,”name”:”Els bars i graelles”,”adreça”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”distància”:8038.7620112314}]
Vull recuperar només files amb 20 milles, però aporta totes les files. Si us plau, què estic fent malament
Estic buscant una consulta similar, però he augmentat una mica: en resum, es tracta d'agrupar totes les coordenades a 2 milles de cada coordenada i després comptar quantes coordenades a cada grup i sortir només un grup que tingui més coordenades, fins i tot si tens més d'un grup entre els grups que tenen el major nombre de coordenades; simplement emet el grup aleatori dels grups amb el mateix nombre més gran;
Moltes gràcies per compartir.