PHPで 都道府県別の最低賃金の分布を地図上に描く

(1/1)
小学校の社会科の授業で、色鉛筆を使って白地図を塗りつぶしたことがある人は多いだろう。現在はネット上に地図データがあり、JavaScriptを使ってそのうえに図形を描くことができるのだから、当然、白地図のような使い方もできるはずだ。
そこで今回は、統計データとして都道府県別の最低賃金を使い、都道府県を色分けするPHPプログラムを作ってみることにする。最低賃金表は配列に格納してあるので、これを変更することで、さまざまな統計データを白地図に描くことができる。

目次

サンプル・プログラムの実行例

PHPで都道府県別の最低賃金の分布を地図上に描く

サンプル・プログラムのダウンロード

圧縮ファイルの内容
mappingMinWage.phpサンプル・プログラム
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
jp.json都道府県境界を描くためのGeoJSONデータ。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで都道府県別の最低賃金の分布を地図上に描く」などを参照。pahooGeoCode.php と同じディレクトリに配置すること。
mappingMinWage.php 更新履歴
バージョン 更新日 内容
1.0.0 2025/09/21 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.9.0 2025/09/21 jsPolygon, jsPolygon_Gmap, jsPolygon_Leaflet, loadGeoJSON, getPrefBorderList を追加
6.8.0 2025/08/10 アクセスキーなどを ".pahooEnd" に分離
6.7.1 2025/07/26 jsLine_Gmap() - bug-fix
6.7.0 2025/07/20 drawJSmap,drawGMap -- 引数 $markerLevel 追加
6.6.0 2025/07/19 drawJSmap,drawGMap,drawLeaflet -- マップ中心マーカー表示引数を追加

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:pahooGeoCode クラス

