Ejemplo n.º 1
0
def geo_azim_bug(ff_lat_pto,
                 ff_lng_pto,
                 ff_lat_ref=cdefs.M_REF_LAT,
                 ff_lng_ref=cdefs.M_REF_LNG):
    """
    cálculo do azimute entre dois pontos geográficos
    (válido par distâncias menores que 800NM)

    @param ff_lat_pto: latitude do ponto em graus
    @param ff_lng_pto: longitude do ponto em graus
    @param ff_lat_ref: latitude da referência em graus
    @param ff_lng_ref: longitude da referência em graus

    @return azimute entre a referência e o ponto em NM
    """
    # check input
    assert -90. <= ff_lat_pto <= 90.
    assert -180. <= ff_lng_pto <= 180.

    assert -90. <= ff_lat_ref <= 90.
    assert -180. <= ff_lng_ref <= 180.

    # verifica coincidência de pontos
    if (ff_lat_pto == ff_lat_ref) and (ff_lng_pto == ff_lng_ref):
        # pontos coincidentes
        return 0.

    # calcula a distância em latitude (DLA)
    lf_lat_dst = ff_lat_pto - ff_lat_ref

    # calcula a distância em longitude (DLO)
    lf_lng_dst = ff_lng_pto - ff_lng_ref

    # retorna o azimute entre os pontos
    return conv.azm2ang(math.atan2(lf_lat_dst, lf_lng_dst))
Ejemplo n.º 2
0
def geo2xy_2(ff_lat_pto,
             ff_lng_pto,
             ff_lat_ref=cdefs.M_REF_LAT,
             ff_lng_ref=cdefs.M_REF_LNG):
    """
    conversão de coordenadas geográficas

    @param ff_lat_pto: latitude em graus
    @param ff_lng_pto: longitude em graus
    @param ff_lat_ref: coordenadas geográficas de referênica
    @param ff_lng_ref: coordenadas geográficas de referênica

    @return coordenadas X e Y do ponto
    """
    # check input
    assert -90. <= ff_lat_pto <= 90.
    assert -180. <= ff_lng_pto <= 180.

    assert -90. <= ff_lat_ref <= 90.
    assert -180. <= ff_lng_ref <= 180.

    # cálculo da distância e do azimute geográficos do ponto
    l_vd = geo_dist(ff_lat_pto, ff_lng_pto, ff_lat_ref, ff_lng_ref)
    l_vr = geo_azim(ff_lat_pto, ff_lng_pto, ff_lat_ref, ff_lng_ref)

    # converte o azimute para ângulo em radianos
    l_vr = math.radians(conv.azm2ang(math.degrees(l_vr)))

    # cálculo das coordenadas X & Y do ponto
    lf_x = l_vd * math.cos(l_vr)
    lf_y = l_vd * math.sin(l_vr)

    # existe declinação magnética ?
    # if 0. != f_ref.f_dcl_mag:
    # correção das coordenadas X e Y devido ao efeito da declinação magnética
    #decl_xy(f_ref.f_dcl_mag)

    # return x & y
    return lf_x, lf_y
Ejemplo n.º 3
0
def pol2xyz(ff_azim, ff_dist):
    """
    transforma coordenadas polares em coordenadas cartesianas

    @param ff_azim: azimute
    @param ff_dist: distância

    @return coordenadas cartesianas do ponto
    """
    # check input
    assert 0. <= ff_azim <= 360.

    # converte a distância para metros
    lf_dst = ff_dist

    # converte a radial para ângulo trigonométrico
    lf_azim = math.radians(conv.azm2ang(math.degrees(ff_azim)))

    # converte a distância e ângulo em X e Y
    lf_x = lf_dst * math.cos(lf_azim)
    lf_y = lf_dst * math.sin(lf_azim)

    # return
    return lf_x, lf_y, 0.
