> For the complete documentation index, see [llms.txt](https://docs.chatlayer.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/comece-rapido/bot-templates/find-nearest-location.md).

# Encontrar local mais próximo

Com este template, seus clientes podem encontrar facilmente a filial mais próxima da sua empresa simplesmente perguntando ao seu chatbot! Depois de pedir o endereço do usuário, o bot vai consultar um banco de dados externo (Airtable), que contém os dados de todas as localizações das suas filiais. Em seguida, ele calculará qual local fica mais próximo do endereço do usuário usando a API do Google Maps. Por fim, o bot exibirá o resultado no Google Maps, dentro de um iFrame.

Continue lendo para aprender como você pode personalizar este template para a sua própria organização.

## Como personalizar este modelo

{% hint style="info" %}
Certifique-se sempre de [atualizar o NLP](https://docs.chatlayer.ai/understanding-users/natural-language-processing-nlp#updating-the-nlp) após carregar um modelo!
{% endhint %}

Este template usa dois serviços de terceiros:

1. Airtable, como banco de dados para locais das filiais
2. API do Google Maps, para localizar o endereço do usuário

Para permitir que seu bot interaja com esses serviços, você precisará de uma chave de API para cada um e configurá-las nos blocos de Ação em que o bot faz as chamadas de API.\`

#### Configurando sua própria base no Airtable

Se você nunca trabalhou com o Airtable antes, pode se cadastrar gratuitamente [aqui](https://airtable.com/signup) e aprender o básico [aqui](https://support.airtable.com/hc/en-us/articles/360021518753-Getting-started-starting-with-the-base-ics).

Para cada local da sua organização, seu Airtable precisará de campos com as seguintes informações:

1. Nome da filial
2. Endereço
3. Latitude
4. Longitude

Quando você importar recentemente o template 'Nearest Location', ele será vinculado automaticamente a [este Airtable](https://airtable.com/invite/l?inviteId=invF76GY9tGp3hGyz\&inviteToken=224dcd7cbf041e3e39f7caefbbe6798f4dc4f5ef1643586d2a1a5cbcb286f1f3\&utm_source=email). Sinta-se à vontade para usá-lo em testes, mas certifique-se de substituí-lo quando começar a usar o bot para sua própria organização!

Para mais informações sobre como integrar o Airtable ao seu bot, confira [este tutorial](https://docs.chatlayer.ai/integrations/code-action/airtable).

{% hint style="info" %}
Está gerenciando os locais das suas filiais em outro banco de dados? Você pode vincular qualquer tipo de banco de dados a este bot, desde que ele tenha uma API. Leia mais sobre nossas integrações de API [aqui](/chatlayer-documentation-pt-br/integrateandcode/custom-back-end-integrations/integrations-101.md).
{% endhint %}

Abaixo está uma visão geral dos blocos principais em cada fluxo do bot. Aqui vamos mostrar como configurar a conexão com as APIs do Airtable e do Google Maps, bem como algumas outras dicas para personalizar este template para o seu negócio.

### Fluxo: Geral

#### Bloco: Pedir endereço

Neste bloco, o bot pede ao usuário o endereço dele e salva a resposta como uma variável: `user_address`.

#### Bloco: Localizador

Para que este template funcione, seu bot precisa conseguir acessar os dados de localização dos seus endereços de filial (no Airtable) e consultar o endereço do usuário (usando a API do Google Maps).

Este bloco usa uma Ação de Código para chamar tanto a API do Airtable quanto a API do Google Maps com o código JavaScript mostrado abaixo. Esse código pode parecer um pouco intimidador, mas não se preocupe, você só precisa alterar algumas informações!

```javascript
const allStations = await fetch(`https://api.airtable.com/v0/(YOUR_BASE_ID)/(YOUR_TABLE_NAME)`, { 
headers: {
Authorization: `Bearer (YOUR_AIRTABLE_API_KEY)`
}
}).then(r => r.json());
let re = / /g; 

const currLoc = args.user_address.replace(re, '+');
let minDistance = Number.MAX_SAFE_INTEGER; 
let nearestShop;
const chatlayer = ChatlayerResponseBuilder(); chatlayer.addSessionVariable('currLoc', currLoc); 
const addressFromMaps = await fetch(`https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=${currLoc}&inputtype=textquery&fields=geometry&key=(YOUR_GOOGLEMAPS_API_KEY)`).then(r=> r.json()); 
const geoLocation2 = { 
Latitude: addressFromMaps.candidates[0].geometry.location.lat, 
Longitude: addressFromMaps.candidates[0].geometry.location.lng, 
} 
//const geoLocation2 = {Latitude : "52.5001278", Longitude : "13.3121555"}; allStations.records.forEach(station=>{ 
const geoLocation1 = station.fields;
const lat = geoLocation1.Latitude - geoLocation2.Latitude; 
const lon = geoLocation1.Longitude - geoLocation2.Longitude; 
 
const val = Math.sqrt(Math.pow(lat, 2) + Math.pow(lon, 2)); if(minDistance>val){ 
minDistance = val; 
closestLocation = geoLocation1;
}
});

closestLocation.Address = closestLocation.Address.replace(/ /g, ' ');
chatlayer.addSessionVariable('closestLocation', closestLocation);
chatlayer.addSessionVariable('addressFromMaps', addressFromMaps); chatlayer.send();----------------------------------
```

Neste trecho de código, você deve personalizar estas três coisas:

1. **O link do Airtable**\
   Na URL na linha 1 do bloco de código, substitua `(YOUR_BASE_ID)` pelo ID da sua própria base no Airtable e `(YOUR_TABLE_NAME)` pelo nome ou ID da tabela que contém os dados da sua localização. Você pode encontrar os IDs da base e da tabela do seu Airtable [aqui](https://airtable.com/api), ou na URL da visualização da sua tabela.
2. **A chave de API do Airtable**\
   Na URL na linha 3, substitua `(YOUR_AIRTABLE_API_KEY)` pela sua própria chave de API do Airtable. Você pode encontrar a chave de API na sua [página da conta Airtable](https://airtable.com/account).
3. **A chave de API do Google Maps**\
   Na linha 13, substitua `(YOUR_GOOGLEMAPS_API_KEY)` pela sua própria chave de API do Google.

#### Bloco: Exibir endereço

Neste bloco, o bot mostra o nome e o endereço do local mais próximo encontrado no banco de dados. O nome é armazenado em `closestLocation.Name` variável e o endereço em `closestLocation.Address`.

#### Bloco: Mostrar localização no mapa

Neste bloco, o bot mostra o local da filial mais próxima em um mapa, dentro de um iFrame. No campo Source da ação iFrame, substitua também `(YOUR_GOOGLEMAPS_API_KEY)` pela sua própria chave de API do Google.

![O bloco Mostrar localização no mapa com a parte da URL de origem a ser alterada destacada em vermelho](/files/6105770b801f40ce7db01b8e73fba2c7069811d8)

#### Bloco: Limpar endereço do usuário

Por fim, neste bloco o bot limpa a variável `user_address` para que o usuário possa iniciar o fluxo novamente e usar outro endereço.

### Conecte o fluxo a outros fluxos

Agora que você adicionou este novo fluxo, certifique-se de conectá-lo a outros fluxos. Por exemplo, se este for um caso de uso importante para o seu bot, certifique-se de mencioná-lo na introdução.

####

Pronto, agora seu bot pode encontrar os locais mais próximos do endereço do usuário! 👏


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.chatlayer.ai/chatlayer-documentation-pt-br/comece-rapido/bot-templates/find-nearest-location.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
