
Pythonで学ぶ到達圏解析:吉川市のコンビニを例に
Pythonで学ぶ到達圏解析:吉川市のコンビニを例に
Pythonを使って吉川市のコンビニから「400m到達圏」を解析し、地図上での視覚化を行う方法を学びましたのでここで紹介します。
1. 必要なライブラリのインストール
最初に、必要なライブラリをインストールします。
# ライブラリのインストール
# 各ライブラリの説明:
# - pandas: データ操作や分析に使用する基本ライブラリ
# - geopandas: 地理データを扱うためのpandasの拡張ライブラリ
# - shapely: ジオメトリ操作(点、線、ポリゴンの計算など)に使用
# - osmnx: OpenStreetMapデータの取得・解析に便利なツール
# - folium: 地図データの視覚化を行うためのライブラリ
# - networkx: グラフデータの構築・解析に使用
!pip install pandas geopandas shapely osmnx folium networkx
2. コンビニの位置情報を収集
OpenStreetMapから吉川市内のコンビニの情報を収集します。
import requests
import json
import geopandas as gpd
from shapely.geometry import Point
# Overpass APIのクエリでコンビニの情報を収集
query = """
[out:json];
area["name"="吉川市"]["boundary"="administrative"]->.searchArea;
(node["shop"="convenience"](area.searchArea););
out body;
>;
out skel qt;
"""
url = "https://overpass-api.de/api/interpreter"
response = requests.get(url, params={'data': query})
data = response.json()
# データの変換
nodes = data['elements']
names, branches, coords = [], [], []
for node in nodes:
if node['type'] == 'node':
names.append(node['tags'].get('name', 'Unnamed'))
branches.append(node['tags'].get('branch', ''))
coords.append(Point(node['lon'], node['lat']))
# GeoDataFrameに変換
gdf = gpd.GeoDataFrame({'name': names, 'branch': branches, 'geometry': coords}, crs='EPSG:4326')
yoshikawa_coord = [(point.y, point.x) for point in gdf.geometry]
重要点: Overpass APIのクエリを使い、吉川市内のコンビニの情報を収集しました。位置情報は経度と緯度で指定されます。
3. コンビニ情報を地図にプロット
import folium
# 地図の中心座標
center_lat = gdf.geometry.iloc[0].y
center_lon = gdf.geometry.iloc[0].x
folium_map = folium.Map(location=[center_lat, center_lon], zoom_start=14)
# コンビニを地図上に表示
for _, row in gdf.iterrows():
folium.CircleMarker(
location=[row.geometry.y, row.geometry.x],
radius=8,
color='red',
fill=True,
fill_color='red',
fill_opacity=0.6
).add_to(folium_map)
# 地図の表示
folium_map
重要点: foliumを使い、コンビニの位置を地図上にプロットしました。
4. 吉川市の道路データの収集
import osmnx as ox
# 吉川市の道路データを収集
place_name = "Yoshikawa, Japan"
G = ox.graph_from_place(place_name, network_type='walk')
nodes, edges = ox.graph_to_gdfs(G)
# 道路の地図表示
center_lat = nodes["y"].mean()
center_lon = nodes["x"].mean()
folium_map = folium.Map(location=[center_lat, center_lon], zoom_start=12)
for _, row in edges.iterrows():
geom = row["geometry"]
if geom.geom_type == "LineString":
folium.PolyLine(
locations=[(lat, lon) for lon, lat in geom.coords],
color="blue",
weight=2
).add_to(folium_map)
folium_map
重要点: osmnxを使い、歩行者用の道路情報を収集しました。
5. 400m到達圏の計算
import networkx as nx
import pandas as pd
# 400m到達圏を計算
all_polygons, all_edges = [], []
meters = 400
for coord in yoshikawa_coord:
nearest_node = ox.distance.nearest_nodes(G, coord[1], coord[0])
subgraph = nx.ego_graph(G, nearest_node, radius=meters, distance='length')
nodes, edges = ox.graph_to_gdfs(subgraph)
convex_hull = nodes.geometry.unary_union.convex_hull
all_polygons.append({'geometry': convex_hull})
all_edges.append(edges[['geometry']])
# GeoDataFrameに変換
polygons_gdf = gpd.GeoDataFrame(all_polygons, crs='EPSG:4326')
edges_gdf = gpd.GeoDataFrame(pd.concat(all_edges, ignore_index=True), crs='EPSG:4326')
重要点: コンビニごとに、400mの道路を調べ、それらを包括する多角形を作成しました。
6. 到達圏の視覚化
from folium import GeoJson
# 到達圏を視覚化
folium_map = folium.Map(location=[center_lat, center_lon], zoom_start=14)
# 到達圏を蒼色の領域で表示
for _, row in polygons_gdf.iterrows():
GeoJson(row['geometry'], style_function=lambda x: {
'fillColor': 'blue', 'color': 'blue', 'weight': 2, 'fillOpacity': 0.4
}).add_to(folium_map)
# 到達圏内の道路を表示
for _, row in edges_gdf.iterrows():
GeoJson(row['geometry'], style_function=lambda x: {
'color': 'black', 'weight': 1
}).add_to(folium_map)
# コンビニ位置も表示
for _, row in gdf.iterrows():
folium.CircleMarker(
location=[row.geometry.y, row.geometry.x],
radius=8,
color='red',
fill=True,
fill_color='red',
fill_opacity=0.6
).add_to(folium_map)
# 地図をHTMLに保存
folium_map.save("yoshikawa_reachability.html")
folium_map
重要点: 到達圏を蒼色の領域、到達圏内の道路を黒線で表示しました。さらに、HTMLとして保存可能にしました。

OpenStreetMapで取得可能なデータ
OpenStreetMapはさまざまな地理データを提供しています。
1. 施設情報(POI: Points of Interest)
コンビニ、レストラン、病院、学校などの場所
クエリ例:
node["shop"="convenience"];
2. 道路データ
道路の種類(歩行者専用道路、高速道路など)
クエリ例:
way["highway"="footway"];
3. 建物データ
建物の種類や形状(住宅、オフィスビルなど)
クエリ例:
way["building"="house"];
4. 自然環境データ
川、湖、森林など
クエリ例:
way["natural"="water"];
5. 行政区画データ
市町村や国境などの境界線
クエリ例:
relation["boundary"="administrative"];
6. 交通関連データ
鉄道、バス路線、信号機、駐車場など
クエリ例:
node["railway"="station"];
まとめ
今回は、Pythonを使って吉川市内のコンビニの400m到達圏を計算し、地図上で視覚化しました。到達圏解析は、マーケティングや都市計画に役立つ手法です。