Ejemplo n.º 4
0
    def new_coord(self,
                  fc_tipo,
                  fs_cpo_a,
                  fs_cpo_b="",
                  fs_cpo_c="",
                  fs_cpo_d=""):
        """
        cria uma coordenada
        """
        # check input
        if fc_tipo not in cdefs.D_SET_COORD_VALIDAS:
            # logger
            l_log = logging.getLogger("CCoordSys::new_coord")
            l_log.setLevel(logging.CRITICAL)
            l_log.critical(
                u"<E01: tipo de coordenada({}) inválida.".format(fc_tipo))

            # cai fora
            return -1, -90., -180.

        # inicia os valores de resposta
        lf_lat = None
        lf_lng = None

        # coordenada distância/radial
        if 'D' == fc_tipo:
            #!!TipoD(lp_ref, fp_coord)

            # obtém as coordenadas geográficas do fixo(cpoA)
            li_rc, lf_lat, lf_lng = self.__geo_fixo(fs_cpo_a)

            if 0 != li_rc:
                # logger
                l_log = logging.getLogger("CCoordSys::new_coord")
                l_log.setLevel(logging.ERROR)
                l_log.error(u"<E02: fixo {} inexistente.".format(fs_cpo_a))

                # cai fora
                return li_rc, lf_lat, lf_lng

            # converte para cartesiana
            lf_x, lf_y, _ = self.geo2xyz(lf_lat, lf_lng)

            # distância(m)
            l_vd = float(fs_cpo_b) * cdefs.D_CNV_NM2M

            # radial(radianos)
            l_vr = math.radians(conv.azm2ang(float(fs_cpo_c)))

            # x, y do ponto
            lf_x += l_vd * math.cos(l_vr)
            lf_y += l_vd * math.sin(l_vr)

            # converte para geográfica
            lf_lat, lf_lng, _ = self.xyz2geo(lf_x, lf_y)

            # ok
            return li_rc, lf_lat, lf_lng

        # coordenada fixo
        elif 'F' == fc_tipo:
            # obtém as coordenadas geográficas do fixo(cpoA)
            li_rc, lf_lat, lf_lng = self.__geo_fixo(fs_cpo_a)

            if 0 != li_rc:
                # logger
                l_log = logging.getLogger("CCoordSys::new_coord")
                l_log.setLevel(logging.ERROR)
                l_log.error(u"<E03: fixo {} inexistente.".format(fs_cpo_a))

            # cai fora
            return li_rc, lf_lat, lf_lng

        # coordenada geográfica formato ICA ?(formato GGGMM.mmmH)
        elif 'G' == fc_tipo:
            # latitude
            lf_lat = conv.parse_ica(str(fs_cpo_a))

            # longitude
            lf_lng = conv.parse_ica(str(fs_cpo_b))

            # ok
            return 0, lf_lat, lf_lng

        # coordenada indicativo de fixo
        elif 'I' == fc_tipo:
            # obtém o número do fixo pelo indicativo
            li_rc = self.__get_fixo_by_indc(fs_cpo_a)

            if li_rc < 0:
                # logger
                l_log = logging.getLogger("CCoordSys::new_coord")
                l_log.setLevel(logging.ERROR)
                l_log.error(u"<E04: fixo {} inexistente.".format(fs_cpo_a))

                # cai fora
                return -1, -90., -180.

            # obtém as coordenadas geográficas do indicativo do fixo
            li_rc, lf_lat, lf_lng = self.__geo_fixo(li_rc)

            if li_rc < 0:
                # logger
                l_log = logging.getLogger("CCoordSys::new_coord")
                l_log.setLevel(logging.ERROR)
                l_log.error(u"<E05: fixo {} inexistente.".format(fs_cpo_a))

            # cai fora
            return li_rc, lf_lat, lf_lng

        # coordenada geográfica formato AISWEB ?(formato X:999:99:99.99)
        elif 'K' == fc_tipo:
            # latitude
            lf_lat = conv.parse_aisweb(str(fs_cpo_a))

            # longitude
            lf_lng = conv.parse_aisweb(str(fs_cpo_b))

            # ok
            return 0, lf_lat, lf_lng

        # coordenada geográfica formato decimal ?(formato +/-999.9999)
        elif 'L' == fc_tipo:
            # latitude
            lf_lat = float(fs_cpo_a)

            # longitude
            lf_lng = float(fs_cpo_b)

            # ok
            return 0, lf_lat, lf_lng

        # coordenada polar
        elif 'P' == fc_tipo:
            li_rc = -1

            lf_lat = -90.
            lf_lng = -180.

            # cai fora
            return li_rc, lf_lat, lf_lng

        # coordenada desconhecida
        elif 'X' == fc_tipo:
            li_rc = -1

            lf_lat = -90.
            lf_lng = -180.

            # cai fora
            return li_rc, lf_lat, lf_lng

        # senão, coordenada inválida
        else:
            # logger
            l_log = logging.getLogger("CCoordSys::new_coord")
            l_log.setLevel(logging.NOTSET)
            l_log.critical(
                u"<E06: tipo de coordenada({}) inválida".format(fc_tipo))

            # cai fora
            return -1, -90., -180.

        # return
        return -1, -90., -180.