Published Date : 2020年9月12日8:33

【python】郵便番号から住所と緯度経度を取得してMapにプロットする: Part 2 ~ plotly and mapbox ~
【python】Gets the address and latitude and longitude from the postal code and plots it on Map: Part 2 ~ plotly and mapbox ~


This blog has an English translation


YouTubeにアップした動画、「【python】郵便番号から住所と緯度経度を取得してMapにプロットする: Part 2 ~ plotly and mapbox ~」の補足説明の記事です。

Here's a little more about the 「【python】Gets the address and latitude and longitude from the postal code and plots it on Map: Part 2 ~ plotly and mapbox ~」 video I uploaded to YouTube.


目次

Table of Contents




① 動画の説明
① Video Description



郵便番号から住所と緯度経度を取得してMapにプロットする パート2

Gets the address and latitude and longitude from the zip code and plots it on Map Part 2

Part2の今回は前回収集した事業所の住所を緯度経度に変換して、

This time in Part 2, we'll convert the last collected location address to latitude and longitude,

その座標データを、PythonのplotlyとMapBox APIを利用して地図にプロットしていきましょう。

and plot that coordinate data on a map using Python's plotly and MapBox APIs.

まずは前回の取得したの住所を緯度と経度に変換しましょう。

First of all, let's convert the address you got last time to latitude and longitude.

住所をクエリとして送ると緯度と経度を返してくれるサイトを使わせて頂きます。

I will use a site that will return the latitude and longitude if I send the address as a query.

必要なモジュールをインポートします。

Import the required modules.

前回のCSVファイルをpandasを使ってインポートします。

Import the previous CSV file using pandas.

予め、CSSセレクターを変数として用意しておきます。

Prepare the CSS selector as a variable in advance.

後はベースとなるURLにクエリとして住所を繋げて、サイトにリクエストを送るだけです。

All you have to do is attach the address as a query to the base URL and send the request to the site.

結果のリストの中の辞書のキーを確認します。

Check the dictionary keys in the results list.

座標のデータフレームを作成します。

Creates a coordinate dataframe.

元のデータフレームから先ほどのクエリを送った行数分だけilocを使って抜き出します。今回は10行です。

From the original dataframe, use iloc to extract just the number of lines you sent. 10 lines this time.

そしてconcatメソッドを使って二つのデータフレームを連結させます。

Then use the concat method to concatenate the two dataframes.

それをまたCSVファイルにして保存します。

Save it as a CSV file again.


郵便番号から緯度と経度を検索する
find latitude and longitude by zip code

import pandas as pd
import time
import re
import requests
from bs4 import BeautifulSoup

csv_path = "path to your csv file"

df = pd.read_csv(csv_path)

#サーバーに負担がかかるのでURLは隠します
#The URL is hidden because it is a burden to the server.
base_url = "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


coordinate_css_selector = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

results = []

for i in range(10):
    coordinate_dic = {}

    query = df['住所'][i]
    #全角スペースを取り除き、建物名等を除外する。
    #Remove double-byte spaces and exclude building names, etc.
    query = query.split('\u3000')[0]

    res = requests.get(base_url+query)
    soup = BeautifulSoup(res.content, 'lxml')

    print(query)

    coordinate = soup.select(coordinate_css_selector)

    lat = coordinate[0].text
    lon = coordinate[1].text

    coordinate_dic['緯度'] = lat
    coordinate_dic['経度'] = lon

    results.append(coordinate_dic)

    time.sleep(3)

coordinate_df = pd.DataFrame(results, columns=results[0].keys())
df_copy = df.iloc[:10, ]
new_df = pd.concat([df_copy, coordinate_df], axis=1)
new_df.to_csv('address_and_coordinate.csv', index=None)

ではMapBoxのパブリックトークンを利用できるようにしましょう。

Now let's make MapBox public tokens available.

ブラウザでMapBoxを検索して、サインインします。

Search for MapBox in the browser and sign in.

そしてダッシュボードの[Tokens]をクリックします。

Then click [Tokens] on the dashboard.

表示されている[Default public token]をコピーしておきます。

Copy the displayed [Default public token].

plotlyをpipを使ってインストールします。

Install plotly using pip.

先ほどコピーしたMapBoxのパブリックトークンを変数に入れます。

Put the MapBox public token you just copied into a variable.

必要なライブラリをインポートします。

Import the required libraries.

先ほど保存した座標付きのCSVファイルをpandasでインポートします。

Import the CSV file with coordinates that you saved earlier using by pandas.

まずは一か所だけ地図にプロットしてテストしてみましょう。

Let's test it by plotting only one place on the map.

このように表示されれば成功です。

If it looks like this, it is successful.

続いて10か所の事業所の全てを地図にプロットしてみましょう。

Next, let's plot all 10 offices on a map.

やり方は簡単です。

It's easy to do.

引数のlatitudeとlongitudeにデータフレームの緯度と経度のリストを渡して、

Just pass the latitude and longitude arguments as a list of the latitude and longitude of the dataframe,

同じく引数のテキストにもデータフレームの事業所の名前をリストで渡すだけです。

and the text argument as a list of the location of the dataframe.

zoomレベルは大きい数字になれば、より大きくズームされます。

The higher the zoom level, the greater the zoom.

今回は10か所だけですが、100か所、1000か所と増やしていくことも可能です。

There are only 10 places this time, but we can increase it to 100 or 1000 places.


plotly and mapbox

import plotly.graph_objects as go
import pandas as pd

csv_path = 'address_and_coordinate.csv'

df = pd.read_csv(csv_path)

lat = df['緯度'][0]
lon = df['経度'][0]
marker_text = df['名前'][0]

mapbox_access_token = 'your mapbox public access token'

# 一つのマーカーでテストする
# Test with a single marker

fig = go.Figure(go.Scattermapbox(
    lat=[lat],
    lon=[lon],
    mode='markers',
    marker=go.scattermapbox.Marker(
        size=14
    ),
    text=[marker_text],
))

fig.update_layout(
    hovermode='closest',
    mapbox=dict(
        accesstoken=mapbox_access_token,
        bearing=0,
        # 皇居の緯度と経度を中心座標にする
        # make the latitude and longitude of the Imperial Palace central coordinates
        center=go.layout.mapbox.Center(
            lat=35.685175,
            lon=139.7528
        ),
        pitch=0,
        zoom=12
    )
)

fig.show()

# 複数のマーカー
# multiple markers

fig = go.Figure(go.Scattermapbox(
    lat=df['緯度'].tolist(),
    lon=df['経度'].tolist(),
    mode='markers',
    marker=go.scattermapbox.Marker(
        size=9
    ),
    text=df['名前'].tolist(),
))

fig.update_layout(
    autosize=True,
    hovermode='closest',
    mapbox=dict(
        accesstoken=mapbox_access_token,
        bearing=0,
        # 皇居の緯度と経度を中心座標にする
        # make the latitude and longitude of the Imperial Palace central coordinates
        center=dict(
            lat=35.685175,
            lon=139.7528
        ),
        pitch=0,
        zoom=12
    ),
)

fig.show()



以上です。お疲れ様です。

That's all. Thank you for your hard work.