Actualmente estoy trabajando en un script de python que convierte Lat Long (WGS84) a ITM. Las fórmulas utilizadas se basan en un documento publicado por OSGB (Apéndice B):
Obtengo buenos resultados en los Este pero no en los Norte (desde unos pocos mm hasta aproximadamente 1,5m) y no puedo entender por qué. ¿Alguien sabe las razones? Gracias por vuestra ayuda.
Andrea
# this script convert Latitude and Longitude to ITM
# import modules
import math
# GRS80 Ellipsoid constants
a = 6378137.0
b = 6356752.3141
e2 = (a**2-b**2)/a**2
# ITM projection constants
F = 0.99982
Lat0 = 0.933751149817
Long0 = -0.13962634016
E0 = 600000.0
N0 = 750000.0
# input Lat degrees, minutes and seconds for latitude
dLat = float(raw_input('Enter latitude degrees: '))
mLat = float(raw_input('Enter latitude minutes: '))
sLat = float(raw_input('Enter latitude seconds: '))
# convert Lat to decimal degrees
ddLat = dLat + (mLat/60) + (sLat/3600)
print 'Latitude dd:', ddLat
# convert Lat to radians
rLat = (ddLat*math.pi)/180.0
Lat = rLat
print 'Latitude r:', Lat
print
# input Long degrees, minutes and seconds for longitude
dLong = float(raw_input('Enter longitude degrees: ')) #The degrees have to be entered with a posite sign
mLong = float(raw_input('Enter longitude minutes: '))
sLong = float(raw_input('Enter longitude seconds: '))
# convert Long to decimal degrees
ddLong = dLong + (mLong/60) + (sLong/3600)
print 'Longitude dd:', ddLong
# convert Long to radians
rLong = -(ddLong*math.pi)/180.0 # the negative sign account for west direction
Long = rLong
print 'Longitude r:', Long
print
# calculate constants for transformation
n = (a - b)/(a + b)
v = a*F*(1-e2*(math.sin(Lat)**2))**-0.5
p = a*F*(1-e2)*(1-e2*(math.sin(Lat)**2))**-1.5
n2 = v/p-1
print 'n:', n
print 'v:', v
print 'p:', p
print 'n2:', n2
print
M1 = (1+n+5.0/4.0*n**2+5.0/4.0*n**3)*(Lat-Lat0)
M2 = (3*n+3*n**2+21.0/8.0*n**3)*math.sin(Lat-Lat0)*math.cos(Lat+Lat0)
M3 = (15.0/8.0*n**2+15.0/8.0*n**3)*math.sin(2*(Lat-Lat0))*math.cos(2*(Lat+Lat0))
M4 = 35.0/24.0*n**3*math.sin(3*(Lat-Lat0))*math.cos(3*(Lat+Lat0))
M = b*F*(M1-M2+M3-M4)
print 'M1:', M1
print 'M2:', M2
print 'M3:', M3
print 'M4:', M4
print 'M:', M
print
I = M+N0
print 'I:', I
II = v/2*math.sin(Lat)*math.cos(Lat)
print 'II:', II
III = v/24*math.sin(Lat)*(math.cos(Lat))**3*(5-(math.tan(Lat)**2)+9*n2)
print 'III:', III
IIIA = v/720*math.sin(Lat)*(math.cos(Lat)**5)*(61-58*(math.tan(Lat)**2)+(math.tan(Lat)**4))
print 'IIIA:', IIIA
IV = v*math.cos(Lat)
print 'IV:', IV
V = v/6*(math.cos(Lat)**3)*(v/p-(math.tan(Lat)**2))
print 'V:', V
VI = v/120*(math.cos(Lat)**5)*(5-18*(math.tan(Lat)**2)+(math.tan(Lat)**4)+14*n2-58*(math.tan(Lat)**2)*n2)
print 'VI:', VI
print
# calculate Eastings and Northings
N = I+II*(Long-Long0)**2+III*(Long-Long0)**4+IIIA*(Long-Long0)**6
E = E0+IV*(Long-Long0)+V*(Long-Long0)**3+VI*(Long-Long0)**5
print 'Easting: ', E
print 'Northing:', N
0 votos
Se me olvidó decir que comprobé los resultados con el convertidor en línea de Ordnance Survey Irlanda en osi.ie/calculators/converter_index.asp?alias=/services/
0 votos
¿Cómo se comparan tus resultados con los del ejemplo de la página 36?
3 votos
No es 100% sobre el tema, pero ¿has tratado de usar el pyproj biblioteca para comparar sus resultados también?
0 votos
@whuber El ejemplo de trabajo en la página 36 convierte Lat Long a OSGB36 (para el Reino Unido), pero la fórmula es también aplicable como se explica en el texto a ITM. Para ser más exactos no lo he probado pero lo intentaré hoy mismo.
0 votos
@om_henners No, no lo he probado. Sólo puedo hacerlo desde casa. Te lo haré saber. Gracias
2 votos
@aacinelli Al portar un código numérico complicado, usted tienen para reproducir los ejemplos trabajados que pueda encontrar: no basta con obtener las respuestas correctas en unos pocos casos de prueba. Un solo error tipográfico puede hacer que los resultados sean muy erróneos sólo para un pequeño subconjunto de entradas posibles y sólo un poco erróneos para todas las demás entradas, lo que hace que sea difícil de detectar, probar y depurar: por eso el ejemplo está ahí mostrando muchos resultados intermedios.
0 votos
@whuber ¡Tienes razón! Os mantendré informados de los resultados en el ejemplo trabajado. Gracias.
1 votos
He encontrado el error en el script y ha sido modificado. Al calcular las variables M1, M2, M3 y M4 el script utiliza ahora divisiones de números flotantes y los resultados obtenidos coinciden con los del convertidor en línea de Ordnance Survey Ireland y la lib. pyproj de Python. Gracias a todos por vuestros comentarios y ayuda. Andrea
0 votos
@aacinelli Puedes escribir tu propia respuesta a esta pregunta. En realidad es muy útil en casos como este, en el que resolviste tu problema. Puedes conseguir upvotes en tu respuesta y puedes aceptarla para que este hilo se marque como respondido.