/* ============================================================= 日本タイル型グリッド地図 - 都道府県を地理的配置の四角タイルで表示 - 回答施設がある県をティールで塗り、回答施設数バッジを添える - クリックで右(スマホは下)パネルに回答施設一覧(施設名順) - ランキング表示はしない(色の濃淡で件数を表さない) ============================================================= */ /* 11列 × 12行のグリッド。"" は空セル。 */ const JP_GRID = [ ["", "", "", "", "", "", "", "", "", "", "hokkaido"], ["", "", "", "", "", "", "", "", "", "aomori", ""], ["", "", "", "", "", "", "", "", "akita", "iwate", ""], ["", "", "", "", "", "", "", "", "yamagata", "miyagi", ""], ["", "", "", "", "", "", "", "niigata", "fukushima", "", ""], ["", "", "", "", "", "ishikawa", "toyama", "nagano", "gunma", "tochigi", "ibaraki"], ["", "", "", "shimane", "tottori", "fukui", "gifu", "yamanashi", "saitama", "tokyo", "chiba"], ["", "", "yamaguchi", "hiroshima", "okayama", "hyogo", "kyoto", "shiga", "aichi", "shizuoka", "kanagawa"], ["", "fukuoka", "oita", "ehime", "kagawa", "osaka", "nara", "mie", "", "", ""], ["", "saga", "kumamoto", "miyazaki", "kochi", "tokushima", "wakayama", "", "", "", ""], ["nagasaki", "", "kagoshima", "", "", "", "", "", "", "", ""], ["okinawa", "", "", "", "", "", "", "", "", "", ""] ]; function abbrevPref(name) { // 末尾の 都/府/県 を外す(北海道はそのまま) return name.replace(/[都府県]$/, ""); } function MapPanel({ slug, prefName, rows, onPick }) { if (!slug) { return (

都道府県を選んでください

地図でティール色の県をクリックすると、その県の回答施設(施設名順)が表示されます。

); } if (rows.length === 0) { return (

{prefName}

現時点で掲載できる回答施設がありません。

); } const nH = rows.filter(r => r.type === "病院").length; const nC = rows.filter(r => r.type === "クリニック").length; const href = `都道府県別ページ.html?pref=${slug}`; return (
{prefName}

回答施設一覧

{rows.length}施設

病院 {nH} ・ クリニック {nC}(施設名順で表示)

{prefName}のページへ {onPick && }
); } function JapanMap({ onPick }) { const data = window.SURVEY_DATA; const countBySlug = React.useMemo(() => { const m = {}; data.forEach(d => { m[d.pref_slug] = (m[d.pref_slug] || 0) + 1; }); return m; }, []); const nameBySlug = React.useMemo(() => { const m = {}; window.PREF_LIST.forEach(p => { m[p.slug] = p.pref; }); return m; }, []); const withData = window.PREF_LIST.filter(p => countBySlug[p.slug]).length; const [sel, setSel] = React.useState(null); const selRows = React.useMemo( () => sel ? data.filter(d => d.pref_slug === sel).sort((a, b) => a.facility.localeCompare(b.facility, "ja")) : [], [sel] ); return (

地図から探す

回答施設のある {withData} 都道府県(数字は回答施設数)
{/* 地図 */}
{JP_GRID.flat().map((slug, idx) => { if (!slug) return ; const n = countBySlug[slug] || 0; const has = n > 0; const name = nameBySlug[slug] || slug; const active = sel === slug; if (!has) { return ( {abbrevPref(name)} ); } return ( ); })}
回答施設あり 回答なし ※ 色は件数の多寡やランキングを表すものではありません。
{/* パネル */}
); }