Esempio n. 1
0
def main():
    sal = UTM2Geo(putm.PuntoUTM(500000, 4000000), 'WGS 84')
    import os
    print("Conversor de Coordenadas UTM a Geodesicas.")
    opt = None
    while opt != 0:
        print()
        print(
            "Seleccione una opción:\n\t1-Convertir un punto.\n\t2-Convertir un fichero.\n\t0-Salir."
        )
        opt = int(input("Opción: "))
        if opt > 2:
            print("Opción Invalida")
            continue
        else:
            if opt == 1:
                print()
                try:
                    X = float(input("X(UTM): "))
                    Y = float(input("Y(UTM): "))
                    Huso = int(input("Huso: "))
                    Nombre_Elipsoide = str(input("Elipsoide: "))
                    p = putm.PuntoUTM(X, Y, Huso=Huso)
                    sal = UTM2Geo(p, Nombre_Elipsoide)
                    print()
                    print("Resultados:")
                    print("Latitud: " + str(sal.getLatitud()))
                    print("Longitud: " + str(sal.getLongitud()))
                    print("h Elipsoidal: " + str(sal.getAlturaElipsoidal()))
                    print("kp: %.5f" % p.getEscalaLocalPunto())
                    print("conv_med: %.6f" % p.getConvergenciaMeridianos())
                except Exception as e:
                    print(e)
                    continue
            elif opt == 2:
                print()
                try:
                    r_ent = input("Ruta fichero Entrada: ")
                    r_sal = input("Ruta fichero Salida: ")
                    if r_ent == r_sal:
                        print()
                        print(
                            "Error: El archivo de entrada no puede conincidir con el de salida."
                        )
                        continue
                    Nombre_Elipsoide = input("Elipsoide: ")
                    sal = UTM2GeoFromFile(r_ent, Nombre_Elipsoide)
                    pr = open(r_sal, 'wb', 1024)
                    for i in sal:
                        a = bytes(("" + str(i.getLatitud()) + ";" +
                                   str(i.getLongitud()) + "\n").encode(
                                       encoding='UTF-8', errors='strict'))
                        pr.write(a)
                except Exception as e:
                    print(e)
                    continue

            else:
                os.system('pause')
Esempio n. 2
0
def UTM2GeoFromFile(File, NombreElipsoide):
    '''!
    @brief: Función que realiza la conversión de geodesicas a UTM desde un fichero.
    @param File str: Ruta del fichero con las coordenadas a transformar.
    @note: El fichero debe tener el siguiente formato como mínimo: id,X,Y,Hemisferio,Huso
    '''
    import os
    from PyQt4 import QtGui
    if not type(File) == str:
        raise Exception(
            "El formato del fichero introducido no es de tipo str.")
    if not os.path.exists(File):
        raise Exception("El fichero introducido no existe.")
    if not os.path.isfile(File):
        raise Exception(
            "El fichero introducido no se corresponde con un archivo.")

    #ID,X,Y,Huso,helip.....
    IDs = []
    Xs = []
    Ys = []
    posY = []
    Huso = []
    helip = []
    f = open(File, 'r')
    for i in f:
        QtGui.QApplication.processEvents()
        i = i.split(",")
        IDs.append(i[0])
        Xs.append(i[1])
        Ys.append(i[2])
        posY.append(i[3])
        Huso.append(i[4])
        try:
            h = i[4]
            helip.append(h)
        except:
            helip.append(None)
    f.close()
    Sal = []
    for ids, x, y, py, H, hel in zip(IDs, Xs, Ys, posY, Huso, helip):
        QtGui.QApplication.processEvents()
        p = putm.PuntoUTM(x, y, huso=H, helip=hel, hemisferioY=py)
        p1 = UTM2Geo(p, NombreElipsoide)
        Sal.append([ids, p, p1])


#     IDs=[i.split(",")[0] for i in f]
#     f.seek(0)
#     Xs=[i.split(",")[1] for i in f]
#     f.seek(0)
#     Ys=[i.split(",")[2] for i in f]
#     f.close()
#     Elips=[NombreElipsoide]*len(Xs)
#     QtGui.QApplication.processEvents()
#     Puntos=[putm.PuntoUTM(i,j) for i,j in zip(Xs,Ys)]
#     sal=map(UTM2Geo,Puntos,Elips,QtGui.QApplication.processEvents())
    return Sal
