見出し画像

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到達圏を計算し、地図上で視覚化しました。到達圏解析は、マーケティングや都市計画に役立つ手法です。

いいなと思ったら応援しよう!