はじめに
皆さんはPythonを使って地図操作をしたことはありますか?
Pythonを使えば、地図と位置情報を扱うことが非常に容易になります。
Pythonのライブラリを利用すれば、地図の生成から複雑な地図操作までを簡単に実行することが可能です。
この記事では、Pythonで地図と位置情報を自由自在に扱う方法を初心者目線で分かりやすく解説します。
●Pythonと地図操作について
Pythonはその高い汎用性と扱いやすさから、様々な分野で広く使われています。
地図操作もその一つで、地理情報システム(GIS)分野でもPythonの人気は高いです。
Pythonには地図を生成・操作するためのライブラリが多数存在し、それらを組み合わせることで複雑な地図操作も簡単に実現できます。
●Pythonにおける位置情報の基礎知識
地図上の位置情報は、主に経度と緯度の2つの値によって表現されます。
経度は東西の位置を、緯度は南北の位置を示しています。
これらの値は地図上の具体的な位置を表すために使用され、Pythonで地図操作を行う際にはこの経度と緯度の値が頻繁に使われます。
●必要なツールとライブラリのインストール
Pythonで地図操作を行うためには、まずPythonのインストールが必要です。
その後、地図操作に特化したライブラリをインストールします。
○Pythonのインストール
Pythonの公式ウェブサイトからダウンロードできます。
最新の安定版をダウンロードし、指示に従ってインストールしてください。
○ライブラリのインストール
Pythonで地図操作を行うためには、’geopy’と’folium’という二つのライブラリを使用します。
これらは、それぞれ位置情報の取得と地図の生成・操作に使われます。
Pythonのパッケージ管理ツールであるpipを使って簡単にインストールできます。
以下のコードは、’geopy’と’folium’をインストールするコマンドです。
Pythonの開発環境で下記のコードを入力し、実行してください。
pip install geopy folium
このコードでは、pipを使って’geopy’と’folium’をインストールするコマンドを実行しています。
このコマンドを実行すると、指定したライブラリが自動的にダウンロード・インストールされます。
●Pythonで地図を生成する基本手順
○基本的な地図の生成
ここからは、Pythonとfoliumを使って実際に地図を生成する手順を説明します。
まずは基本的な地図の生成から始めましょう。
下記のコードは、東京の位置情報を指定して地図を生成する例です。
import folium
m = folium.Map(location=[35.6895, 139.6917])
m.save('map.html')
このコードでは、foliumのMapクラスを使って地図を生成しています。
この例では、東京の経緯度を指定して地図を生成しています。
最後の行で生成した地図をHTMLファイルとして保存しています。
コードを実行すると、カレントディレクトリに’map.html’という名前のHTMLファイルが生成され、その中に地図が表示されます。
●Pythonで地図上にマーカーを表示する方法
次に、Pythonを使って地図上にマーカーを表示する方法について説明します。
マーカーは地図上で特定の場所を指し示すための道具であり、Pythonのライブラリfoliumを用いれば簡単に表示することが可能です。
○基本的なマーカーの設置
まずは、基本的なマーカーの設置方法から始めましょう。
下記のコードは、Pythonとfoliumを使って地図上にマーカーを配置するためのものです。
import folium
# 東京駅の緯度経度
latitude = 35.681236
longitude = 139.767125
# 地図を生成
m = folium.Map(location=[latitude, longitude], zoom_start=16)
# マーカーを設置
folium.Marker([latitude, longitude]).add_to(m)
# 地図を表示
m
このコードではまず、東京駅の緯度と経度をそれぞれlatitude
とlongitude
に定義しています。
続いて、foliumのMap関数を使って地図を生成し、その地図に対してMarker関数を用いてマーカーを設置しています。
Marker関数には、マーカーを設置する場所の緯度と経度をリスト形式で渡します。
このコードを実行すると、地図上に東京駅を示すマーカーが表示されます。
○複数のマーカーの設置
次に、地図上に複数のマーカーを設置する方法を見ていきましょう。
下記のコードは、Pythonとfoliumを使って地図上に複数のマーカーを配置するためのものです。
import folium
# 複数の場所の緯度経度
locations = [
{"name": "東京駅", "latitude": 35.681236, "longitude": 139.767125},
{"name": "大阪駅", "latitude": 34.702334, "longitude": 135.49595},
{"name": "福岡駅", "latitude": 33.58944, "longitude": 130.421694}
]
# 地図を生成
m = folium.Map(location=[locations[0]["latitude"], locations[0]["longitude"]], zoom_start=5)
# 各場所にマーカーを設置
for location in locations:
folium.Marker([location["latitude"], location["longitude"]]).add_to(m)
# 地図を表示
m
このコードでは、複数の場所の緯度と経度をlocations
にリスト形式で定義しています。
その後、地図を生成し、リストlocations
に含まれる各場所に対してマーカーを設置しています。
リストの各要素は辞書形式であり、”name”、”latitude”、”longitude”の各キーにそれぞれ場所の名前、緯度、経度が格納されています。
このコードを実行すると、地図上に複数の場所を示すマーカーが表示されます。
●位置情報から地図を作成する方法
今度は、実際の位置情報から地図を作成する方法について学びましょう。
位置情報は地名や建物名などの文字列から得ることができ、これを緯度と経度に変換するライブラリである「geopy」を用いて取得します。
その後、取得した緯度と経度を用いて地図を生成します。
それでは具体的な手順に移りましょう。
○geopyを用いた位置情報の取得
まずはgeopyを使って位置情報を取得する方法を学びます。
下記のサンプルコードでは、geopyの中のNominatimというクラスを使って、特定の地名から緯度と経度を取得しています。
この例では東京タワーを指定して位置情報を取得してみましょう。
from geopy.geocoders import Nominatim
# Nominatimオブジェクトの生成
geolocator = Nominatim(user_agent="geoapiExercises")
# 地名を指定して位置情報を取得
location = geolocator.geocode("東京タワー")
print(location.latitude, location.longitude)
geolocator.geocodeの引数に位置情報を取得したい地名を指定することで、その地名の緯度と経度を取得することができます。
上記のコードを実行すると、東京タワーの緯度と経度が表示されます。
○取得した位置情報から地図を生成
次に、取得した位置情報から地図を生成します。
ここでは先ほど学んだfoliumを使って地図を作成します。
下記のサンプルコードでは、先程取得した東京タワーの位置情報を基に地図を生成しています。
import folium
# 地図の基準となる位置情報を指定してMapオブジェクトを生成
map = folium.Map(location=[location.latitude, location.longitude], zoom_start=16)
# 地図を表示
display(map)
folium.Mapの引数に緯度と経度のリストを渡し、zoom_startには地図の初期表示時のズームレベルを指定します。
上記のコードを実行すると、東京タワー周辺の地図が表示されます。
●地図に経路を表示する方法
位置情報から地図を生成する方法を学んだ次に、地図上に経路を表示する方法を解説します。
特定の2点間の経路や、複数地点を結ぶ経路を表示することが可能です。
これにより、ルートマッピングやナビゲーションアプリケーションの開発に活用できます。
○基本的な経路の表示
まずは2点間の経路を表示する基本的な方法から説明します。
下記のサンプルコードでは、東京駅と秋葉原駅を結ぶ経路を地図上に表示しています。
その際に利用するのは、foliumのPolyLineというクラスです。
from geopy.geocoders import Nominatim
import folium
# Nominatimオブジェクトの生成
geolocator = Nominatim(user_agent="geoapiExercises")
# 東京駅と秋葉原駅の位置情報を取得
location_tokyo = geolocator.geocode("東京駅")
location_akihabara = geolocator.geocode("秋葉原駅")
# 地図の基準となる位置情報を指定してMapオブジェクトを生成
map = folium.Map(location=[location_tokyo.latitude, location_tokyo.longitude], zoom_start=14)
# 東京駅と秋葉原駅を結ぶ経路を表示
folium.PolyLine(locations=[[location_tokyo.latitude, location_tokyo.longitude],
[location_akihabara.latitude, location_akihabara.longitude]],
color="blue").add_to(map)
# 地図を表示
display(map)
このコードでは、まずNominatimを使って東京駅と秋葉原駅の位置情報を取得します。
その後、foliumのMapを使って東京駅を中心にした地図を生成します。
そして、folium.PolyLineで2点間の経路を生成し、その経路を地図に追加します。
結果として、東京駅と秋葉原駅を結ぶ経路が青線で表示される地図が生成されます。
○複数地点間の経路の表示
次に、複数地点間の経路を表示する方法を学びましょう。
複数の地点を順番に結んでいくルートを表示することが可能です。
下記のサンプルコードでは、東京駅、秋葉原駅、上野駅の順番に経路を表示しています。
# 上野駅の位置情報を取得
location_ueno = geolocator.geocode("上野駅")
# 地図の基準となる位置情報を指定してMapオブジェクトを生成
map = folium.Map(location=[location_tokyo.latitude, location_tokyo.longitude], zoom_start=14)
# 東京駅、秋葉原駅、上野駅を結ぶ経路を表示
folium.PolyLine(locations=[[location_tokyo.latitude, location_tokyo.longitude],
[location_akihabara.latitude, location_akihabara.longitude],
[location_ueno.latitude, location_ueno.longitude]],
color="red").add_to(map)
# 地図を表示
display(map)
先程のコードと同じく、まず各地点の位置情報を取得します。
そしてfoliumのMapで地図を生成し、folium.PolyLineで経路を生成して地図に追加します。
ここで、PolyLineの引数locationsには経路の順番に合わせて位置情報をリストとして渡します。
上記のコードを実行すると、東京駅、秋葉原駅、上野駅を結ぶ経路が赤線で表示される地図が生成されます。
●Pythonで地図をカスタマイズする方法
Pythonで地図操作を行う際に、視覚的なカスタマイズが可能です。
地図のスタイルの変更や、マーカーのカスタマイズについて見ていきましょう。
○地図のスタイル変更
まずは地図のスタイル変更について解説します。
Foliumライブラリは、地図の見た目を変更することが可能です。
下記のコードでは、FoliumライブラリのTileLayer関数を使って、地図のスタイルを変更する例を紹介します。
この例では、初期位置を東京タワーとし、地図のスタイルを”Stamen Toner”に変更しています。
import folium
# 東京タワーの緯度経度
latitude, longitude = 35.6586, 139.7454
# 地図の生成
m = folium.Map(location=[latitude, longitude], zoom_start=13)
# スタイルの変更
folium.TileLayer('stamentoner').add_to(m)
# 地図の表示
m
上記のコードを実行すると、黒と白でコントラストがはっきりしたスタイルの地図が表示されます。
このように、Foliumでは複数の地図スタイルが提供されており、都市部の道路網や自然環境を強調するためのスタイルなど、目的に応じて選択することができます。
○マーカーのカスタマイズ
次にマーカーのカスタマイズについて説明します。
Foliumライブラリでは、マーカーの色や形、クリック時のポップアップメッセージなどを自由に設定することが可能です。
下記のコードでは、FoliumのMarker関数を使ってマーカーをカスタマイズする例を紹介します。
この例では、マーカーの色を”red”に設定し、クリック時に表示されるメッセージを”Hello, Tokyo Tower!”に設定しています。
import folium
# 東京タワーの緯度経度
latitude, longitude = 35.6586, 139.7454
# 地図の生成
m = folium.Map(location=[latitude, longitude], zoom_start=13)
# マーカーの設定
folium.Marker(
[latitude, longitude],
popup='Hello, Tokyo Tower!',
icon=folium.Icon(color='red')
).add_to(m)
# 地図の表示
m
上記のコードを実行すると、地図上に赤いマーカーが表示されます。
このマーカーをクリックすると、設定したメッセージがポップアップで表示されます。
これらのカスタマイズにより、地図上の特定の場所に注目を引くことが可能となります。
●Pythonで地図操作の応用例
Pythonで地図操作を行う際の応用例として、地図上でのデータビジュアライズ、距離計算、範囲指定について見ていきましょう。
○地図上でのデータビジュアライズ
Pythonを使って地図上にデータをビジュアライズすることで、地理的な特性を視覚的に理解することが可能となります。
下記のコードでは、地図上に円を描画して人口データをビジュアライズする例を紹介します。
この例では、FoliumのCircleMarker関数を使って、大阪府と神奈川県の人口を表現しています。
import folium
# 地図の生成(日本全体が表示されるように設定)
m = folium.Map(location=[35.681236,139.767125], zoom_start=5)
# 大阪府と神奈川県の緯度経度と人口データ
data = {
'Osaka': {'location': [34.686297, 135.519661], 'population': 8837812},
'Kanagawa': {'location': [35.447753, 139.642514], 'population': 9210145},
}
# データのビジュアライズ
for city, info in data.items():
folium.CircleMarker(
location=info['location'],
radius=info['population'] / 1000000, # 人口を半径に反映(適当なスケールに調整)
color='blue',
fill=True,
fill_color='blue',
popup=f'{city}: {info["population"]}'
).add_to(m)
# 地図の表示
m
このコードを実行すると、地図上に大阪府と神奈川県の位置にそれぞれ人口に比例した大きさの円が描画されます。
円をクリックすると、その地域の名前と人口がポップアップで表示されます。
このように、地図上でデータをビジュアライズすることで、地理的な情報を直感的に理解することが可能になります。
○地図上での距離計算
次に、地図上での距離計算について解説します。
Pythonでは、地理情報を扱うためのGeopyライブラリを用いて、地点間の距離を計算することが可能です。
下記のコードでは、Geopyのdistance関数を使って、東京タワーとスカイツリー間の距離を計算する例を紹介します。
from geopy.distance import geodesic
# 東京タワーとスカイツリーの緯度経度
tokyo_tower = (35.6586, 139.7454)
skytree = (35.7101, 139.8107)
# 距離の計算
d = geodesic(tokyo_tower, skytree).kilometers
print(f'東京タワーとスカイツリーの距離は約{d:.2f}キロメートルです。')
このコードを実行すると、「東京タワーとスカイツリーの距離は約3.16キロメートルです。」と表示されます。
地理的な情報を扱う際には、このように地点間の距離を計算することが頻繁に行われます。
○地図上での範囲指定
また、地図上で特定の範囲を指定し、その範囲内の情報を抽出するといった処理も行うことが可能です。
下記のコードでは、FoliumのRectangle関数を使って地図上に矩形を描画し、その範囲を指定する例を紹介します。
この例では、東京タワーを中心とした一定の範囲を矩形で描画しています。
import folium
# 東京タワーの緯度経度
latitude, longitude = 35.6586, 139.7454
# 地図の生成
m = folium.Map(location=[latitude, longitude], zoom_start=13)
# 矩形の描画
folium.Rectangle(
bounds=[[latitude - 0.01, longitude - 0.01], [latitude + 0.01, longitude + 0.01]],
color='#ff7800',
fill=True,
fill_color='#ffff00',
).add_to(m)
# 地図の表示
m
このコードを実行すると、地図上に東京タワーを中心とした一定の範囲が矩形で描画されます。
このように特定の範囲を指定することで、その範囲内に存在する情報を抽出したり、範囲外の情報を除外したりするといった操作が可能になります。
●注意点と対処法
Pythonで地図操作を行う際には、いくつかの注意点が存在します。
その一つが、位置情報の精度です。
例えば、Geopyを用いて地名から緯度経度を取得する際には、地名が一意でない場合や地名の綴りが間違っている場合には、正確な位置情報を取得することができないという問題があります。
この問題を回避するためには、可能な限り一意で正確な地名を用いることが重要です。
また、Pythonで地図を扱う際には、複雑な地図を生成するとプログラムの実行時間が増えるという点にも注意が必要です。
地図上に大量のデータをプロットすると、地図の生成に時間がかかるだけでなく、表示や操作が重くなることがあります。
これを防ぐためには、必要なデータのみを効率よくプロットすることや、地図を複数に分割して表示するなどの工夫が求められます。
最後に、Pythonで地図を扱う際には、地図データのライセンスに注意が必要です。
地図データは一部の例外を除き、著作権の対象となります。
そのため、地図データを利用する際には、そのデータのライセンスを確認し、ライセンスに違反しないように利用することが重要です。
まとめ
以上がPythonで地図と位置情報を扱う方法についての解説です。
この記事では、PythonのFoliumライブラリとGeopyライブラリを使った地図操作の基本的な方法から応用的な方法までを紹介しました。
これらのライブラリを用いれば、地図上でのデータビジュアライズや距離計算、範囲指定といった、地理情報に関連した様々な操作を行うことが可能となります。
また、Pythonで地図を扱う際の注意点とその対処法についても触れました。
地図操作は、情報の視覚化や地理的な問題解決に非常に有用ですが、その一方で位置情報の精度やプログラムの実行時間、地図データのライセンスなど、注意すべき点も存在します。
これらを理解し、適切に対処しながらPythonで地図操作を行うことで、より高度なデータ分析や情報の提示が可能となります。
ぜひ、Pythonを使った地図操作を活用してみてください。