def UTM2GeoFromFile(File, NombreElipsoide):
    import os
    '''
Función que realiza la conversión de geodesicas a UTM desde un fichero.
    @param File:
    @type File: str.
'''
    if not type(File) == str:
        raise Exception("Not str")
    if not os.path.exists(File):
        raise Exception("Not Exists")
    if not os.path.isfile(File):
        raise Exception("Not File")

    #ID,Lat,Lon,helip.....
    f = open(File, 'r')
    Xs = [i.split(",")[1] for i in f]
    f.seek(0)
    Ys = [i.split(",")[2] for i in f]
    f.close()
    Elips = [NombreElipsoide] * len(Xs)
    Puntos = [putm.PuntoUTM(i, j) for i, j in zip(Xs, Ys)]
    sal = map(UTM2Geo, Puntos, Elips)
    return sal
Esempio n. 4
0
def Geo2UTM(PuntoGeodesico, NombreElipsoide, Huso=None, w=True, kp=True):
    '''!
    @brief: Método que convierte coordenadas Geodésicas elipsoidales a coordenadas UTM.
    @param PuntoGeodesico PuntoGeodesico: Punto Geodesico con las coordenadas del punto.
    @param NombreElipsoide str: Nombre del elipsoide de calculo.
    @param Huso int: Valor del Huso en el caso de que se quieran forzar las coordenadas a ese Huso.                            
    @return PuntoUTM: Punto con las coordenadas UTM transformadas.
    '''
    if not isinstance(PuntoGeodesico, pgeo.PuntoGeodesico):
        raise Exception("Valor Punto Geodesico")

    try:
        NombreElipsoide = str(NombreElipsoide)
    except:
        raise Exception("Valor Nombre Elipsoide")

    #Conversion a radian.
    Latitud = ang.Angulo(PuntoGeodesico.getLatitud(), formato='latitud')
    Latitud.Convertir('radian')
    Lat = Latitud.getAngulo()
    Longitud = ang.Angulo(PuntoGeodesico.getLongitud(), formato='longitud180')
    Longitud.Convertir('radian')
    Lon = Longitud.getAngulo()
    AlturaElipsoidal = PuntoGeodesico.getAlturaElipsoidal()

    #Calculo de parámetros del elipsoide.
    Elipsoide = Elip.Elipsoides(NombreElipsoide)
    nhu = Rad.RadiosDeCurvatura(NombreElipsoide).getRadioPrimerVertical(Lat)
    e = Elipsoide.getPrimeraExcentricidad()
    e2 = Elipsoide.getSegundaExcentricidad()
    #Valores Auxiliares
    t = tan(Lat)
    t2 = (t**2)
    t4 = (t**4)
    t6 = (t**6)
    t8 = (t**8)
    n2 = ((e2**2)) * ((cos(Lat)**2))
    n4 = (n2**2)
    n6 = (n2**3)
    n8 = (n2**4)
    n10 = (n2**5)
    n12 = (n2**6)
    n14 = (n2**7)
    #Claculo de las series de terminos.
    #x cubo.
    x3 = (1.0 - t2 + n2)
    #x quinta.
    x5 = (5.0 - 18.0 * t2 + t4 + 14.0 * n2 - 58.0 * n2 * t2 + 13.0 * n4 -
          64.0 * n4 * t2 + 4.0 * n6 - 24.0 * n6 * t2)
    #x septima.
    x7 = (61.0 - 479.0 * t2 + 179.0 * t4 - t6 + 331.0 * n2 - 3298.0 * n2 * t2 +
          177.0 * n2 * t4 + 715.0 * n4 - 8655.0 * n4 * t2 + 6080.0 * n4 * t4 +
          769.0 * n6 - 10964.0 * n6 * t2 + 9480.0 * n6 * t4 + 412.0 * n8 -
          5176.0 * n8 * t2 + 6912.0 * n8 * t4 + 88.0 * n10 -
          1632.0 * n10 * t2 + 1920.0 * n10 * t4)
    #x novena.
    x9 = (1385.0 - 20480.0 * t2 + 20690.0 * t4 - 1636.0 * t6 + t8 +
          12284.0 * n2 - 173088.0 * n2 * t2 + 201468.0 * n2 * t4 -
          54979.0 * n2 * t6 - 21.0 * n2 * t8 + 45318.0 * n4 -
          883449.0 * n4 * t2 + 14499197.0 * n4 * t4 - 390607.0 * n4 * t6 -
          14.0 * n4 * t8 + 90804.0 * n6 - 2195193.0 * n6 * t2 +
          549800.0 * n6 * t4 - 1394064.0 * n6 * t6 + 104073.0 * n8 -
          2875680.0 * n8 * t2 + 7041648.0 * n8 * t4 - 2644992.0 * n8 * t6 +
          68568.0 * n10 - 2115840.0 * n10 * t2 + 5968512.0 * n10 * t4 -
          2741760.0 * n10 * t6 + 25552.0 * n12 - 880192.0 * n12 * t2 +
          2811456.0 * n12 * t4 - 1474560.0 * n12 * t6 + 4672.0 * n14 -
          175680.0 * n14 * t2 + 603648.0 * n14 * t4 - 322560.0 * n14 * t6)
    #y cuarta.
    y4 = (5.0 - t2 + 9.0 * n2 + 4.0 * n4)
    #y sexta.
    y6 = (61.0 - 58.0 * t2 + t4 + 270.0 * n2 - 330.0 * n2 * t2 + 445.0 * n4 -
          680.0 * n4 * t2 + 324.0 * n6 - 600.0 * n6 * t2 + 88.0 * n8 -
          192.0 * n8 * t2)
    #y octava.
    y8 = (1385.0 - 3595.0 * t2 + 543.0 * t4 - t6 + 10899.0 * n2 -
          18634.0 * n2 * t2 + 10787.0 * n2 * t4 + 7.0 * n2 * t6 +
          34419.0 * n4 - 120582.0 * n4 * t2 + 49644.0 * n4 * t4 +
          56385.0 * n6 - 252084.0 * n6 * t2 + 121800.0 * n6 * t4 +
          47688.0 * n8 - 242496.0 * n8 * t2 + 151872.0 * n8 * t4 +
          20880.0 * n10 - 121920.0 * n10 * t2 + 94080.0 * n10 * t4 +
          4672.0 * n12 - 30528.0 * n12 * t2 + 23040.0 * n12 * t4)

    #Calculo de lam.
    s1 = sin(Lat)
    s3 = (s1**3)
    s5 = (s1**5)
    s7 = (s1**7)
    s9 = (s1**9)
    c1 = cos(Lat)
    g1 = Lat
    g2 = 1.5 * (e**2) * ((-0.5 * s1 * c1) + 0.5 * Lat)
    g3 = (15.0 / 8.0) * (e**4) * ((-0.25 * s3 * c1) - ((3.0 / 8.0) * s1 * c1) +
                                  ((3.0 / 8.0) * Lat))
    g4 = (35.0 / 16.0) * (e**6) * ((-(1.0 / 6.0) * s5 * c1) -
                                   ((5.0 / 24.0) * s3 * c1) -
                                   ((5.0 / 16.0) * s1 * c1) +
                                   ((5.0 / 16.0) * Lat))
    g5 = (315 / 128) * (e**8) * ((-(1 / 8) * s7 * c1) - ((7 / 48) * s5 * c1) -
                                 ((35 / 192) * s3 * c1) -
                                 ((35 / 128) * s1 * c1) + ((35 / 128) * Lat))
    g6 = (693 / 256) * (e**10) * ((-(1 / 10) * s9 * c1) -
                                  ((9 / 80) * s7 * c1) -
                                  ((21 / 160) * s5 * c1) -
                                  ((21 / 128) * s3 * c1) -
                                  ((63 / 256) * s1 * c1) + ((63 / 256) * Lat))
    lam = Elipsoide.getSemiEjeMayor() * (1 - (e**2)) * (g1 + g2 + g3 + g4 +
                                                        g5 + g6)

    #Calculo del Huso.
    if Huso == None:
        Huso = floor(((180.0 + Lon * (180 / pi)) / 6) + 1)
        lon0 = ang.Angulo((Huso * 6) - 183, formato='pseudosexagesimal')
        lon0.Convertir('radian')
        lon0 = lon0.getAngulo()
        #print(lon0)
    else:
        Huso = int(Huso)
        #Meridiano central.
        lon0 = ang.Angulo((Huso * 6) - 183, formato='pseudosexagesimal')
        lon0.Convertir('radian')
        lon0 = lon0.getAngulo()
        lon0d = lon0 + 0.05817764173314432  #3º20'
        lon0i = lon0 - 0.05817764173314432
        #print(lon0d,lon0i,Lon)
        if Lon < lon0i or Lon > lon0d:
            raise Exception(
                "Solo se pueden forzar las coordenadas a los Husos adyacentes un máximo de 20', si estas se en cuentran en el extremo del Huso"
            )

    #Incremento de longitud.
    Alon = Lon - lon0
    #Calculo de X.
    c3 = (c1**3)
    c5 = (c1**5)
    c7 = (c1**7)
    c9 = (c1**9)
    X = 500000.0 + (0.9996 *
                    ((Alon * nhu * c1) + (((Alon**3) / 6.0) * nhu * c3 * x3) +
                     (((Alon**5) / 120.0) * nhu * c5 * x5) +
                     (((Alon**7) / 5040.0) * nhu * c7 * x7) +
                     (((Alon**9) / 362880.0) * nhu * c9 * x9)))
    #Calculo de Y.
    c2 = (cos(Lat)**2)
    c4 = (cos(Lat)**4)
    c6 = (cos(Lat)**6)
    c8 = (cos(Lat)**8)
    Y = 0.9996 * (lam + (((Alon**2) / 2.0) * nhu * t * c2) +
                  (((Alon**4) / 24.0) * nhu * t * c4 * y4) +
                  (((Alon**6) / 720.0) * nhu * t * c6 * y6) +
                  (((Alon**8) / 40320.0) * nhu * t * c8 * y8))

    # Si la latiud está en el Hemisferio Sur:
    if Latitud.getAngulo() < 0:
        Y = 10000000.0 - Y

    #Cálculo de la convergencia de meridianos.
    #coeficientes.
    if w:
        m3 = (1.0 + 3.0 * n2 + 2 * n4)
        m5 = (2.0 - t2 + 15.0 * n2 * t2 + 35.0 * n4 - 50.0 * n4 * t2 +
              33.0 * n6 - 60.0 * n6 * t2 + 11.0 * n8 - 24.0 * n8 * t2)
        m7 = (-148.0 - 3427.0 * t2 + 18.0 * t4 - 1387.0 * t6 + 2023.0 * n2 -
              46116.0 * n2 * t2 + 5166.0 * n2 * t4 + 18984.0 * n4 -
              100212.0 * n4 * t4 + 34783 * n6 - 219968.0 * n6 * t2 +
              144900.0 * n6 * t4 + 36180.0 * n8 - 261508.0 * n8 * t2 +
              155904.0 * n8 * t4 + 18472.0 * n10 - 114528.0 * n10 * t2 +
              94080.0 * n10 * t4 + 4672.0 * n12 - 30528.0 * n12 * t2 +
              23040.0 * n12 * t4)
        convmed = (Alon * s1) + (((Alon**3) / 3.0) * s1 * c2 * m3) + ((
            (Alon**5) / 15.0) * s1 * c4 * m5) + ((
                (Alon**7) / 5040.0) * s1 * c6 * m7)
        convmed = ang.Angulo(convmed, formato='radian')
        convmed.Convertir('pseudosexagesimal')
        convmed = convmed.getAngulo()
    else:
        convmed = None
    #Calculo de la escala local del punto.
    #coeficientes.
    if kp:
        k2 = (1 + n2)
        k4 = (5.0 - 4.0 * t2 + 14.0 * n2 - 28.0 * n2 * t2 + 13.0 * n4 -
              48.0 * n4 * t2 + 4.0 * n6 - 24.0 * n6 * t2)
        k6 = (61.0 + 10636.0 * t2 - 9136.0 * t4 + 224.0 * t6 + 331.0 * n2 +
              44432.0 * n2 * t2 - 50058.0 * n2 * t4 - 715.0 * n4 +
              68100.0 * n4 * t2 - 95680.0 * n4 * t4 + 769.0 * n6 +
              43816.0 * n6 * t2 - 80160.0 * n6 * t4 + 412.0 * n8 +
              9644.0 * n8 * t2 - 21888.0 * n8 * t4 + 88.0 * n10 -
              1632.0 * n10 * t2 + 1920.0 * n10 * t4)
        kp = (0.9996) * (1 + (0.5 * (Alon**2) * c2 * k2) +
                         (((Alon**4) / 24.0) * c4 * k4) +
                         (((Alon**6) / 720.0) * c6 * k6))
    else:
        kpsal = None

    posY = None
    if Latitud.getAngulo() > 0:
        posY = "N"
    else:
        posY = "S"

    sal = putm.PuntoUTM(X,
                        Y,
                        hemisferioY=str(posY),
                        helip=AlturaElipsoidal,
                        huso=int(Huso))
    sal.setConvergenciaMeridianos(convmed)
    sal.setEscalaLocalPunto(kpsal)

    return sal