長距離自然歩道を地図で眺める ~その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]