長距離自然歩道を地図で眺める ~その2~

その1で環境省の環境アセスメントデータベースを使って長距離自然歩道を眺めることができます。
しかし、データを入手するのは、なかなか困難でした。
タイル画像(Webマップタイル形式とかのこと)で入手することができましたので、お知らせします。
無料のレンタルサーバをプロキシとして使うようになってます。
ご自分のWebサーバに構築することも可能ですので、後述します。

タイル画像を表示できるソフト(知ってる範囲)

・Windowsだと、カシミール3Dのタイルマップ・プラグイン
・Androidだと地図ロイド

以下URLでいけます。
http://fasthiking.s1008.xrea.com/tileToEadas/index.php/$Z/$X/$Y
$Z:ズームレベル
$X:タイル座標のX値
$Y:タイル座標のY値

たとえば、
http://fasthiking.s1008.xrea.com/tileToEadas/index.php/11/1815/804
だと、奥武蔵の武甲山周辺の自然歩道画像が入手できます。

カシミール3Dに設定する方法は、カシミール3Dでみんなの足跡を表示するなどを参考にして下さい。
地図ロイドに設定する方法は、地図ロイドでみんなの足跡を表示するなどを参考にして下さい。

表示可能なズームレベルは、カシミール3Dで、9~17まででした。9以下が表示できない理由がよく分かりません。

 

Webサーバに構築する場合

以下、レンタルサーバ上に置いてあるphpプログラムと、.htaccess。
zipしたアーカイブ tileToEadas.zip

index.php

 <?php
    $debug_on = 0;    //0以外にするとデバッグモード
    $params = explode('/', $_SERVER['REQUEST_URI']);
    $tileZ = intval($params[3]);
    $tileX = floatval($params[4]);
    $tileY = floatval($params[5]);
    debug('tileZ');
    debug('tileX');
    debug('tileY');

    $constL = (180 / M_PI) * asin(tanh(M_PI));
    $tileSize = 256;

    $lat1 = TileToLatitude($tileY, $tileZ);
    $lat2 = TileToLatitude($tileY - 1, $tileZ);
    $lon1 = TileToLongitude($tileX, $tileZ);
    $lon2 = TileToLongitude($tileX + 1, $tileZ);
    debug("lat1");
    debug("lat2");
    debug("lon1");
    debug("lon2");
    $Y1 = LatitudeToMercator($lat1);
    $Y2 = LatitudeToMercator($lat2);
    $X1 = LongitudeToMercator($lon1);
    $X2 = LongitudeToMercator($lon2);

    debug("X1");
    debug("X2");
    debug("Y1");
    debug("Y2");

    $url1 = 'https://www2.env.go.jp/eiadb/arcgis1/rest/services/category01_06_02_201906/MapServer/export?dynamicLayers=%5B%7B%22id%22%3A5%2C%22source%22%3A%7B%22type%22%3A%22mapLayer%22%2C%22mapLayerId%22%3A5%7D%2C%22drawingInfo%22%3A%7B%22transparency%22%3A0%7D%2C%22minScale%22%3A0%2C%22maxScale%22%3A0%7D%5D&dpi=96&transparent=true&format=png32&layers=show%3A5&bbox=';
    $url2 = '&bboxSR=102100&imageSR=102100&size=256%2C256&f=image';
    $url = $url1 . $X1 . ',' . $Y1 . ',' . $X2 . ',' . $Y2 . $url2;
    debug("url");

    $im = imagecreatefrompng($url);
    imagealphablending($im, false);
    imagesavealpha($im, true);
    if($debug_on == 0){
        header('Content-Type: image/png');
        imagepng($im);
    }
    imagedestroy($im);

    //メインルーチン終了

    /************************************************************************/
    //debug。関数内では使えない
    function debug($str){
        global ${$str};
        global $debug_on;
        if($debug_on != 0){
            echo "変数名:" . $str . "<br />";
            var_dump(${$str});
            echo "<br />";
        }
    }

    //度→ラジアン変換
    function ToRadian($degrees){
        return $degrees * M_PI / 180.0;
    }

    //ラジアン→度変換
    function ToDegrees($radian){
        return $radian * 180.0 / M_PI;
    }

    //タイル座標tileYとズームレベルtileZから緯度latを計算する
    function TileToLatitude($tileY, $tileZ){
        global $constL;
        global $tileSize;
        debug("constL");
        debug("tileSize");
        $y1 = -1.0 * (M_PI / pow(2.0, $tileZ + 7.0)) * $tileY * $tileSize;
        $y2 = atanh(sin((M_PI / 180.0) * $constL));
        $y3 = tanh($y1 + $y2);
        $lat = (180.0 / M_PI) * asin($y3);
        //var_dump($y1);
        //echo "<br />";
        //var_dump($y2);
        //echo "<br />";
        //var_dump($y3);
        //echo "<br />";

        return $lat;
    }

    //タイル座標tileXとズームレベルtileZから経度lonを計算する
    function TileToLongitude($tileX, $tileZ){
        global $tileSize;
        $lon  = 180.0 * ($tileX * $tileSize / pow(2.0, $tileZ + 7.0) - 1.0);
        return $lon;
    }

    //緯度latからWeb Mercator座標を計算する
    function LatitudeToMercator($lat){
        global $tileZ;
        $R = 6378137.0;
        $U = 0.017453292519943;
        $d = $lat * $U;
        $dif = 40140800.0 / pow(2, $tileZ);        //緯度のほうがなぜかズレるので補正
        //echo $dif."<br>";
        return $R / 2.0 * log((1.0 + sin($d)) / (1.0 - sin($d))) - $dif;
    }

    //経度lonからWeb Mercator座標を計算する
    function LongitudeToMercator($lon){
        //$R = 6356752.314245179;
        $R = 6378137.0;
        $U = 0.017453292519943;
        return $lon * $U * $R;
    }
?>

.htaccess

RewriteEngine on
RewriteRule ^(.*)$ index.php [L]

Comments are closed.