header

PHPで様々な地図を利用する

(1/2)

前回に引き続き、インターネット上の地図サービスを利用するプログラムをご紹介する。
現在、「ぱふぅ家のホームページ」の絵日記コーナーでは、MapionBBを利用し、行き先の地図を表示している。MapFanWebからMapionBBへの移行に際しては、HTMLコンテンツは触らずに、PHPのプログラムによって経度・緯度・縮尺に変換を加えるようにした。

今回ご紹介するプログラムは、前回のMapFanWebに加え、国土地理院2万5千分の1地図Mapion標準MapionBBの4種類から表示したい地図を選べるようになっている。 なお、国土地理院2万5千分の1地図を選択した場合に限り、指定した縮尺は無視される。

0001: <?php
0002: // ここからPHPプログラム =======================================================
0003: /**viewmap.php
0004:  * 地図ビューア
0005:  * @copyright   (c)studio pahoo
0006:  * @author      パパぱふぅ
0007:  * @version     2.0  2005/07/17
0008:  *
0009: */
0010: //初回起動時
0011: if (isset($_GET["MAP"]) == FALSE) {
0012: $myself = basename($_SERVER["PHP_SELF"]);
0013: 
0014: // ここまでPHPプログラム =======================================================
0015: ?>
0016: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
0017:  "http://www.w3.org/TR/html4/loose.dtd">
0018: <html lang="ja">
0019: <head>
0020: <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
0021: <title>地図ビューア</title>
0022: </head>
0023: <body>
0024: 
0025: <h1>■地図ビューア</h1>
0026: <form method="get" action="<?= $myself ?>">
0027: <table border="0">
0028: <tr>
0029: <td>経度・緯度を入力></td>
0030: <td><input name="MAP" type="text" size="80" /></td>
0031: </tr>
0032: <tr>
0033: <td></td>
0034: <td>例:E139.33.50.1N35.41.58.1(東経139度33分50.1秒、北緯35度41分58.1秒)</td>
0035: </tr>
0036: <tr>
0037: <td>縮尺を選択></td>
0038: <td>
0039: <select name="ZM">
0040: <option value="2">160万分の1</option>
0041: <option value="3">80万分の1</option>
0042: <option value="4">40万分の1</option>
0043: <option value="5">20万分の1</option>
0044: <option value="6">10万分の1</option>
0045: <option value="7">5万分の1</option>
0046: <option value="8">2万5千分の1</option>
0047: <option value="9" selected>1万2500分の1</option>
0048: <option value="10">6250分の1</option>
0049: <option value="11">3125分の1</option>
0050: <option value="12">1562分の1</option>
0051: </select>
0052: </td>
0053: </tr>
0054: <tr>
0055: <td>地図を選択></td>
0056: <td>
0057: <select name="TYPE">
0058: <option value="1" selected>MapFanWeb</option>
0059: <option value="2">国土地理院 2万5千分の1</option>
0060: <option value="3">Mapion 標準</option>
0061: <option value="4">Mapion BroadBand</option>
0062: </select>
0063: </td>
0064: </tr>
0065: <tr>
0066: <td></td>
0067: <td align="center"><input type="submit" name="Submit" value="地図表示" /></td>
0068: </tr>
0069: </table>
0070: </form>
0071: </body>
0072: </html>
0073: 
0074: <?php
0075: // ここからPHPプログラム =======================================================
0076: } else {
0077: $map = $_GET["MAP"];                                                //緯度経度
0078: $zm  = (isset($_GET["ZM"])  == TRUE) ? intval($_GET["ZM"])  : 9;    //縮尺
0079: $type = (isset($_GET["TYPE"])  == TRUE) ? intval($_GET["TYPE"])  : 1;   //地図の種類
0080: $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);     //緯度経度の異常チェック
0081: $f2 = ($zm >= 2) && ($zm <= 12);        //縮尺の異常チェック
0082: $f3 = ($type >= 1) && ($type <= 4);     //地図の種類の異常チェック
0083: if ($f1 == FALSE) {
0084:     echo $map . " : 経度・緯度の値が間違っています。";
0085: } else if ($f2 == FALSE) {
0086:     echo $zm . " : 縮尺は2以上12以下の整数です。";
0087: } else if ($f3 == FALSE) {
0088:     echo $type . " : 地図の種類が間違っています。";
0089: 
0090: //地図サイトへジャンプ
0091: } else {
0092:     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, $arr);     //緯度経度の値を分解
0093:     //MapFan のZM とMapionBBのsclの対応表
0094:     $mapion = array(
0095:         500000, 500000, 500000, 250000, 250000,
0096:          70000,  70000,  70000,  25000,  25000,
0097:          25000,  10000,  10000,  10000,  10000);
0098: 
0099:     switch ($type) {
0100:         case 1:     //MapFanWeb
0101:             $url = "http://www.mapfan.com/index.cgi?MAP=$map&ZM=$zm";
0102:             break;
0103:         case 2:     //国土地理院 2万5千分の1
0104:             $l = sprintf("%3d%2d%2d.%d", $arr[1], $arr[3], $arr[5], $arr[7]);       //経度
0105:             $b = sprintf("%2d%2d%2d.%d", $arr[8], $arr[10], $arr[12], $arr[14]);    //緯度
0106:             $url = "http://watchizu.gsi.go.jp/watchizu.aspx?b=$b&l=$l&r=2";
0107:             break;
0108:         case 3:     //Mapion 標準
0109:             $zm = $mapion[$zm];
0110:             $el = sprintf("%d/%d/%d.%d", $arr[1], $arr[3], $arr[5], $arr[7]);       //経度
0111:             $nl = sprintf("%d/%d/%d.%d", $arr[8], $arr[10], $arr[12], $arr[14]);    //緯度
0112:             $url = "http://www.mapion.co.jp/c/f?uc=1&grp=all&el=$el&nl=$nl&uc=1&scl=$zm&bid=Mlink";
0113:             break;
0114:         case 4:     //Mapion BB
0115:             $zm = $mapion[$zm];
0116:             $el = sprintf("%d/%d/%d.%d", $arr[1], $arr[3], $arr[5], $arr[7]);       //経度
0117:             $nl = sprintf("%d/%d/%d.%d", $arr[8], $arr[10], $arr[12], $arr[14]);    //緯度
0118:             $url = "http://www.mapion.co.jp/c/f?el=$el&nl=$nl&uc=1&grp=MapionBB&scl=$zm";
0119:             break;
0120:     }
0121:     header("Location: $url");
0122: }
0123: }
0124: // ここまでPHPプログラム =======================================================
0125: ?>
0126: 

プログラムを実行する