
Calcula ou consulta a distancia dun círculo grande entre puntos de latitude e lonxitude usando a fórmula Havesine (Exemplos PHP, JavaScript, Java, Python, MySQL, MSSQL)
Este mes estiven programando bastante PHP MySQL para GIS. Mentres investigaba o tema, custabame atopar algúns dos Cálculos xeográficos para atopar a distancia entre dúas localizacións, así que quería compartilas aquí.

A forma sinxela de calcular a distancia entre dous puntos é empregando a fórmula pitagórica para calcular a hipotenusa dun triángulo (A² + B² = C²). Isto coñécese como Distancia euclidiana.
Ese é un comezo interesante, pero non se aplica á xeografía xa que a distancia entre as liñas de latitude e lonxitude son distancias non iguais entre si. A medida que te achegas ao ecuador, as liñas de latitude vanse separando. Se usas unha ecuación de triangulación sinxela, pode medir a distancia con precisión nun lugar e incorrecta no outro debido á curvatura da Terra.
Distancia Gran Círculo
As rutas que percorreron longas distancias arredor da Terra coñécense como a Distancia do Gran Círculo. É dicir... a distancia máis curta entre dous puntos dunha esfera difire dos puntos dun mapa plano. Combínao co feito de que as liñas de latitude e lonxitude non son equidistantes... e tes un cálculo difícil.
Aquí tes unha fantástica explicación en vídeo de como funcionan os grandes círculos.
A Fórmula Haversine
A distancia que utiliza a curvatura da Terra incorpórase á fórmula de Havesine, que utiliza a trigonometría para permitir a curvatura da Terra. Cando estás atopando a distancia entre dous lugares da Terra (en liña recta), unha liña recta é en realidade un arco.
Isto é aplicable no voo aéreo. Miraches algunha vez o mapa real dos voos e observaches que están arqueados? Isto é porque voar nun arco entre dous puntos é máis curto que directamente ao lugar.
PHP: calcular a distancia entre 2 puntos de latitude e lonxitude
Aquí tes a fórmula PHP para calcular a distancia entre dous puntos (xunto coa conversión de millas a quilómetro) redondeada a dous decimais.
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));
}
As variables son:
- $Latitude1 – unha variable para a latitude da súa primeira localización.
- $Lonxitude1 – unha variable para a lonxitude da súa primeira localización
- $Latitude2 – unha variable para a latitude da súa segunda localización.
- $Lonxitude2 – unha variable para a lonxitude da súa segunda localización.
- $unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.
Java: calcula a distancia entre 2 puntos de latitude e lonxitude
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;
}
}
As variables son:
- latitude 1 – unha variable para a latitude da súa primeira localización.
- lonxitude 1 – unha variable para a lonxitude da súa primeira localización
- latitude 2 – unha variable para a latitude da súa segunda localización.
- lonxitude 2 – unha variable para a lonxitude da súa segunda localización.
- unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.
Javascript: calcula a distancia entre 2 puntos de latitude e lonxitude
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);
}
}
As variables son:
- latitude 1 – unha variable para a latitude da súa primeira localización.
- lonxitude 1 – unha variable para a lonxitude da súa primeira localización
- latitude 2 – unha variable para a latitude da súa segunda localización.
- lonxitude 2 – unha variable para a lonxitude da súa segunda localización.
- unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.
Python: calcula a distancia entre 2 puntos de latitude e lonxitude
Aquí tes a fórmula de Python para calcular a distancia entre dous puntos (xunto coa conversión de millas a quilómetros) redondeada a dous decimais. Crédito a meu fillo, Bill Karr, un científico de datos OpenINSIGHTS, para o código.
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)
As variables son:
- latitude 1 – unha variable para a súa primeira localización latitud.
- lonxitude 1 – unha variable para a súa primeira localización lonxitude
- latitude 2 – unha variable para a súa segunda localización latitud.
- lonxitude 2 – unha variable para a súa segunda localización lonxitude.
- unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.
MySQL: recuperando todos os rexistros dentro dun intervalo calculando a distancia en millas usando latitude e lonxitude
Usar tipos de datos espaciais en MySQL é un xeito máis eficiente e cómodo de traballar con datos xeográficos, incluíndo o cálculo de distancias entre puntos. MySQL admite tipos de datos espaciais como POINT
, LINESTRING
e POLYGON
, xunto con funcións espaciais como ST_Distance
.
Cando empregas o ST_Distance
función en MySQL con datos xeográficos representados como POINT
coordenadas, ten en conta a curvatura da superficie terrestre. O modelo esférico utilizado por ST_Distance
emprega a fórmula de Havesine. Esta aproximación é adecuada para a maioría dos propósitos prácticos, pero pode introducir pequenas imprecisións para distancias moi longas.
Vexa como podes calcular distancias entre dous puntos usando Tipos de datos espaciais:
- Crea unha táboa con tipo de datos espaciais: Primeiro, crea unha táboa con a
POINT
columna para almacenar puntos xeográficos. Por exemplo:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
Insira os seus puntos xeográficos nesta táboa usando o POINT
constructor:
INSERT INTO locations (name, coordinates)
VALUES
('Point A', POINT(40.7128, -74.0060)), -- New York City
('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
- Calcula a distancia usando ST_Distance: pode calcular a distancia entre dous puntos usando o
ST_Distance
función. Aquí tes un exemplo de consulta para calcular a distancia entre dous puntos:
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Substituír 1
2
cos ID dos dous puntos que quere calcular a distancia entre.
- Resultado: A consulta devolverá a distancia entre os dous puntos en millas.
Usando tipos de datos espaciais e ST_Distance
proporciona unha forma máis eficiente e precisa de traballar con datos xeográficos en MySQL. Tamén simplifica o cálculo de distancias entre puntos, facilitando a xestión e consulta dos seus datos.
MySQL: recuperando todos os rexistros dentro dun intervalo calculando a distancia en quilómetros usando a latitude e a lonxitude
Por defecto ST_Distance
devolve a distancia en metros, polo que só tes que actualizar a consulta de quilómetros:
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Distancia xeográfica de Microsoft SQL Server: STDistance
Se estás utilizando Microsoft SQL Server, ofrecen a súa propia función, Distancia ST para calcular a distancia entre dous puntos utilizando o tipo de datos Xeography.
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);
Consello de sombreiro para Manash Sahoo, vicepresidente e arquitecto de Highbridge.
Moitas grazas por compartilo. Este foi un traballo de copiar e pegar sinxelo e funciona moi ben. Aforrachesme moito tempo.
FYI para quen realice a portabilidade a C:
double deg2rad (double deg) { devolver graos*(3.14159265358979323846/180.0); }
Unha publicación moi bonita -funcionou moi ben- só tiven que cambiar o nome da mesa que sostén o lat-long. Funciona bastante rápido para.. Teño un número razoablemente pequeno de lat-longs (< 400) pero creo que isto escalaría ben. Sitio agradable tamén: acabo de engadilo á miña conta del.icio.us e volverei comprobar regularmente.
Moitas grazas Peter e Kerry! Se che gusta traballar en proxectos GIS, recoméndoche:
Moitas grazas... 😀
Busquei todo o día cálculos de distancia e atopei o algoritmo harversine, grazas a ti por dar o exemplo de como poñelo nunha declaración SQL. Grazas e saúdos, Daniel
Encantado de axudar, amigo rails!
Agora estou en busca dunha función PHP "no polígono" que tome unha matriz de coordenadas secuenciadas de latitude e lonxitude e descubra se outro punto está dentro ou fóra do polígono.
Atopei o ecuación para descubrir se un punto nun polígono!
Creo que o teu SQL necesita unha declaración have.
en lugar de WHERE distancia <= $distancia pode que necesites
use HAVING distance <= $distancia
senón grazas por aforrarme un montón de tempo e enerxía.
Ola David,
Se estás facendo algún tipo de instrución GROUP BY, necesitarás HAVING. Non o fago no exemplo anterior.
Doug
A partir de MySQL 5.x, non pode usar un alias nunha cláusula WHERE http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Use HAVING en lugar de WHERE nas consultas anteriores
Moitas grazas. Fixeches un gran traballo. Iso é o que realmente quero. Moitas grazas.
Moitas grazas por compartir este código. Aforroume moito tempo de desenvolvemento. Ademais, grazas aos teus lectores por sinalar que unha instrución HAVING é necesaria para MySQL 5.x. Moi útil.
Teño a bendición de ter lectores moito máis intelixentes ca min!
🙂
A fórmula anterior estáme aforrar moito tempo. Moitas grazas.
Tamén teño que cambiar entre o formato NMEA e os graos. Atopei unha fórmula neste URL na parte inferior da páxina. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Alguén sabe como verificar isto?
Grazas!
Harry
Ola,
Outra pregunta. Existe unha fórmula para as cadeas NMEA como a seguinte?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Grazas,
Harry
Tamén descubrín que WHERE non funcionaba para min. Cambiémolo a HAVING e todo funciona perfectamente. Ao principio non lin os comentarios e os reescribín usando unha selección aniñada. Ambos funcionarán ben.
Moitas grazas polo script escrito en mysql, só tiven que facer algúns pequenos axustes (TENDO) 🙂
Bo traballo
Incriblemente útil, moitas grazas! Estaba tendo algúns problemas co novo "HAVING", en lugar de "WHERE", pero unha vez que lin os comentarios aquí (despois de aproximadamente media hora de rechinar os dentes con frustración =P), conseguín que funcionase ben. Grazas ^_^
moitas grazas funciona moi ben
Teña en conta que unha declaración selecta como esa será moi intensa computacionalmente e, polo tanto, lenta. Se tes moitas desas consultas, podes atascar as cousas con bastante rapidez.
Un enfoque moito menos intenso é executar unha primeira selección (cruda) usando unha área CUADRADA definida por unha distancia calculada, é dicir, "select * from tablename onde a latitude entre lat1 e lat2 e lonxitude entre lon1 e lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, semellante con lon. latdiff ~= distancia / 111 (para km), ou distancia / 69 para millas xa que 1 grao de latitude é ~ 111 km (lixeira variación xa que a terra é lixeiramente oval, pero suficiente para este fin). londiff = distancia / (abs(cos(deg2rad(latitud))*111)) — ou 69 para millas (en realidade, pode tomar un cadrado un pouco máis grande para ter en conta as variacións). A continuación, tome o resultado e introdúceo na selección radial. Non esquezas ter en conta as coordenadas fóra dos límites, é dicir, o rango de lonxitude aceptable é de -180 a +180 e o rango de latitude aceptable é de -90 a +90, no caso de que o teu latdiff ou londiff estea fóra deste intervalo. . Teña en conta que na maioría dos casos isto pode non ser aplicable xa que só afecta aos cálculos sobre unha liña que atravesa o océano Pacífico de polo a polo, aínda que si cruza parte de chukotka e parte de alaska.
O que conseguimos con isto é unha redución significativa no número de puntos contra os que fai este cálculo. Se tes un millón de puntos globais na base de datos distribuídos aproximadamente de xeito uniforme e queres buscar dentro de 100 km, a túa primeira busca (rápida) é dunha área de 10000 km² e probablemente dará uns 20 resultados (baseados nunha distribución uniforme nun superficie duns 500 M² de km²), o que significa que executa o cálculo de distancia complexo 20 veces para esta consulta en lugar de un millón de veces.
Un pequeno erro no exemplo... sería para 50 km (non 100) xa que estamos mirando o "raio" do noso... cadrado.
Fantástico consello! De feito, traballei cun programador que escribiu unha función que tiraba do cadrado interior e despois unha función recursiva que facía "cadrados" ao redor do perímetro para incluír e excluír os puntos restantes. O resultado foi un resultado incriblemente rápido: podía avaliar millóns de puntos en microsegundos.
O meu enfoque anterior é definitivamente "bruto" pero capaz. Grazas de novo!
Doug,
Estiven intentando usar mysql e php para avaliar se un punto longo lat está dentro dun polígono. Sabes se o teu amigo desenvolvedor publicou algún exemplo sobre como realizar esta tarefa. Ou coñeces algún bo exemplo. Grazas de antemán.
Ola a todos, esta é a miña declaración SQL de proba:
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
e Mysql dime que a distancia, non existe como columna, podo usar orde por, podo facelo sen DONDE e funciona, pero non con ela...
Substitúe "WHERE distance" por "HAVING distance".
Funciona como un encanto, grazas, Douglas!
Isto é xenial, pero é como voan os paxaros. Sería xenial tentar incorporar a API de Google Maps a isto dalgún xeito (quizais usando estradas, etc.) Só para dar unha idea usando un medio de transporte diferente. Aínda teño que facer unha función de recocido simulado en PHP que poida ofrecer unha solución eficiente ao problema do vendedor ambulante. Pero creo que pode ser capaz de reutilizar parte do teu código para facelo.
Ola Douglas,
Moitas grazas por este artigo: aforraches moito tempo.
Cóidate,
nimrod @Israel
Bo artigo! Atopei moitos artigos que describen como calcular a distancia entre dous puntos, pero realmente estaba a buscar o fragmento de SQL.
Moitas grazas funciona ben
Moitas grazas por esta fórmula. Afeitoume algún tempo nun proxecto de localización dunha tenda que me estaba comendo.
Grazas un paquete. Esta pequena liña de código aforroume moito tempo nun proxecto de localización de tendas!
#1054 – Columna descoñecida 'distancia' na cláusula 'where'
aprobar
Igual aquí! Cal é o problema :-/? como resolver o problema da "distancia" - Columna? Axúdanos, por favor!! 🙂
Proba a usar HAVING en lugar de WHERE
2 días de investigación para atopar por fin esta páxina que soluciona o meu problema. Parece que é mellor que saque o meu WolframAlpha e repase as miñas matemáticas. O cambio de WHERE a HAVING ten o meu guión en funcionamento. GRAZAS
en lugar de usar a cláusula WHERE:
TER distancia < 50
Grazas Georgi. Seguín recibindo a columna "distancia" que non se atopaba. Unha vez que cambie o ONDE a TER funcionou como un encanto!
Gustaríame que esta fose a primeira páxina que atopei sobre isto. Despois de probar moitos comandos diferentes, este foi o único que funcionou correctamente, e con cambios mínimos necesarios para adaptarse á miña propia base de datos.
Moitas grazas!
Gustaríame que esta fose a primeira páxina que atopei sobre isto. Despois de probar moitos comandos diferentes, este foi o único que funcionou correctamente, e con cambios mínimos necesarios para adaptarse á miña propia base de datos.
Moitas grazas!
Moitas grazas!
Moitas grazas!
Creo que xa non aparece o código. Quizais sexa firefox?
Acabo de probar tanto en Firefox como en Chrome e está a aparecer. Tentar de novo?
Ola. Moitas grazas. Isto funciona como un encanto.
Moitas grazas Douglas. Isto está funcionando perfecto.
Sei que esta fórmula funciona, pero non podo ver onde se ten en conta o radio da terra. Alguén pode iluminarme, por favor?
Tim, para unha explicación completa da fórmula de Havesine (non é código), consulta o artigo da Wikipedia: http://en.wikipedia.org/wiki/Haversine_formula
Fermoso! Isto axudoume inmensamente!
Grandes cousas Douglas. Tentaches obter o punto de intersección dado o Long/Lat/Bearing de dous puntos?
Aínda non o fixen, Khanh!
Grazas Douglas, a consulta SQL é exactamente o que necesitaba e pensei que tería que escribila eu. Salváchesme de posibles horas de curva de aprendizaxe de latitude e lonxitude!
Sigo recibindo mensaxe de erro: columna descoñecida "Distancia" na "cláusula onde" na consulta de MySQL.
Peter, lea os outros comentarios. Parece que algunhas persoas tiveron que usar unha sintaxe diferente para WHERE/HAVING.
Grazas por este gran artigo! Acabo de probar o código na miña base de datos e funcionou moi ben.
Douglas, grazas por este incrible código. Estiven pensando como facelo no meu portal da comunidade GPS. Aforrachesme horas.
Encantado de escoitar, Ash!
grazas por publicar este útil artigo,
pero por algún motivo gustaríame preguntar
como obter a distancia entre as coordenadas dentro de mysql db e as coordenadas inseridas en php polo usuario?
para describir con máis claridade:
1. o usuario ten que inserir [id] para seleccionar os datos especificados de db e as coordenadas do propio usuario
2. O ficheiro php obtén os datos de destino (coords) usando [id] e despois calcula a distancia entre o usuario e o punto de destino
ou simplemente podes distanciar do seguinte código?
$qry = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“. $latitude.”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$lonxitude.”- `Lonxitude`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) como distancia FROM `MyTable` WHERE distancia >= “.$distancia”. >>>>podo “sacar” a distancia dende aquí?
grazas de novo,
Timmy S
non importa, descubrín como funciona a "función" en php
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
moitas grazas!!
ok, todo o que probei non funciona. Quero dicir, o que teño funciona, pero as distancias están moi afastadas.
Alguén podería ver o que está mal con este código?
if(isset($_POST['enviado'])){ $z = $_POST['código postal']; $r = $_POST['raio']; echo “Resultados para “.$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. cidade,z1.estado FROM mrk m, zip z1, zip z2 WHERE 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 ) ) ) ou <= $e ") (mysql_error()); while($fila = mysql_fetch_array($sql)) { $store1 = $fila['MktName']."”; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].”, “.$row['LocAddState']”. “.$fila['código postal']; $latitude1 = $fila['lat']; $longitude1 = $fila['lon']; $latitude2 = $fila ['y1']; $lonxitude2 = $fila['x1']; $cidade = $fila['cidade']; $estado = $fila['estado']; $dis = getnew($latitude1, $lonxitude1, $latitude2, $lonxitude2, $unidade = 'Mi'); // $dis = distancia($lat1, $lon1, $lat2, $lon2); $verificado = $fila['verificado']; if($verificado == '1'){ echo “”; echo “”.$tenda.””; echo $dis . ” milla(s) de distancia”; eco ""; } else { echo “”.$tenda.””; echo $dis . ” milla(s) de distancia”; eco ""; } }}
o meu código functions.php
función getnew($latitude1, $lonxitude1, $latitude2, $lonxitude2, $unidade = 'Mi') { $theta = $lonxitude1 – $lonxitude2; $distancia = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $distancia = acos($distancia); $distancia = rad2deg($distancia); $distancia = $distancia * 60 * 1.1515; switch($unidade) { case 'Mi': break; caso 'Km' : $distancia = $distancia * 1.609344; } retorno (redondo($distancia,2)); }
Grazas anticipadamente
Grazas por este artigo. Funcionando ben co meu código. 🙂
Ola Douglas, excelente artigo. Pareceume moi interesante a túa explicación dos conceptos xeográficos e do código. A miña única suxestión sería espaciar e sangrar o código para mostrar (como Stackoverflow, por exemplo). Entendo que queres aforrar espazo, pero o espaciado/sangrado de código convencional facilitaríame moito, como programador, a lectura e a disección. De todos os xeitos, iso é unha pequena cousa. Sigue co gran traballo.
Grazas! Modifiquei un pouco a publicación... pero as ecuacións ocupan tanto espazo e son tan longas que non estou seguro de que axude demasiado.
Moitas grazas.
aquí mentres usamos a función conseguimos un tipo de distancia.. mentres usamos a consulta é outro tipo de distancia
Non vou calcular a distancia entre dous estados
Moitas grazas por tan hermoso codigo…
Son boas funcións cosinus. Non sei matemáticas, pero grazas!
Gran traballo... 🙂 (y)
Parece máis rápido (mysql 5.9) usar o dobre da fórmula na selección e onde:
$fórmula = “(((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“.$latitude. ”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$lonxitude.”- `Lonxitude`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'SELECT *, '.$fórmula.' como distancia FROM a táboa WHERE '..$formula.' <= '.$distancia;
grazas ...
non funciona se
"ONDE distancia"
traballando se
“TER distancia”
Moitas grazas por escoitar este artigo. É moi útil.
PHP creouse nun principio como unha plataforma de script sinxela chamada "Páxina de inicio persoal". Hoxe en día PHP (a abreviatura de Hypertext Preprocessor) é unha alternativa á tecnoloxía ASP (Active Server Pages) de Microsoft.
PHP é unha linguaxe de código aberto no lado do servidor que se usa para crear páxinas web dinámicas. Pódese incrustar en HTML. PHP úsase normalmente xunto cunha base de datos MySQL en servidores web Linux/UNIX. Probablemente sexa a linguaxe de script máis popular.
Atopei que a solución anterior non funcionaba correctamente.
Necesito cambiar a:
$qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitude . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $lonxitude . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) como distancia FROM `register` “;
Grazas Kupendra!
grazas señor funcionando perfectamente.. pero teño unha pregunta se quero saír sen coma decimal, entón que podo facer..?
Grazas anticipadamente.
Ola, realmente necesitarei a túa axuda nisto.
Fixen unha solicitude de obtención ao meu servidor web
53.47792 = $latitude
-2.23389 = $lonxitude
e 20 = a distancia que quero recuperar
Non obstante, usando a túa fórmula, recupera todas as filas da miña base de datos
$resultados = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude”)).pi()/180)) * sin((latpi()/180))+cos((“.$latitude.”pi()/180)) * cos((latpi()/180)) * cos(((“.$lonxitude.”- lng)pi()/180))))180/pi())601.1515*1.609344) como distancia DOS marcadores 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, ”distancia”:16079.294719663},{“id”:2,”nome”:”Amici's East Coast Pizzeria”,”enderezo”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”enderezo”:”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,”distancia”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”enderezo”:”619 Escuela Ave, Mountain” View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza”,”enderezo”:”4546” El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”distancia”:16077.937560795},{“ id”:7,”name”:”Os bares e as parrillas”,”enderezo”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”distancia”:8038.7620112314}]
Quero recuperar só filas con 20 millas, pero trae todas as filas. Por favor, que estou facendo mal
Estou buscando unha consulta similar, pero intensifico un pouco: en resumo, trátase de agrupar todas as coordenadas dentro de 2 millas de cada coordenada e despois contar cantas coordenadas en cada grupo e producir só un grupo que teña máis coordenadas, aínda que tes máis dun grupo entre os grupos que teñen o maior número de coordenadas - simplemente saca o grupo aleatorio dos grupos co mesmo número -
Moitas grazas por compartir.