Autor Tema: Calculo de distancia entre dos coordenadas  (Leído 498 veces)

Desconectado Chewii

  • PHPer@
  • **
  • Mensajes: 62
  • Karma: 0
  • Sexo: Masculino
  • Aprendiendo sobre Tortugas Marinas!!
    • Ver Perfil
Calculo de distancia entre dos coordenadas
« en: 30 de Mayo de 2012, 22:44:34 pm »
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: [Seleccionar]
$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: [Seleccionar]
$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: [Seleccionar]
<?php
require_once(&#39;librerias/config.php&#39;);
$earth 6378;
$querys "SELECT * FROM posiciones_dist ORDER BY id DESC limit 5";
$que mysql_query($querys);
$e mysql_query(&#39;SELECT l1,l2,lo1,lo2 FROM  posiciones_dist order by id desc limit 1&#39;);
$f mysql_fetch_assoc($e);//Arreglo que guarda los valores de la consulta
$g = ($f[&#39;l1&#39;]);
$h = ($f[&#39;l2&#39;]);
$i = ($f[&#39;lo1&#39;]);
$j = ($f[&#39;lo2&#39;]);

$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[&#39;distp1p2&#39;]);*/

?>


<!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>
<script charset="utf8">
//Funcion que genera una mascara de entrada para la latitud
 function latitud(l1){
              var mylat = '';
              mylat = mylat + l1;
              if (mylat.length == 2){
                  mylat = mylat + '°';
                  document.forms[0].l1.value = mylat;
              }
              if (mylat.length == 5){
                  mylat = mylat + '´';
                  document.forms[0].l1.value = mylat;
                  verifica_coord();
              }
          }
  //Funcion que verifica las coordenadas de latitud correctas       
         function verifica_coord(){
               m1= 1;
           
    var dec=''
              gds = (document.forms[0].l1.value.substring(0,2));
              min = (document.forms[0].l1.value.substring(3,5));
             
  // verifica grados y minutos
              situacao = "";
  if ((gds < 00) || (gds > 25)){
                  situacao = "falsa";
              }
              if (( min < 00) ||( min > 59)){
                  situacao = "falsa";
              }
               
              if (document.forms[0].l1.value == "") {
                  situacao = "falsa";
              }

              if (situacao == "falsa") {
                  alert("Posicion Invalida!");
                  document.forms[0].l1.focus();
              }
            dec = (parseFloat(gds) + (min / 60.0)) * m1;
            document.forms[0].ld1.value = dec;
               
        }
             
  //Funcion que genera una mascara de entrada para la longitud
        function longitud(lo1){
              var mylong = '';
              mylong = mylong + lo1;
              if (mylong.length == 2){
                  mylong = mylong + '°';
                  document.forms[0].lo1.value = mylong;
              }
              if (mylong.length == 5){
                  mylong = mylong + '´';
                  document.forms[0].lo1.value = mylong;
                  verifica_coord2();
              }
       }     
 
//Funcion que verifica las coordenadas de longitud correctas
        function verifica_coord2(){
               m1= -1;
               var dec=''             
              gds = (document.forms[0].lo1.value.substring(0,2));
              min = (document.forms[0].lo1.value.substring(3,5));
                             
              situacao = "";
              // verifica grados y minutos
               if ((gds < 00) || (gds > 80)){
                  situacao = "falsa";
              }
              if (( min < 00) ||( min > 59)){
                  situacao = "falsa";
              }
               
              if (document.forms[0].lo1.value == "") {
                  situacao = "falsa";
              }

                if (situacao == "falsa") {
                  alert("Posicion Invalida!");
                  document.forms[0].lo1.focus();
              }
            dec = (parseFloat(gds) + (min / 60.0)) * m1;
            //valor=dec.toFixed(0);
            document.forms[0].lod1.value = dec;
            }
     //Funcion que genera una mascara de entrada para la latitud
 function latitud2(l2){
              var mylat = '';
              mylat = mylat + l2;
              if (mylat.length == 2){
                  mylat = mylat + '°';
                  document.forms[0].l2.value = mylat;
              }
              if (mylat.length == 5){
                  mylat = mylat + '´';
                  document.forms[0].l2.value = mylat;
                  verifica_coord3();
              }
          }
  //Funcion que verifica las coordenadas de latitud correctas       
         function verifica_coord3(){
               m1= 1;
              // m2= 100;
              var dec=''
              gds = (document.forms[0].l2.value.substring(0,2));
              min = (document.forms[0].l2.value.substring(3,5));
             
               situacao = "";
              // verifica grados y minutos
             
  if ((gds < 00) || (gds > 25)){
                  situacao = "falsa";
              }
              if (( min < 00) ||( min > 59)){
                  situacao = "falsa";
              }
               
              if (document.forms[0].l2.value == "") {
                  situacao = "falsa";
              }

              if (situacao == "falsa") {
                  alert("Posicion Invalida!");
                  document.forms[0].l2.focus();
              }
           dec = (parseFloat(gds) + (min / 60.0)) * m1;
            document.forms[0].ld2.value = dec;
               
        }
             
  //Funcion que genera una mascara de entrada para la longitud
        function longitud2(lo2){
              var mylong = '';
              mylong = mylong + lo2;
              if (mylong.length == 2){
                  mylong = mylong + '°';
                  document.forms[0].lo2.value = mylong;
              }
              if (mylong.length == 5){
                  mylong = mylong + '´';
                  document.forms[0].lo2.value = mylong;
                  verifica_coord4();
              }
       }     
 
//Funcion que verifica las coordenadas de longitud correctas
        function verifica_coord4(){
               m1= -1;
              // m2= 100;
              var dec=''             
              gds = (document.forms[0].lo2.value.substring(0,2));
              min = (document.forms[0].lo2.value.substring(3,5));
                             
              situacao = "";
              // verifica grados y minutos
               if ((gds < 00) || (gds > 80)){
                  situacao = "falsa";
              }
              if (( min < 00) ||( min > 59)){
                  situacao = "falsa";
              }
               
              if (document.forms[0].lo2.value == "") {
                  situacao = "falsa";
              }

                if (situacao == "falsa") {
                  alert("Posicion Invalida!");
                  document.forms[0].lo2.focus();
              }
           dec = (parseFloat(gds) + (min / 60.0)) * m1;
            document.forms[0].lod2.value = dec;
            }

</script>
<style type="text/css">
.Estilo5 {font-size: 75%}
.Estilo7 {font-size: 70%}
</style>
</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[&#39;lat1&#39;]; ?></td>
      <td><?php echo $rs[&#39;l1&#39;]; ?></td>
      <td><?php echo $rs[&#39;lat2&#39;]; ?></td>
      <td><?php echo $rs[&#39;l2&#39;]; ?></td>
      <td><?php echo $rs[&#39;long1&#39;]; ?></td>
      <td><?php echo $rs[&#39;lo1&#39;]; ?></td>
      <td><?php echo $rs[&#39;long2&#39;]; ?></td>
      <td><?php echo $rs[&#39;lo2&#39;]; ?></td>
      <td><?php echo $dist?></td>
     </tr>
    <?php }  ?>
  </tbody>
</table>
<p>
</body>
</html>

dist.php

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

Comunidad PHPeros

Calculo de distancia entre dos coordenadas
« en: 30 de Mayo de 2012, 22:44:34 pm »