Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal


Objetivo: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
El miembro Top Fuel del foro italiano de gambas me pide señalar esta su función para convertir una coordenada geográfica de formato grados/arcominutos/arcosegundos a formato decimal:

Public Sub Form_Open()

Dim coordinata As String = "115°48'35"
Dim decimale As Float 'coordinata in formato decimale
decimale = converti(coordinata)
Print decimale

End


Public Function converti(coordinata As String) As Float 'converte una coordinata da gradi/primi/secondi in cooordinata decimale

Dim scanna As String[] 'array per splittare la coordinata
Dim gradi As Short
Dim primi, secondi As Byte
Dim decimale As Float

scanna = Scan(coordinata, "*°*'*") 'separiamo i componenti della coordinata
gradi = CShort(scanna[0]) 'convertiamoli in numeri
primi = CByte(scanna[1])
secondi = CByte(scanna[2])
decimale = gradi + primi / 60 + secondi / 3600 'calcoliamo il risultato
Return decimale

End

última edición por vuott el Martes, 06 Febrero 2018, 00:37; editado 4 veces
Perfil MP  
Objetivo: Re: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
Muchas gracias para Top Fuel.

Supongo que las funciones Scan(), CShort() y CByte() pueden manejar la cadena sin errores cuando contiene espacios, como en: "115° 48' 35"

Aún no lo he probado, creo que es hora de descansar aquí en España

Saludos

Perfil MP  
Objetivo: Re: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
jguardon escribió: [Ver mensaje]
creo que es hora de descansar aquí en España


El colchón es lo máximo !

Perfil MP  
Objetivo: Re: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
vuott escribió: [Ver mensaje]
El miembro Top Fuel del foro italiano de gambas me pide señalar esta su función para convertir una coordenada geográfica de formato grados/arcominutos/arcosegundos a formato decimal:



Vuott, stupendo codice , que hay que agradecer a Top Fuel. Y reconozco mi ignorancia: ¡No conocía la función Scan!, iba por la vida usando tan solo Split

Es perfectamente válido para los cálculos de longitud escrita [0 a 360]º. Sin embargo, creo, daría un pequeño problema con los de latitud [-90 a 90]º o los de longitud [-180 a 180]º; en concreto, con los negativos. El problema es que al separar la cadena se considera tan solo el signo con el cálculo de los grados y luego se suman —se restarían en valor absoluto— los minutos y segundos.
Como tiendo a una natural farragosidad congénita, mejor lo explico con dos ejemplos: -3º 30' y -3º 15'.
El resultado debería ser, respectivamente, -3,5 y -3,25. Sin embargo con este código resultarán en -2,5 y -2,75.

Pero es algo relativamente sencillo de solucionar:

'...
Dim Signo As Short ' Y no como _boolean_ porque puede ser -1, 0 y 1
'...
Signo = Sgn(CShort(scanna[0]))
gradi = Abs(CShort(scanna[0]))
'...
If Signo < 0 Then decimale=-decimale
Return decimale

Como estoy en el trabajo, no puedo comprobar la compatibilidad de Sgn con CShort, pero creo que debería funcionar.

También existe la posibilidad de emplear esta función tal cual está y luego cambiar de signo si existe un "S" al final de la cadena, en caso de que el formato de entrada sea "GGº MM' SS/" N" en lugar de "+GGº MM' SS/"".


Y sí, el colchón es la máxima expresión de la humanidad. Es el hecho diferenciador de una civilización. Y me gustaría irme ahora mismo a mi casa a civilizarme

Un saluto a tutta la comunità italiana!

última edición por Grandamakulo el Martes, 06 Febrero 2018, 15:01; editado 4 veces
Objetivo: Re: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
Grandamakulo escribió: [Ver mensaje]
Un saluto a tutta la comunità italiana!


Gracias, hermano mediterraneo !

Perfil MP  
Objetivo: Re: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
Comprobado, funciona. Eso sí, ojo con los signos empleados en grados y minutos.
Código: [Descargar] [Ocultar]
  1. Public Function converti(coordinata As String) As Float 'converte una coordinata da gradi/primi/secondi in cooordinata decimale
  2.  
  3. Dim scanna As String[] 'array per splittare la coordinata
  4. Dim gradi As Short
  5. Dim primi, secondi As Byte
  6. Dim decimale As Float
  7. Dim signo As Short
  8.  
  9. scanna = Scan(coordinata, "*º*'*") 'separiamo i componenti della coordinata
  10. 'signo = Sgn(CShort(scanna[0]))
  11. If InStr(scanna[0], "-") Then signo = -1 Else signo = 1
  12. gradi = Abs(CShort(scanna[0])) 'convertiamoli in numeri
  13. primi = CByte(scanna[1])
  14. secondi = CByte(scanna[2])
  15. decimale = gradi + primi / 60 + secondi / 3600 'calcoliamo il risultato
  16. If signo < 0 Then decimale = - decimale
  17. Return decimale
  18.  
  19. End
  20.  


PS.—El código anterior no funcionaba bien del todo, por que en el intervalo (0,-1) el primer carácter tras el signo es un 0, y el signo de -0 y el de cero es... ¡tachán!, 0. Para evitarlo, ahora se comprueba directamente si existe un signo menos delante —línea 10 comentada y línea 11 actual—. Evidentemente, no tiene demasiado sentido que la variable «signo» se llame así, pero me lo perdonáis.

última edición por Grandamakulo el Miercoles, 07 Febrero 2018, 21:17; editado 1 vez
Objetivo: Re: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
Muy bien, Grandamakulo !

Perfil MP  
Objetivo: Re: Convertir Una Coordenada Geográfica De Formato Grados/arcominutos/arcosegundos A Formato Decimal
Muchas gracias, Vuott.
PS.—Le he hecho una pequeña corrección porque fallaba en los valores (0,-1). Ahora ya está bien, espero


Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1442s (PHP: -27% SQL: 127%)
Consultas SQL: 26 - Debug off - GZIP Activado