@@ -116,7 +116,30 @@ def formata_data(data_str,formato = '%H:%M do dia %d/%m/%Y'):
116116 resultado = dt .strftime (formato )
117117 return resultado
118118
119+ def verifica_poligono (google_response ):
120+ """
121+ Filtra os resultados da resposta do Google Maps, retornando apenas os que estão dentro do retângulo.
122+ """
123+
124+ # Coordenadas do retângulo
125+ X0 , Y0 = - 43.27 , - 22.87 # sudoeste
126+ X1 , Y1 = - 43.23 , - 22.91 # nordeste
127+
128+ dados = google_response .json ()
129+ resultados_filtrados = []
130+
131+ def dentro_do_retangulo (lat , lng ):
132+ return Y1 <= lat <= Y0 and X0 <= lng <= X1
119133
134+ for resultado in dados .get ("results" , []):
135+ location = resultado .get ("geometry" , {}).get ("location" , {})
136+ lat = location .get ("lat" )
137+ lng = location .get ("lng" )
138+
139+ if lat is not None and lng is not None and dentro_do_retangulo (lat , lng ):
140+ resultados_filtrados .append (resultado )
141+ return resultados_filtrados
142+
120143def chamada_google_maps (* args , ** kwargs ):
121144 api_key = os .environ .get ("GOOGLE_MAPS_API_KEY" )
122145 if kwargs .get ("endereco" ):
@@ -128,42 +151,45 @@ def chamada_google_maps(*args, **kwargs):
128151 args = f'?latlng={ lat } ,{ lng } '
129152 else :
130153 raise ValueError ("Parâmetros insuficientes: é necessário 'endereco' ou 'latitude' e 'longitude'." )
131- url = f"https://maps.googleapis.com/maps/api/geocode/json{ args } &key={ api_key } "
154+ url = f"https://maps.googleapis.com/maps/api/geocode/json{ args } &bounds=-22.91,-43.27|-22.87,-43.23& key={ api_key } "
132155 response = requests .get (url )
133- # logger.debug(f"Resposta do Google Maps (texto): {response.status_code} - {response.text}")
134- return response
156+ if response .status_code == 200 :
157+ data = response .json ()
158+ logger .debug (f"Received data: { data } " )
159+ if data ["status" ] == "OK" :
160+ # logger.debug(f"Resposta do Google Maps (texto): {response.status_code} - {response.text}")
161+ response_filtered = verifica_poligono (response )
162+ return response_filtered
163+ else :
164+ logger .error (f"Erro na API do Google Maps: { data .get ('status' )} " )
165+ else :
166+ logger .error ("Erro HTTP na chamada à API do Google Maps" )
167+ return False
135168
136169def get_endereco_latlong (latitude ,longitude ):
137170 response = chamada_google_maps (latitude = latitude ,longitude = longitude )
138171 print (f"response do google maps:{ response } " )
139- if response .status_code == 200 :
140- data = response .json ()
141- logger .debug (f"Received data: { data } " )
142- if data ["status" ] == "OK" :
143- resultado = data ["results" ][0 ]
144- endereco = resultado .get ("formatted_address" , "Endereço não encontrado." )
145- return endereco
146- else :
147- logger .error (f"Erro na API do Google Maps: { data .get ('status' )} " )
172+ if response and len (response ) > 0 :
173+ resultado = response [0 ]
148174 else :
149- logger .error ("Erro HTTP na chamada à API do Google Maps" )
150- return False
175+ resultado = {}
176+ endereco = resultado .get ("formatted_address" , "" )
177+ return endereco
151178
152179
153180def get_endereco_texto (endereco ):
154- endereco_texto = re .sub (r'jacarezinho|jacare|rj|rio de janeiro' , '' , endereco , flags = re .IGNORECASE )
155- endereco_texto += ",bairro Jacarezinho, Rio de Janeiro, RJ"
156- logger .debug (f"Buscando endereço pelo texto: { endereco_texto } " )
157- response = chamada_google_maps (endereco = endereco_texto )
158- if response .status_code == 200 :
159- data = response .json ()
160- if data ["status" ] == "OK" and data ["results" ]:
161- resultado = data ["results" ][0 ]
162- endereco = resultado .get ("formatted_address" , "Endereço não encontrado." )
163- lat = resultado ["geometry" ]["location" ]["lat" ]
164- lng = resultado ["geometry" ]["location" ]["lng" ]
165- return ({'lat' :lat ,'lng' :lng ,'endereco' :endereco })
181+ # endereco_texto = re.sub(r'jacarezinho|jacare|rj|rio de janeiro', '', endereco, flags=re.IGNORECASE)
182+ # endereco_texto += ",bairro Jacarezinho, Rio de Janeiro, RJ"
183+ logger .debug (f"Buscando endereço pelo texto: { endereco } " )
184+ response = chamada_google_maps (endereco = endereco )
185+ print (f"response do google maps:{ response } " )
186+ if response and len (response ) > 0 :
187+ resultado = response [0 ]
188+ endereco = resultado .get ("formatted_address" , "" )
189+ lat = resultado ["geometry" ]["location" ]["lat" ] if "geometry" in resultado and "location" in resultado ["geometry" ] and "lat" in resultado ["geometry" ]["location" ] else None
190+ lng = resultado ["geometry" ]["location" ]["lng" ] if "geometry" in resultado and "location" in resultado ["geometry" ] and "lng" in resultado ["geometry" ]["location" ] else None
191+ resultado_dict = {'lat' :lat ,'lng' :lng ,'endereco' :endereco }
166192 else :
167- logger . error ( f"Erro na API do Google Maps: { data . get ( 'status' ) } - { data . get ( 'error_message' ) } " )
168- return False
193+ resultado_dict = {}
194+ return ( resultado_dict )
169195
0 commit comments