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