Foros del Web » Programando para Internet » PHP »

Calculo de distancia entre dos puntos

Estas en el tema de Calculo de distancia entre dos puntos en el foro de PHP en Foros del Web. que mas amigos, espero esten bien, les escribo por lo siguiente: Necesito calcular la distancia entre dos puntos dadas sus coordenadas geograficas, lo estoy trabajando ...
  #1 (permalink)  
Antiguo 31/05/2012, 07:08
Avatar de Bullet  
Fecha de Ingreso: agosto-2005
Ubicación: Margarita, Venezuela
Mensajes: 235
Antigüedad: 18 años, 8 meses
Puntos: 1
Calculo de distancia entre dos puntos

que mas amigos, espero esten bien, les escribo por lo siguiente:

Necesito calcular la distancia entre dos puntos dadas sus coordenadas geograficas, lo estoy trabajando de a siguiente manera: ingreso las coordenadas de un punto en formato de latitud y longitud, el sistema me hace la conversion a formato decimal, y este ingresa todos los datos en los dos formatos en una tabla llamada "posiciones", luego extraigo todos los datos conforme los voy ingresando y los muestro en una tabla debajo del formulario,esta tabla contiene una columna al final donde se va a mostrar la distancia calculada entre los dos puntos, hasta ahi todo bien; luego para hacer los calculos de distancia, selecciono solo las coordenadas en formato decimal, y las asigno a 4 variables, dado que son 4 datos para poder aplicar la formula, el calculo lo hice de dos formas:

1ra forma: Aplique la siguiente consulta:

Código:
$d= mysql_query("SELECT (acos(sin(radians(l1)) * sin(radians(l2)) + cos(radians(l1)) * cos(radians(l2)) * cos(radians(lo1) - radians(lo2))) * 6378) as distp1p2 FROM posiciones_dist");
$dis=mysql_fetch_assoc($d);
$dist=($dis['distp1p2']);
el resultado me lo da para el primer registro, pero luego lo que hace es repetirme el mismo valor en todas las columnas..

2da forma: Aplique la siguiente formula:

Código:
$dist = acos(sin($g) * sin($h) + cos($g) + cos($h) * cos($i) - $j) * $earth;
el resultado fue que me mostraba un "NAN" en cada columna, supongo que es algun valor no determinado..

los 2 script que estoy usando son los siguientes.:

lat_long.php

Código PHP:
<?php
require_once('librerias/config.php');
$earth 6378;
$querys "SELECT * FROM posiciones_dist ORDER BY id DESC limit 5";
$que mysql_query($querys);
$e mysql_query('SELECT l1,l2,lo1,lo2 FROM  posiciones_dist order by id desc limit 1');
$f mysql_fetch_assoc($e);//Arreglo que guarda los valores de la consulta
$g = ($f['l1']);
$h = ($f['l2']);
$i = ($f['lo1']);
$j = ($f['lo2']);

$dist acos(sin($g) * sin($h) + cos($g) + cos($h) * cos($i) - $j) * $earth;
/*$d= mysql_query("SELECT (acos(sin(radians(l1)) * sin(radians(l2)) + cos(radians(l1)) * cos(radians(l2)) * cos(radians(lo1) - radians(lo2))) * 6378) as distp1p2 FROM posiciones_dist");
$dis=mysql_fetch_assoc($d);
$dist=($dis['distp1p2']);*/

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="css/cuscosky.css">
<title>Documento sin t&iacute;tulo</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="dist.php">
  <p>Latitud 1:
    <input type="text" name="l1" id="l1" onkeyup="latitud(this.value)" />
    <input type="text" name="ld1" id="ld1"  readonly="readonly"/>
  Longitud 1:
    <input type="text" name="lo1" id="lo1" onkeyup="longitud(this.value)" />
    <input type="text" name="lod1" id="lod1" readonly="readonly"/>
  </p>
  <p>Latitud 2:
    <input type="text" name="l2" id="l2" onkeyup="latitud2(this.value)" />
    <input type="text" name="ld2" id="l4" readonly="readonly"/>
  Longitud 2:
    <input type="text" name="lo2" id="lo2" onkeyup="longitud2(this.value)" />
    <input type="text" name="lod2" id="lo4" readonly="readonly"/></p>
  <p>
    <input type="submit" name="enviar" id="enviar" value="Enviar" />
  </p>
</form>
<table align="center" summary="Tabla de ejemplo">
  <caption>
    LATITUDES Y LONGITUDES
  </caption>
  <thead>
    <tr class="Estilo5">
      <th>LATIDUD1</th>
      <th>LATITUD_D1</th>
      <th>LATITUD2</th>
      <th>LATITUD_D2</th>
      <th>LONGITUD1</th>
      <th>LONGITUD_D1</th>
      <th>LONGITUD2</th>
      <th>LONGITUD_D2</th>
      <th>DISTANCIA</th>
     </tr>
  </thead>
  <tbody>
    <?php while ($rs mysql_fetch_assoc($que)) { ?>
    <tr class="Estilo7">
      <td><?php echo $rs['lat1']; ?></td>
      <td><?php echo $rs['l1']; ?></td>
      <td><?php echo $rs['lat2']; ?></td>
      <td><?php echo $rs['l2']; ?></td>
      <td><?php echo $rs['long1']; ?></td>
      <td><?php echo $rs['lo1']; ?></td>
      <td><?php echo $rs['long2']; ?></td>
      <td><?php echo $rs['lo2']; ?></td>
      <td><?php echo $dist?></td>
     </tr>
    <?php }  ?>
  </tbody>
