import folium
import pandas as pd
from folium import plugins
from folium.features import DivIcon
url = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRE1NoYtNw1FmjRQ8wcdPkcE0Ryeoc2mfFkCQPHjzwL5CpwNKkLXnBl_F7c0LZjrtbLtRLH55ZVi6gQ/pub?gid=0&single=true&output=csv"
df = (
pd.read_csv(url, index_col=0, dtype=str)
.dropna(how="all")
.fillna("")
)
df
df["color"] = df["状況"].replace(
{"open": "green", "close": "red", "ready": "orange", "check": "gray"}
)
df["icon"] = df["状況"].replace(
{"open": "signal", "close": "remove", "ready": "wrench", "check": "search"}
)
df["場所"] = df["場所"].str.strip()
地図作成
map = folium.Map(
tiles=None,
location=[33.84167, 132.76611],
zoom_start=12,
)
folium.raster_layers.TileLayer(
tiles="https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png",
name="国土地理院",
attr='© <a href="https://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>',
).add_to(map)
folium.raster_layers.TileLayer(
tiles="https://cyberjapandata.gsi.go.jp/xyz/blank/{z}/{x}/{y}.png",
name="国土地理院(白地図)",
attr='© <a href="https://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>',
).add_to(map)
folium.raster_layers.TileLayer(
"https://cyberjapandata.gsi.go.jp/xyz/hillshademap/{z}/{x}/{y}.png",
name="国土地理院(陰影起伏図)",
attr="<a href='https://maps.gsi.go.jp/development/ichiran.html'>国土地理院</a>",
opacity=0.6,
).add_to(map)
folium.raster_layers.TileLayer(
"https://{s}.google.com/vt/lyrs=s,h&x={x}&y={y}&z={z}",
subdomains=["mt0", "mt1", "mt2", "mt3"],
name="Google Map(航空写真)",
attr="<a href='https://developers.google.com/maps/documentation' target='_blank'>© Google</a>",
opacity=0.8,
).add_to(map)
folium.raster_layers.TileLayer(
name="楽天モバイル(直近)",
tiles="https://gateway-api.global.rakuten.com/dsd/geoserver/4g2m/mno_coverage_map/gwc/service/gmaps?LAYERS=mno_coverage_map:all_map&FORMAT=image/png&TRANSPARENT=TRUE&x={x}&y={y}&zoom={z}",
fmt="image/png",
attr="楽天モバイルエリア",
tms=False,
overlay=True,
control=True,
opacity=1,
).add_to(map)
folium.raster_layers.TileLayer(
name="楽天モバイル(予定)",
tiles="https://gateway-api.global.rakuten.com/dsd/geoserver/4g4m/mno_coverage_map/gwc/service/gmaps?LAYERS=mno_coverage_map:all_map&FORMAT=image/png&TRANSPARENT=TRUE&x={x}&y={y}&zoom={z}",
fmt="image/png",
attr="楽天モバイルエリア",
tms=False,
overlay=True,
control=True,
opacity=1,
show=False,
).add_to(map)
folium.raster_layers.TileLayer(
name="楽天モバイル5G",
tiles="https://gateway-api.global.rakuten.com/dsd/geoserver/5g/mno_coverage_map/gwc/service/gmaps?LAYERS=mno_coverage_map:all_map&FORMAT=image/png&TRANSPARENT=TRUE&x={x}&y={y}&zoom={z}",
fmt="image/png",
attr="楽天モバイルエリア",
tms=False,
overlay=True,
control=True,
opacity=1,
show=False,
).add_to(map)
folium.plugins.LocateControl(position="bottomright").add_to(map)
folium.plugins.MeasureControl().add_to(map)
folium.plugins.Draw(
draw_options={"polygon": False, "rectangle": False, "circlemarker": False}
).add_to(map)
fg1 = folium.FeatureGroup(name="基地局").add_to(map)
fg2 = folium.FeatureGroup(name="eNB-LCID").add_to(map)
fg3 = folium.FeatureGroup(name="エリア").add_to(map)
for i, r in df.iterrows():
enb_lcid = r["eNB-LCID"] or "unknown"
tmp = pd.DataFrame(r.drop(labels=["color", "icon"]))
fg1.add_child(
folium.Marker(
location=[r["緯度"], r["経度"]],
popup=folium.Popup(
f'<p><a href="https://www.google.com/maps?layer=c&cbll={r["緯度"]},{r["経度"]}" target="_blank">ストリートビュー</a></p>{tmp.to_html(header=False)}',
max_width=600,
),
tooltip=f'{r["場所"]}',
icon=folium.Icon(color=r["color"], icon=r["icon"]),
)
)
fg2.add_child(
folium.Marker(
location=[r["緯度"], r["経度"]],
icon=DivIcon(
icon_size=(110, 30),
icon_anchor=(55, -10),
html=f'<div style="text-align:center; font-size: 10pt; background-color:rgba(255,255,255,0.2)">{enb_lcid}</div>',
),
)
)
fg3.add_child(
folium.Circle(
location=[r["緯度"], r["経度"]],
popup=folium.Popup(f"<p>{enb_lcid}</p>", max_width=300),
radius=780,
color=r["color"],
)
)
folium.LayerControl().add_to(map)
map.save("index.html")