<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: pip install pygineer 🦄</title>
    <description>The latest articles on Forem by pip install pygineer 🦄 (@pygineering).</description>
    <link>https://forem.com/pygineering</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F912607%2Fd947ec30-2687-4b8e-a482-5b581b02ad86.jpg</url>
      <title>Forem: pip install pygineer 🦄</title>
      <link>https://forem.com/pygineering</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pygineering"/>
    <language>en</language>
    <item>
      <title>Tutorial: Geolocalização utilizando Bing Maps e Geocoder (Python)</title>
      <dc:creator>pip install pygineer 🦄</dc:creator>
      <pubDate>Tue, 28 Feb 2023 13:26:15 +0000</pubDate>
      <link>https://forem.com/pygineering/tutorial-geolocalizacao-utilizando-bing-maps-e-geocoder-python-24dj</link>
      <guid>https://forem.com/pygineering/tutorial-geolocalizacao-utilizando-bing-maps-e-geocoder-python-24dj</guid>
      <description>&lt;p&gt;Neste tutorial, você vai aprender como encontrar as &lt;strong&gt;coordenadas&lt;/strong&gt; (latitude e longitude) de um endereço a partir do valor de &lt;strong&gt;CEP&lt;/strong&gt; em poucas linhas de código, utilizando a API do &lt;strong&gt;Bing Maps&lt;/strong&gt; e a biblioteca Python &lt;strong&gt;Geocoder&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A ideia do tutorial surgiu quando tive que implementar uma solução parecida em um projeto na minha equipe, e passei um bom tempo tentando encontrar a melhor solução para &lt;strong&gt;endereços brasileiros&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para que possamos utilizar dados anonimizados, vamos nos basear no dataset do projeto open source &lt;a href="https://www.kaggle.com/datasets/openaddresses/openaddresses-south-america?select=brazil.csv"&gt;&lt;strong&gt;OpenAddresses&lt;/strong&gt;&lt;/a&gt;, que fornece endereços em diferentes países ao redor do mundo, e, neste caso, olhando especificamente para a &lt;strong&gt;América do Sul&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No entanto, para nosso caso em específico, preparei um dataset que será utilizado neste tutorial: &lt;a href="https://drive.google.com/file/d/1g_giHhoJxr9LPOkLeAU68WFrjtuiDkCv/view?usp=sharing"&gt;address.csv&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  API Bing Maps
&lt;/h2&gt;

&lt;p&gt;Como a API fornecida pelo &lt;strong&gt;Google Maps&lt;/strong&gt; possui limitações para o plano gratuito, decidi optar pela API da &lt;a href="https://www.bingmapsportal.com/"&gt;&lt;strong&gt;Bing Maps&lt;/strong&gt;&lt;/a&gt;, que além de ser gratuita, tem uma forma muito intuitiva para a criação de chaves de acesso.&lt;/p&gt;

&lt;p&gt;No &lt;a href="https://www.bingmapsportal.com/"&gt;site&lt;/a&gt;, basta fazer o cadastro de usuário, caso ainda não possua uma conta registrada. Seremos então redirecionados para o portal &lt;strong&gt;Dev Center&lt;/strong&gt;. Lá, basta selecionar &lt;strong&gt;My account&lt;/strong&gt; &amp;gt; &lt;strong&gt;My keys&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1MkNow-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d3h27txy84uid5iimw46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1MkNow-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d3h27txy84uid5iimw46.png" alt="Image description" width="828" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No menu das chaves de acesso, clique para &lt;strong&gt;criar uma nova chave&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p2RR9iQz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kugog2mjjiim1copiv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p2RR9iQz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kugog2mjjiim1copiv6.png" alt="Image description" width="828" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para a criação da chave, você pode fornecer um &lt;strong&gt;nome&lt;/strong&gt; associado à sua aplicação, bem como a &lt;strong&gt;URL de acesso&lt;/strong&gt; (que não usaremos neste tutorial), o &lt;strong&gt;tipo de chave&lt;/strong&gt; e o &lt;strong&gt;tipo de aplicação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R-6EdiYI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ozkmxa8j104o2lvqxdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R-6EdiYI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ozkmxa8j104o2lvqxdn.png" alt="Image description" width="828" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após criada, a chave de acesso ficará disponível no menu &lt;strong&gt;My keys&lt;/strong&gt; para que possa ser utilizada nas suas aplicações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7J8b_ayy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x858ghwlalshla9idqpb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7J8b_ayy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x858ghwlalshla9idqpb.png" alt="Image description" width="828" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Colocando a mão na massa com Geocoder
&lt;/h2&gt;

