PHPでMapFanWebを利用する

(1/1)
インターネット上では、無料で利用できる地図サービスが数多くある。「ぱふぅ家のホームページ」の絵日記コーナーでも、こうしたサービスを利用させてもらい、目的地付近の地図を表示している。
現在は Googleマップを利用しているが、当初はMapFanWebを利用して表示していた。
今回は、経度・緯度と縮尺を与えると、MapFanWebを利用し、その地点の地図を表示するプログラムを紹介する。

(2021年3月27日)PHP8対応,リファラ・チェック改良。

サンプル・プログラム

圧縮ファイルの内容
viewmap1.phpサンプル・プログラム本体

サンプル・プログラムの解説

このプログラムは、他のコンテンツから利用することを考慮して、URLに変数MAP(経度・緯度)と変数ZM(縮尺)を渡すことで地図が表示できるようになっている。
たとえばURLに "viewmap1.php?MAP=E139.33.50.1N35.41.58.1&ZM=7"と指定すれば、MapFanWebで、 東経139度33分50.1秒、北緯35度41分58.1秒 を中心とした地図を縮尺5万分の1で表示することができる

プログラムは大きく2つの部分に分かれる。
URLに変数が指定されていない場合は、以下の部分が実行され、フォームを使って緯度・経度・縮尺を入力する。

0193: $HtmlBody = makeCommonBody($map$res);
0194: 
0195: // 表示処理
0196: echo $HtmlHeader;
0197: echo $HtmlBody;
0198: echo $HtmlFooter;

変数が渡されている場合は、以下の部分が実行され、MapFanWeb の該当地点を表示する。
MapFanWebの場合、経度・緯度は、たとえば「東経139度33分50.1秒、北緯35度41分58.1秒」なら、「E139.33.50.1N35.41.58.1」のように記述する。

0178: if ($map != '') {
0179:     $f1 = preg_match("/E[0-9]+[0-9]?[0-9]?(\.)?[0-9]+[0-9]?(\.)?[0-9]?[0-9]?(\.)?[0-9]*N[0-9]+[0-9]?(\.)?[0-9]+[0-9]?(\.)?[0-9]?[0-9]?(\.)?[0-9]*/", $map);  //緯度経度の異常チェック
0180:     $f2 = ($zm >= 2) && ($zm <= 12);     //縮尺の異常チェック
0181: 
0182:     if ($f1 == FALSE) {
0183:         $res = 'エラー > ' . $map . ' : 経度・緯度の値が間違っています。';
0184:     } else if ($f2 == FALSE) {
0185:         $res = 'エラー > ' . $zm . ' : 縮尺は2以上12以下の整数です。';
0186:     //MapFanサイトへジャンプ
0187:     } else {
0188:         $url = 'http://www.mapfan.com/index.cgi?MAP=' . $map .'&ZM=' . $zm;
0189:         header('Location: ' . $url);
0190:     }
0191: }

このように何か値を入力すると何かアクションを起こすプログラムの場合、入力した値が間違っていないかどうか事前にチェックする必要がある。とくにインターネットの場合、クロスサイトスクリプティングSQLインジェクション といった悪意のある入力もあり得るので、しっかりと入力チェックを行っておきたい。

ここでは、変数 map に対しては、東経・北緯しか入力されないことを前提に、関数  preg_match  を使ってパターンマッチによるチェックを行っている。MapFanWebの場合、経度・緯度とも、度分まで入力しないと正常に表示されないようである。

また、変数 zm は、以下のような縮尺と対応している。そこで、入力値を整数化し、2以上12以下であることをチェックしている。
このプログラムではリストボックスから選択するので間違いはないはずだが、URLからダイレクトに ZM を入力するケースを想定し、このような入力チェックを行うこととした。
zm の値 縮尺
0全国
1
2160 万分の 1
380 万分の 1
440 万分の 1
520 万分の 1
610 万分の 1
75 万分の 1
82 万 5 千分の 1
91 万 2500 分の 1
106250 分の 1
113125 分の 1
121562 分の 1
これらの入力チェックをクリアした場合のみ、MapFanWeb に必要なパラメータを渡し、関数  header  を利用してジャンプする。
(この項おわり)
header