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:
$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:
$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
<?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í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['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
<?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!!