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))
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
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.
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.