</table>
<p>
</body>
</html>
dist.php

Código PHP:
<?php
require_once('librerias/config.php');
$mens="Los datos fueron registrados con exito"//Mensaje de guardado correcto de datos
$error '<a href="javascript: window.history.back()"><< Regresar a solucionar el problema</a>'//Mensaje de Error de guardado de los datos
if(!isset($_POST["enviar"])) { //Si nombre boton no es igual a registro, envia le mensaje
    
echo 'No puedes enviar  el formulario vacio, debes llenar todos los datos..<br />';
} else { 
//De lo contrario, a llenar las variables 
$lat1 $_POST["l1"]; 
$l1 $_POST["ld1"]; 
$lat2 $_POST["l2"]; 
$l2 $_POST["ld2"];
$long1 $_POST["lo1"];
$lo1 $_POST["lod1"];
$long2 $_POST["lo2"]; 
$lo2 $_POST["lod2"];
$sql mysql_query("INSERT INTO posiciones_dist (lat1,l1,lat2,l2,long1,lo1,long2,lo2) 
                   VALUES  ('$lat1','$l1','$lat2','$l2','$long1','$lo1','$long2','$lo2') "
);
     
 if(!
$sql) {    //Si hay error en la consulta de insercion, envie el error
        
echo 'Error en el registro.' $error '';
        exit;
    } else {
// De lo contrario ingresar los datos
        
print "<script>alert('$mens')</script>";
        print
"<script>document.location='lat_long.php'</script>";
    }    
}



?>
Quiero saber que es lo qe estoy aplicando mal, que no me funciona de ninguna de las dos formas, espero me puedan dar una manito. Saludos!!
  #2 (permalink)  
Antiguo 31/05/2012, 07:32
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 10 meses
Puntos: 181
Respuesta: Calculo de distancia entre dos puntos

Así a bocajarro esto no me parece un problema de PHP, mas bien es un problema de matemáticas. La formula parece estar bien aplicada. Sin embargo es importante que entiendas que la distancia de dos puntos de la tierra se calcula haciendo una aproximación de la curvatura de la tierra y por tanto se deben tener las medidas siempre en radianes, cosa importante al hacer este tipo de cálculos. (Creo que no lo estas haciendo) Yo en lo personal cogeria la latitud y la longitud de las formulas que usas de la forma siguiente:

Cita:
Catedral Málaga Plaza de Colón
latitud 36.720139 40.425797
longitud -4.419422 -3.690462

acos(sin(radians(36.720139)) * sin(radians(40.425797)) +
cos(radians(36.720139)) * cos(radians(40.425797)) *
cos(radians(-4.419422) - radians(-3.690462))) * 6378

El resultado es de 417,348 Kilómetros.
Inserta tu mismo los datos de este ejemplo (siempre en grados) y verifica con calculadora que los resultados de las calculadora coincidan con lo que coloca el script. No seas impaciente y metas de un chorro toda la ecuación porque así jamas veras donde esta la incongruencia. Verifica uno por uno.
__________________
Blog de humor http://elcuasatar.net63.net/
  #3 (permalink)  
Antiguo 31/05/2012, 13:09
Avatar de Bullet  
Fecha de Ingreso: agosto-2005
Ubicación: Margarita, Venezuela
Mensajes: 235
Antigüedad: 18 años, 8 meses
Puntos: 1
Respuesta: Calculo de distancia entre dos puntos

Gracias amigo cuasatar, voy a probarla por separado, yo habia probado esta funcion con mis datos, pero en algun punto me daba dstinto, cualquier cosa vuelvo a escribir.. Saludos..

EDITADO

Que mas amigo, con la consulta me sirve, me da le mismo resultado el detalle es que me repite el mismo valor cuando pongo unas coordenadas distintas, no si es que estoy seleccionando mal los valores o estoy planteando mal la consulta donde guardo los valores en decimales...

Última edición por Bullet; 01/06/2012 a las 09:14
  #4 (permalink)  
Antiguo 19/04/2016, 04:53
 
Fecha de Ingreso: abril-2016
Mensajes: 1
Antigüedad: 8 años
Puntos: 0
Respuesta: Calculo de distancia entre dos puntos

Hay un modo más sencillo de aproximar la distancia entre dos puntos y con operaciones más sencillas.

Teniendo los datos de (Lat_A, Lon_A) y (Lat_B, Lon_B) coordenadas expresadas en grados de dos puntos, la distancia entre esos dos puntos seria:

Distancia (A,B) = 111120 * Raiz[ (Lat_A – Lat_B)^2 + {(Lon_A – Lon_B)*COS(Lat_A*PI/180)}^2 ]

Esta distancia estaría en metros, si la quieres en kilómetros multiplica por 111.12 en vez de multiplicar por 111120.
El error con el valor real seria inferior a 0.1%

Un saludo

Etiquetas: calculo, distancia, formulario, html, mysql, puntos, registro, sql, tabla, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:52.