&lt;p&gt;Tendo o valor da chave de acesso, podemos colocar a mão na massa. Para este tutorial, foi utilizado o &lt;strong&gt;Google Colab&lt;/strong&gt;, porém, você pode utilizar o &lt;strong&gt;Jupyter Notebook&lt;/strong&gt; ou o seu editor de texto/IDE preferidos.&lt;/p&gt;

&lt;p&gt;Começaremos com a transformação do dataset em um &lt;strong&gt;DataFrame pandas&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import pandas as pd

df_address = pd.read_csv('address.csv')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Faremos a instalação da biblioteca utilizando o pacote &lt;strong&gt;Pip&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!pip install geocoder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Por fim, utilizaremos o &lt;strong&gt;Geocoder&lt;/strong&gt; para criar duas novas colunas no nosso DataFrame para popular os valores das &lt;strong&gt;coordenadas&lt;/strong&gt; naquele determinado &lt;strong&gt;CEP&lt;/strong&gt;. A solução será iterar cada registro utilizando o método &lt;strong&gt;iterrows()&lt;/strong&gt; do &lt;strong&gt;pandas&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import geocoder

MY_KEY = '&amp;lt;put_api_access_key_here&amp;gt;'

df_address['latitude'] = ""
df_address['longitude'] = ""

for index, row in df_address.iterrows():
  g = geocoder.bing(location = (row['postcode']).replace('-', ''), 
                                postalCode = (row['postcode']).replace('-', ''), 
                                locality = row['city'], 
                                adminDistrict = row['state'], 
                                countryRegion = 'BRA', 
                                key = MY_KEY)

  df_address['latitude'].iloc[index] = g.lat
  df_address['longitude'].iloc[index] = g.lng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com isso, o resultado final será a &lt;strong&gt;informação completa&lt;/strong&gt; sobre cada endereço contido no DataFrame. Informações sobre coordenadas podem nos auxiliar para &lt;strong&gt;cálculo de distância entre endereços&lt;/strong&gt;, como por exemplo.&lt;/p&gt;

&lt;p&gt;Caso você queira exportar novamente para o formato &lt;strong&gt;CSV&lt;/strong&gt;, basta utilizar o método do pandas &lt;strong&gt;to_csv()&lt;/strong&gt;, também sendo possível aplicar o &lt;strong&gt;to_excel()&lt;/strong&gt; para gerar uma planilha eletrônica com a extensão “.xlsx”.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df_address.to_csv('complete_address.csv', index=False)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pronto! Muito simples, não é? :)&lt;/p&gt;

&lt;p&gt;Após algumas tentativas com diversas bibliotecas Python voltadas para geolocalização, a Geocoder foi a que funcionou melhor para o meu projeto, visto que é bem completa e possibilita a utilização de diversos provedores existentes por aí.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado do tutorial e que possa auxiliá-los em projetos futuros. Nos vemos por aí! 💜&lt;/p&gt;



&lt;p&gt;Para ler a documentação completa do &lt;strong&gt;Geocoder&lt;/strong&gt;, acesse o link a seguir:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://geocoder.readthedocs.io/" rel="noopener noreferrer"&gt;
      geocoder.readthedocs.io
    &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;Caso você queira o código completo, segue o link do notebook no &lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/patriciatozi/python-studies/blob/main/geolocation/Bing_Maps_and_Geocoder_Tutorial.ipynb"&gt;Bing_Maps_and_Geocoder_Tutorial.ipynb&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>geolocation</category>
      <category>geocoder</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