pahooGeoCode.php

  41: class pahooGeoCode {
  42:     public $items;      // 検索結果格納用
  43:     public $error;      // エラー・フラグ
  44:     public $errmsg;     // エラー・メッセージ
  45:     public $hits;       // 検索ヒット件数
  46:     public $webapi// 直前に呼び出したWebAPI URL
  47: 
  48:     // 都道府県境界線データ
  49:     // SimpleMaps.com is a product of Pareto Software, LLC. © 2010-2025
  50:     // https://simplemaps.com/gis/country/jp
  51:     // ※各自の環境に合わせて設定すること
  52:     public $GeoJsonJP = __DIR__ . '/jp.json';
  53: 
  54:     // -- 以下のデータは .env ファイルに記述可能
  55:     // Google Cloud Platform APIキー
  56:     // https://cloud.google.com/maps-platform/
  57:     // ※Google Maps APIを利用しないのなら登録不要
  58:     public $GOOGLE_API_KEY_1 = '';      // HTTPリファラ用
  59:     public $GOOGLE_API_KEY_2 = '';      // IP制限用
  60:     public $GOOGLE_MAP_ID    = '';      // GoogleMaps ID
  61: 
  62:     // Yahoo! JAPAN Webサービス アプリケーションID
  63:     // https://e.developer.yahoo.co.jp/register
  64:     // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  65:     public $YAHOO_APPLICATION_ID = '';
  66: 
  67:     // OSM Nominatim Search API利用時に知らせるメールアドレス
  68:     // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
  69:     // ※OSM Nominatim Search APIを利用しないのなら登録不要
  70:     public $NOMINATIM_EMAIL = '';
  71: 
  72:     // IP2Location.io APIキー
  73:     // https://www.ip2location.io/
  74:     // ※IP2Location.ioを利用しないのなら登録不要
  75:     public $IP2LOCATION_API_KEY = '';

GoogleマップやLeafletなどによる地図描画や住所検索を行うためのクラスが pahooGeoCode である。同梱のクラス・ファイル "pahooGeoCode.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooGeoCodeクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

地図や住所検索として Google を利用するのであれば Google Cloud Platform APIキーマップID が必要で、その入手方法は「Google Cloud Platform - WebAPIの登録方法」を、Yahoo!JAPAN を利用するのであれば Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、IP2Location.ioを利用するのであれば「PHPでIPアドレスやホスト名から住所を求める」を、それぞれ参照されたい。

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

準備:各種定数など

mappingMinWage.php

  49: // 各種定数(START) ===========================================================
  50: 
  51: // 地図描画サービスの選択
  52: //    0:Google
  53: //    2:地理院地図・OSM
  54: define('MAPSERVICE', 2);
  55: 
  56: // マップの表示サイズ(単位:ピクセル)
  57: define('MAP_WIDTH',  600);
  58: define('MAP_HEIGHT', 700);
  59: // マップID
  60: define('MAPID', 'map_id');
  61: 
  62: // 初期値
  63: define('DEF_LONGITUDE', 135.4604252);       // 中心座標(経度)
  64: define('DEF_LATITUDE',   35.7883146);       //         (緯度)
  65: define('DEF_TYPE',      'GSIBLANK');        // マップタイプ(地理院白地図)
  66: define('DEF_ZOOM',      5);                 // ズーム
  67: define('DEF_CATEGORY', 'world');            // カテゴリ
  68: 
  69: // 都道府県別の最低賃金表
  70: // 3番目の数字を別の値に変えてみましょう😉
  71: $prefTable = [
  72: ['都道府県コード', '都道府県名', '最低賃金' ],
  73: ['01',              '北海道',   1075 ],
  74: ['02',              '青森県',   1029 ],
  75: ['03',              '岩手県',   1031 ],
  76: ['04',              '宮城県',   1038 ],
  77: ['05',              '秋田県',   1031 ],
  78: ['06',              '山形県',   1032 ],
  79: ['07',              '福島県',   1033 ],
  80: ['08',              '茨城県',   1074 ],
  81: ['09',              '栃木県',   1068 ],
  82: ['10',              '群馬県',   1063 ],
  83: ['11',              '埼玉県',   1141 ],
  84: ['12',              '千葉県',   1140 ],
  85: ['13',              '東京都',   1226 ],
  86: ['14',              '神奈川県', 1225 ],
  87: ['15',              '新潟県',   1050 ],
  88: ['16',              '富山県',   1062 ],
  89: ['17',              '石川県',   1054 ],
  90: ['18',              '福井県',   1053 ],
  91: ['19',              '山梨県',   1052 ],
  92: ['20',              '長野県',   1061 ],
  93: ['21',              '岐阜県',   1065 ],
  94: ['22',              '静岡県',   1097 ],
  95: ['23',              '愛知県',   1140 ],
  96: ['24',              '三重県',   1087 ],
  97: ['25',              '滋賀県',   1080 ],
  98: ['26',              '京都府',   1122 ],
  99: ['27',              '大阪府',   1177 ],
 100: ['28',              '兵庫県',   1116 ],
 101: ['29',              '奈良県',   1051 ],
 102: ['30',              '和歌山県', 1045 ],
 103: ['31',              '鳥取県',   1030 ],
 104: ['32',              '島根県',   1033 ],
 105: ['33',              '岡山県',   1047 ],
 106: ['34',              '広島県',   1085 ],
 107: ['35',              '山口県',   1043 ],
 108: ['36',              '徳島県',   1046 ],
 109: ['37',              '香川県',   1036 ],
 110: ['38',              '愛媛県',   1033 ],
 111: ['39',              '高知県',   1023 ],
 112: ['40',              '福岡県',   1057 ],
 113: ['41',              '佐賀県',   1030 ],
 114: ['42',              '長崎県',   1031 ],
 115: ['43',              '熊本県',   1034 ],
 116: ['44',              '大分県',   1035 ],
 117: ['45',              '宮崎県',   1023 ],
 118: ['46',              '鹿児島県', 1026 ],
 119: ['47',              '沖縄県',   1023 ],
 120: ];
 121: 
 122: // 各種定数(END) ===============================================================

各種パラメータは定数を defineしている。とくに記載のないものは、適宜変更してかまわない。

表示する地図は、Googleマップ地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。今回は地理院白地図を表示するよう、定数 DEF_TYPEGSIBLAN を設定しているが、他の値でも構わない。

都道府県の最低賃金表は、「令和7年度地域別最低賃金の全国一覧」(厚生労働省)を、配列 $prefTable に格納した。2次元配列となっており、2次元目は、都道府県コード(JIS X0401)、都道府県名(漢字)、最低賃金(円)の順に並んでいる。1次元目は都道府県コードの順に並んでいるのだが、都道府県コード「0」はないので、代わりにラベルを代入した。

解説:最低賃金表の最小値と最大値を取得

mappingMinWage.php

 188: /**
 189:  * 都道府県別の最低賃金表の最小値と最大値を取得する
 190:  * @param   array $table 都道府県別の最低賃金表;$table[][2]に値が入っている
 191:  * @return  array(最小値, 最大値)
 192: */
 193: function getMinMaxInTable($table) {
 194:     // 3つ目の要素だけを抜き出す
 195:     $arr = array_column($table, 2);
 196:     // 添字0はラベルなので削除する
 197:     unset($arr[0]);
 198: 
 199:     return [ min($arr), max($arr) ];
 200: }

目標として、最低賃金の高い都道府県ほど濃い色に塗りたい。この機能は後述する関数 getColorCode として実装するが、色の濃さを計算するのに、今回扱う数値(最低賃金)の最小値と最大値を把握しておく必要がある。
前述の都道府県の最低賃金表 $prefTable は2次元配列であるため、組み込み関数  min  や  max  をそのまま適用することはできない。そこで、用意したのがユーザー関数 getMinMaxInTable である。

まず、2次元配列 $prefTable の3番目の要素(=最低賃金)だけを抜き出して1次元配列にするため、組み込み関数  array_column  を使う。これにより、いちいちループを回さずとも、組み込み関数  min  や  max  を使って最小値と最大値を取得することができる。ただし、前述のように添字「0」は無意味なので、組み込み関数  unset  を使ってあらかじめ消去しておく。

解説:値に応じたカラーコードを返す

mappingMinWage.php

 201: /**
 202:  * 値に応じたカラーコード(緑系)を返す
 203:  * @param   float $value 値
 204:  * @param   float $min   値がとりうる最小値
 205:  * @param   float $max   値がとりうる最大値
 206:  * @return  string RGBコード
 207: */
 208: function getColorCode($value, $min, $max) {
 209:     // 最小値(薄い緑色)
 210:     $colorMin = ['r' => 200, 'g' => 255, 'b' => 200];
 211:     // 最大値(濃い緑色)
 212:     $colorMax = ['r' =>   0, 'g' => 150, 'b' =>   0];
 213: 
 214:     // $value に対応するカラコードを計算する.
 215:     $width = $max - $min;
 216:     $x = $value - $min;
 217:     $r = (int)($colorMin['r'+ ($colorMax['r'- $colorMin['r']) * ($x / $width));
 218:     $g = (int)($colorMin['g'+ ($colorMax['g'- $colorMin['g']) * ($x / $width));
 219:     $b = (int)($colorMin['b'+ ($colorMax['b'- $colorMin['b']) * ($x / $width));
 220: 
 221:     return sprintf('#%02X%02X%02X', $r, $g, $b);
 222: }

ユーザー関数 getColorCode は、大1引数に与えた値に応じたカラーコード(最低賃金が高いほど濃い色)を返すユーザー関数である。

ここでは、緑系のグラデーションになるようにした。すなわち、変数 $colorMin に最小値(薄い緑色)の対応する色情報をR、G、Bの分解して代入、同様に、変数 $colorMax に最大値(濃い緑色)の対応する色情報をR、G、Bの分解して代入しておく。。

変数 $colorMin と 変数 $colorMax の色距離は、前述のユーザー定義関数 getMinMaxInTable を使って計算した最小値、最大値の感覚に比例する。
この比例式を計算し、最終的に # ではじまるRGB色コードを返すようにしてある。

解説:都道府県境界データをGeoJSON配列で返す

pahooGeoCode.php

2783: /**
2784:  * GeoJSONデータを読み込んで配列を返す
2785:  * @param   なし
2786:  * @return  array GeoJSON配列 / FALSE:読み込み失敗
2787: */
2788: function loadGeoJSON() {
2789:     $res = FALSE;
2790:     $json = @file_get_contents($this->GeoJsonJP);
2791:     if ($json !== FALSE) {
2792:         $res = json_decode($json);
2793:     }
2794:     return $res;
2795: }

pahooGeoCode.php

2797: /**
2798:  * 都道府県境界データをGeoJSON配列で返す
2799:  * @param   string $ip IPアドレス
2800:  * @return  array GeoJSON配列 / FALSE:読み込み失敗
2801:  * お戻り知野データ構造
2802:  *  [都道府県コード]['geometry'][ポリゴン番号][頂点番号]['latitude'] = 経度
2803:  *  [都道府県コード]['geometry'][ポリゴン番号][頂点番号]['latitude'] = 緯度
2804:  * @参考URL     https://www.pahoo.org/e-soul/webtech/phpgd/phpgd-41-01.shtm
2805: */
2806: function getPrefBorderList() {
2807:     static $prefList = array(
2808:         array('engName',    'prefCode', 'jpName'),
2809:         array('Kagoshima',  '46', '鹿児島県'),
2810:         array('Ōita',       '44', '大分県'),
2811:         array('Fukuoka',    '40', '福岡県'),
2812:         array('Saga',       '41', '佐賀県'),
2813:         array('Nagasaki',   '42', '長崎県'),
2814:         array('Kumamoto',   '43', '熊本県'),
2815:         array('Miyazaki',   '45', '宮崎県'),
2816:         array('Tokushima',  '36', '徳島県'),
2817:         array('Kagawa',     '37', '香川県'),
2818:         array('Ehime',      '38', '愛媛県'),
2819:         array('Kōchi',      '39', '高知県'),
2820:         array('Shimane',    '32', '島根県'),
2821:         array('Yamaguchi',  '35', '山口県'),
2822:         array('Tottori',    '31', '鳥取県'),
2823:         array('Hyōgo',      '28', '兵庫県'),
2824:         array('Kyōto',      '26', '京都府'),
2825:         array('Fukui',      '18', '福井県'),
2826:         array('Ishikawa',   '17', '石川県'),
2827:         array('Toyama',     '16', '富山県'),
2828:         array('Niigata',    '15', '新潟県'),
2829:         array('Yamagata',   '06', '山形県'),
2830:         array('Akita',      '05', '秋田県'),
2831:         array('Aomori',     '02', '青森県'),
2832:         array('Iwate',      '03', '岩手県'),
2833:         array('Miyagi',     '04', '宮城県'),
2834:         array('Fukushima',  '07', '福島県'),
2835:         array('Ibaraki',    '08', '茨城県'),
2836:         array('Chiba',      '12', '千葉県'),
2837:         array('Tokyo',      '13', '東京都'),
2838:         array('Kanagawa',   '14', '神奈川県'),
2839:         array('Shizuoka',   '22', '静岡年'),
2840:         array('Aichi',      '23', '愛知県'),
2841:         array('Mie',        '24', '三重県'),
2842:         array('Wakayama',   '30', '和歌山県'),
2843:         array('Ōsaka',      '27', '大阪府'),
2844:         array('Okayama',    '33', '岡山県'),
2845:         array('Hiroshima',  '34', '広島県'),
2846:         array('Hokkaidō',   '01', '北海道'),
2847:         array('Okinawa',    '47', '沖縄県'),
2848:         array('Gunma',      '10', '群馬県'),
2849:         array('Nagano',     '20', '長野県'),
2850:         array('Tochigi',    '09', '栃木県'),
2851:         array('Gifu',       '21', '岐阜県'),
2852:         array('Shiga',      '25', '滋賀県'),
2853:         array('Saitama',    '11', '埼玉県'),
2854:         array('Yamanashi',  '19', '山梨県'),
2855:         array('Nara',       '29', '奈良県'),
2856:     );
2857: 
2858:     // GeoJSONデータを読み込む
2859:     $arr = $this->loadGeoJSON();
2860:     if ($arr === FALSE)     return FALSE;
2861: 
2862:     // 配列に入れ直す
2863:     $borderList = array();
2864:     foreach ($arr->features as $border) {
2865:         // 都道府県コード
2866:         $prefCode = (int)$prefList[$border->id][1];
2867:         // 都道府県名(日本語)
2868:         $prefName = (string)$prefList[$border->id][2];
2869:         $borderList[$prefCode]['name'] = $prefName;
2870:         // 境界線が2つ以上に分かれる都道府県
2871:         $group = 0;
2872:         if (isset($border->geometry->coordinates[1])) {
2873:             foreach ($border->geometry->coordinates as $items) {
2874:                 $cnt = 0;
2875:                 foreach ($items[0as $item) {
2876:                     if (isset($item[0]) && isset($item[1])) {
2877:                         $borderList[$prefCode]['geometry'][$group][$cnt]['longitude'] = $item[0];
2878:                         $borderList[$prefCode]['geometry'][$group][$cnt]['latitude']  = $item[1];
2879:                         $cnt++;
2880:                     }
2881:                 }
2882:                 $group++;
2883:             }
2884:         // 境界線が1つだけの都道府県
2885:         } else {
2886:             $cnt = 0;
2887:             foreach ($border->geometry->coordinates[0as $item) {
2888:                 if (isset($item[0]) && isset($item[1])) {
2889:                     $borderList[$prefCode]['geometry'][$group][$cnt]['longitude'] = $item[0];
2890:                     $borderList[$prefCode]['geometry'][$group][$cnt]['latitude']  =$item[1];
2891:                     $cnt++;
2892:                 }
2893:             }
2894:         }
2895:     }
2896: 
2897:     // 配列を都道府県コードの小さい順に並べ替える
2898:     ksort($borderList);
2899: 
2900:     return $borderList;
2901: }

つづいてクラス・ファイル "pahooGeoCode.php" に追加したメソッドを見ていこう。

都道府県境界を地図上に多角形として描くために、緯度、経度のポイントを羅列した GeoJSON形式データとして配布されている。
たとえば、国土地理院の「行政区域データ」(国土数値情報ダウンロードサイト)がある。正確無比ではあるが、市町村境界まで含んでおり、データセットとして大きすぎる。
Free Japan GIS Map Files」(simplemaps)は、都道府県境界のみで、データサイズも 1.24Mバイトとお手頃なので、これをダウンロードして利用することにした。同梱の "jp.json" がそれである。ライセンスについては https://simplemaps.com/license を参照のこと。

"jp.json" の構造にはやや癖があるので、PHPで使いやすいように、ユーザー定義メソッド getPrefBorderList を使って配列に格納する。
戻ってくる配列は5次元で、次のような構造をしている。
[都道府県コード]['geometry'][ポリゴン番号][頂点番号]['latitude'] = 経度
[都道府県コード]['geometry'][ポリゴン番号][頂点番号]['latitude'] = 緯度
都道府県コードは、前述の都道府県コード(JIS X0401)である。
'geometry' は、座標データをあらわすために便宜的に付けたもの。同じ次元に 'name' で都道府県名(漢字)を格納している。
3次元目の「ポリゴン番号」だが、1つの都道府県の境界を描く多角形(ポリゴン)は1つとは限らない。たとえば東京都の場合、本州にある東京都の境界を描く多角形以外に、大島や八丈島などの島嶼を描く多角形が必要になる。つまり、境界を描く多角形が1つ以上になる場合があることがあるので、その1つ1つに番号を付け、3次元目で管理する。
4次元目の「頂点番号」は、多角形の頂点1つ分である。5次元目の 'longitude' に経度を、'latitude' に緯度を代入する。

"jp.json" は都道府県コードとは関係ないデータ構造になっており、この処理は絶対必要ではないのだが、いちおう最後に配列を都道府県コードの小さい順に並べ替えておく。

解説:多角形塗りつぶしスクリプト:Googleマップ用

pahooGeoCode.php

1207: /**
1208:  * 多角形塗りつぶしスクリプト:Googleマップ用
1209:  * @param   array  $points  多角形の座標配列
1210:  *                      [$n]['longitude'] 経度(世界測地系)
1211:  *                      [$n]['latitude']  緯度(世界測地系)
1212:  * @param   string $color       境界線の描画色(省略時=#FF0000)
1213:  * @param   float  $opacity     境界線の透明度(省略時=1)
1214:  * @param   int    $weight      境界線の太さ(省略時=1)
1215:  * @param   string $fillColor   塗りつぶし色(省略時=#FF0000)
1216:  * @param   float  $fillOpacity 塗りつぶしの透明度(省略時=1)
1217:  * @return  string JavaScript
1218: */
1219: function jsPolygon_Gmap($points, $color='#FF0000', $opacity='1.0', $weight=1, $fillColor='#FF0000', $fillOpacity='1.0') {
1220:     $ss = '';
1221:     $cnt = 0;
1222:     foreach ($points as $pt) {
1223:         if ($cnt > 0)   $ss .",\n";
1224:         $ss ."\t\t{ lat: {$pt['latitude']}, lng: {$pt['longitude']} }";
1225:         $cnt++;
1226:     }
1227: 
1228:     $js =<<< EOT
1229:     new google.maps.Polygon({
1230:         map: map,
1231:         path: [ {$ss} ],
1232:         strokeColor:  '{$color}',
1233:         strokeOpacity: {$opacity},
1234:         strokeWeight: {$weight},
1235:         fillColor:    '{$color}',
1236:         fillOpacity:  {$fillOpacity}
1237:     }).setMap(map);
1238: 
1239: EOT;
1240:     return $js;
1241: }

ユーザー定義メソッド jsPolygon_Gmap は、Googleマップ上に、多角形を描いてその内側を塗りつぶるための JavaScriptコードを生成する。

流れとしては、「PHPで地図上に円や矩形を描く」で作った jsLine_Gmap メソッドに近い。違う点は、オブジェクトとして google.maps.Polygon を使うことと、そこに渡すプロパティに塗りつぶし関係のパラメータを含んでいることだ。

解説:多角形塗りつぶしスクリプト:Leaflet用

pahooGeoCode.php

2236: /**
2237:  * 多角形塗りつぶしスクリプト:Leaflet用
2238:  * @param   array  $points  多角形の座標配列
2239:  *                      [$n]['longitude'] 経度(世界測地系)
2240:  *                      [$n]['latitude']  緯度(世界測地系)
2241:  * @param   string $color       境界線の描画色(省略時=#FF0000)
2242:  * @param   float  $opacity     境界線の透明度(省略時=1)
2243:  * @param   int    $weight      境界線の太さ(省略時=1)
2244:  * @param   string $fillColor   塗りつぶし色(省略時=#FF0000)
2245:  * @param   float  $fillOpacity 塗りつぶしの透明度(省略時=1)
2246:  * @return  string JavaScript
2247: */
2248: function jsPolygon_Leaflet($points, $color='#FF0000', $opacity='1.0', $weight=1, $fillColor='#FF0000', $fillOpacity='1.0') {
2249:     $ss = '';
2250:     $cnt = 0;
2251:     foreach ($points as $pt) {
2252:         if ($cnt > 0)   $ss .', ';
2253:         $ss ."[{$pt['latitude']}, {$pt['longitude']}]";
2254:         $cnt++;
2255:     }
2256: 
2257:     $js =<<< EOT
2258:     L.polygon(
2259:         [{$ss}], {
2260:         'color':       '{$color}',
2261:         'weight':      {$weight},
2262:         'opacity':     {$opacity},
2263:         'fillColor':   '{$fillColor}',
2264:         'fillOpacity': {$opacity},
2265:     }).addTo(map);
2266: 
2267: EOT;
2268:     return $js;
2269: }

ユーザー定義メソッド jsPolygon_Leaflet は、Leaflet上に、多角形を描いてその内側を塗りつぶすための JavaScriptコードを生成する。
流れは前述の jsPolygon_Gmap と同じである。

解説:多角形塗りつぶしスクリプト生成

pahooGeoCode.php

2692: /**
2693:  * マップ上に多角形を塗りつぶすスクリプト生成
2694:  * @param   array  $points  多角形の座標配列
2695:  *                      [$n]['longitude'] 経度(世界測地系)
2696:  *                      [$n]['latitude']  緯度(世界測地系)
2697:  * @param   string $color       境界線の描画色(省略時=#FF0000)
2698:  * @param   float  $opacity     境界線の透明度(省略時=1)
2699:  * @param   int    $weight      境界線の太さ(省略時=1)
2700:  * @param   string $fillColor   塗りつぶし色(省略時=#FF0000)
2701:  * @param   float  $fillOpacity 塗りつぶしの透明度(省略時=1)
2702:  * @param   int    $api   0:Google Maps JavaScript(省略時)
2703:  *                        2:地理院地図・OSM(Leaflet使用)
2704:  * @return  string JavaScript
2705: */
2706: function jsPolygon($points, $color='#FF0000', $opacity='1.0', $weight=1, $fillColor='#FF0000', $fillOpacity='1.0', $api=0) {
2707:     switch ($api) {
2708:     // Google Maps JavaScript
2709:     case 0;
2710:         $js = $this->jsPolygon_Gmap($points, $color, $opacity, $weight, $fillColor, $fillOpacity);
2711:         break;
2712:     // 地理院地図・OSM(Leaflet使用)
2713:     case 2:
2714:         $js = $this->jsPolygon_Leaflet($points, $color, $opacity, $weight, $fillColor, $fillOpacity);
2715:         break;
2716:     }
2717: 
2718:     return $js;
2719: }

ユーザー定義メソッド jsPolygon は、内部で jsPolygon_Gmap または jsPolygon_Leaflet を呼び出す。

解説:メイン・プログラム

mappingMinWage.php

 298: // インスタンスを生成する.
 299: $pgc = new pahooGeoCode();
 300: 
 301: // 都道府県境界データをGeoJSON配列で取得する.
 302: $prefBorderList = $pgc->getPrefBorderList();
 303: 
 304: // 最低賃金の最大値と最小値を取得する.
 305: list($min, $max) = getMinMaxInTable($prefTable);
 306: 
 307: // 最低賃金を色分け表示するための多角形を生成する.
 308: $jsPolygons = '';
 309: foreach ($prefBorderList as $id=>$prefBorders) {
 310:     $color = getColorCode($prefTable[$id][2], $min, $max);
 311:     foreach ($prefBorders['geometry'as $prefBorder) {
 312:         $jsPolygons .$pgc->jsPolygon($prefBorder, $color, '0.6', 1, $color, '0.6', MAPSERVICE);
 313:     }
 314: }
 315: 
 316: // 白地図を描画するJavaScriptコードを生成する.
 317: $jsmap = $pgc->drawJSMap(MAPID, DEF_LATITUDE, DEF_LONGITUDE, DEF_TYPE, DEF_ZOOM, NULL, NULL, MAPSERVICE, $jsPolygons);
 318: 
 319: // 白地図を描画する.
 320: $HtmlBody = makeCommonBody($mode, $jsmap, $pgc);
 321: 
 322: // 画面に表示する.
 323: echo $HtmlHeader;
 324: echo $HtmlBody;
 325: echo $HtmlFooter;

メイン・プログラムは、まず、前述の getPrefBorderList 関数を使って都道府県境界データを配列 $prefBorderList に格納する。次に getMinMaxInTable メソッドを使って最低賃金の最大値と最小値を取得する。
配列 $prefBorderList からデータを順番に取り出しながら、getColorCode 関数で塗りつぶし色を計算し、多角形を描く JavaScript コードを変数 $jsPolygons に代入していく。

応用

冒頭の配列 $prefTable の3番目の数値を変えることで、最低賃金以外の都道府県別の分布を白地図に描くことができる。
また、今回は配列を使った静的な描画にしたが、政府統計の総合窓口「e-Stat」のAPIを使って動的に統計データを取りだし、白地図に描くことも考えられる。
各自で改良・改造を試みてほしい。

参考サイト

(この項おわり)
header