楽天モバイルエリアマップ作成

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='&copy; <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='&copy; <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)

# DRAW
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():

    # folium

    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"]),
        )
    )

    # eNB-LCID
    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)

# HTML保存
map.save("index.html")