Skip to content

Commit 60b35d2

Browse files
committed
Melhora resultados de busca dos endereços com limitação retangular
1 parent c933461 commit 60b35d2

File tree

2 files changed

+55
-29
lines changed

2 files changed

+55
-29
lines changed

actions/actions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ def run(self, dispatcher, tracker, domain):
409409

410410
]
411411
else:
412-
logger.debug(f"Não encontrou endereço: {endereco}")
412+
logger.debug(f"Não encontrou endereço: {endereco_texto}")
413413
dispatcher.utter_message(text="Não consegui encontrar esse lugar.\nVocê pode tentar de novo.")
414414
return [FollowupAction("action_request_location")]
415415

actions/utils.py

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
120143
def 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

136169
def 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

153180
def 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

Comments
 (0)