目次
サンプル・プログラムの実行例
サンプル・プログラムのダウンロード
| 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 と同じディレクトリに配置すること。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 1.0.0 | 2025/09/21 | 初版 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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() 追加 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順
これで準備は完了だ。
準備:pahooInputData 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .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 を利用するのであれば 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) ===============================================================
表示する地図は、Googleマップ、地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。今回は地理院白地図を表示するよう、定数 DEF_TYPE に GSIBLAN を設定しているが、他の値でも構わない。
都道府県の最低賃金表は、「令和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: }
前述の都道府県の最低賃金表 $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: }
ここでは、緑系のグラデーションになるようにした。すなわち、変数 $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[0] as $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[0] as $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: }
都道府県境界を地図上に多角形として描くために、緯度、経度のポイントを羅列した GeoJSON形式データとして配布されている。
たとえば、国土地理院の「行政区域データ」(国土数値情報ダウンロードサイト)がある。正確無比ではあるが、市町村境界まで含んでおり、データセットとして大きすぎる。
「Free Japan GIS Map Files」(simplemaps)は、都道府県境界のみで、データサイズも 1.24Mバイトとお手頃なので、これをダウンロードして利用することにした。同梱の "jp.json" がそれである。ライセンスについては https://simplemaps.com/license を参照のこと。
"jp.json" の構造にはやや癖があるので、PHPで使いやすいように、ユーザー定義メソッド getPrefBorderList を使って配列に格納する。
戻ってくる配列は5次元で、次のような構造をしている。
[都道府県コード]['geometry'][ポリゴン番号][頂点番号]['latitude'] = 経度都道府県コードは、前述の都道府県コード(JIS X0401)である。
[都道府県コード]['geometry'][ポリゴン番号][頂点番号]['latitude'] = 緯度
'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: }
流れとしては、「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_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: }
解説:メイン・プログラム
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;
配列 $prefBorderList からデータを順番に取り出しながら、getColorCode 関数で塗りつぶし色を計算し、多角形を描く JavaScript コードを変数 $jsPolygons に代入していく。
応用
また、今回は配列を使った静的な描画にしたが、政府統計の総合窓口「e-Stat」のAPIを使って動的に統計データを取りだし、白地図に描くことも考えられる。
各自で改良・改造を試みてほしい。
参考サイト
- 白地図を利用する:国土地理院
- 行政区域データ:国土数値情報ダウンロードサイト
- Free Japan GIS Map Files:simplemaps
- 令和7年度地域別最低賃金の全国一覧:厚生労働省

そこで今回は、統計データとして都道府県別の最低賃金を使い、都道府県を色分けするPHPプログラムを作ってみることにする。最低賃金表は配列に格納してあるので、これを変更することで、さまざまな統計データを白地図に描くことができる。