Josmanue escribiste:Muchísimas gracias por tu programa, pero ahora tengo algunas dudas, la primera es que pensaba que en Perl no hacía falta predeclarar las variables y en tu programa lo haces con todas.... entonces... ¿es necesario o no?
Es necesario si se usa el pragma 'strict'. Algo recomendable para evitar cosas como lo de la variable $P1CosLat.
Josmanue escribiste:¿Por qué las declaras todas como locales? ¿debe ser así por convenio? o simplemente te gusta a ti hacerlo así?
Son locales en el programa en donde están... pero ayuda a evitar confilctos en casos como bucles o subrutinas.
Josmanue escribiste:No entiendo lo que me dices de la inicialización de P1CosLat. Está inicializada como
- Código: Seleccionar todo
$P1CosLat = cos($Latitud_Rad);
Y $Latitud_Rad también toma valor unas lineas antes, así que no debería estar ahi el problema no? De echo en tu programa creo que lo has dejado igual.
En el programa que dejaste aquí sólo existía un lugar donde se hacía referencia a $P1CosLat y era en la línea donde se calcula $East_Term1. Viendo el código con calma, se vé que todas las referencias son a la variable $P1_CosLat, como se ven en las líneas que siguen a la que indicas. Fíjate que después de inicializar $P1_CosLat al valor del coseno de $Latitud_Rad, esa variable se usa inmediatamente para el cálculo de las variables $P2_CosLat y $P3_CosLat. Cambié la línea del calculo de $East_Term1 de $P1CosLat a $P1_CosLat y todo fue bien. El aviso me lo dió
use strict, que me dijo que esa variable no había sido inicializada. Estas cosas son importantes porque son la base del programa, desde luego.
Josmanue escribiste:En cuanto al campo 'LON' creo que te equivocas, la longitud viene dada como GGGMM,mmmm con GGG: grados, MM: minutos y mmmm: décimas de minutos. La Longitud pueden ser por ejemplo 125º. De hecho fijate como está definido:
- Código: Seleccionar todo
LON.{5},.{4}
Es algo diferente de Latitud:
- Código: Seleccionar todo
LAT.{4},.{4}
Por eso yo tenía puestos dos "if" uno para cada campo, porque son diferentes(esta vez lo tenía bien yo ¿no?
)
Sí, lo estabas haciendo bien (salvo el detalle de la variable $mmmm). Pero esas líneas se pueden resumir, ya que los dos if hacen casi lo mismo. Por eso existe un '?' en la expresión regular, para leer dos o tres números. De esa forma el cálculo de LON y LAT se puede meter en las mismas líneas. Esto es lo bueno de las expresiones regulares. Cuando hago
- Código: Seleccionar todo
my ($GG,$MM,$mmmm) = $valor =~ /(...?)(..),(....)/;
lo que hago es leer los campos de grados, minutos y segundos y guardarlos en sus variables. En el caso de los grados, con el '.?' indico que puede existir o no un tercer dígito.
Josmanue escribiste:Hasta aqui mis dudas, ahora me sigue dando un error, o warning:
attemp to separate words with commas at ./programa.pl line 75
¿De que puede ser?
Es porque encuentra la coma dentro del qw(). No le hagas ni caso. Cuando el programa funcione, comentas o quitas la línea
use warnings y asunto solucionado.
Josmanue escribiste:Y por último, al introducir LAT5525,1234 y LON12525,1234 en las pruebas que hago me da como resultado
Easting =-349669.218275869
Northing = 10061918.1812058
así están en la cadena $sql, pero a la hora de insertar en Easting inserta un '0'.
Si está en la sentencia $sql bien, es que está bien ¿no? ¿Puede ser un problema de la tabla, que no acepte datos negativos?
Eso ya es un tema de la base de datos, según cómo estén definidos esos campos. Podría ser algo tan tonto como la presencia del '.' dentro del número.
Por cierto, con esos valores de muestra a mí me salen estos valores:
Easting = 5088.02311980753
Northing = 9089209.99698948
Para comprobar que estás haciendo bien los cálculos, prueba a ponerle 89º59'59.999 (polo norte), con lo que deberás obtener un valor de Northing muy cercano a los 10 millones (de metros, que son 10 mil kilómetros), que es justo la cuarta parte de la circunferencia de todo el planeta.
En esta página (
http://home.hiwaay.net/~taylorc/toolbox ... eoutm.html ) tienes una calculadora que te servirá para saber si estás haciendo bien o no los cálculos. Con el módulo Geo::Coordinates::UTM y usando el elipsoide WGS84 me salen casi exactos.