あちあち情報局

趣味や日曜プログラムなどを書いています

ユーザ用ツール

サイト用ツール


leaflet:map

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
leaflet:map [2018/09/11 10:30] – [DokuWiki用の特殊設定] 管理者leaflet:map [2018/09/12 10:08] (現在) – [説明] 管理者
行 1: 行 1:
 +[[:programming_start]]
 +====== Leaflet - OpenStreetMap表示 ======
 +Leaflet v1系を使用してOpenStreetMapを表示します。
 +
 +注意:「Leaflet勉強のための試作プログラムなので間違っている可能性があります」「DokuWikiは個別にヘッダを編集できないので通常とは少し違う構造になっています」
 +----
 +===== デモ =====
 +東京を中心とした地図が表示されます。
 +
 +<html>
 +<div id="mapid" style="width: 100%; height: 400px;"></div>
 + 
 +<script src="https://www.achiachi.net/blog/_outside/leaflet/v1/leaflet.js"></script>
 + 
 +<script>
 +  function cssLoad(cssFile){
 +    if(document.all){
 +      document.createStyleSheet(cssFile);
 +    }else{
 +      var link = document.createElement("link");
 +      link.rel = "stylesheet";
 +      link.href = cssFile;
 +      link.type = "text/css"
 +      document.getElementsByTagName('head')[0].appendChild(link);
 +    }
 +  }
 +  cssLoad("https://www.achiachi.net/blog/_outside/leaflet/v1/leaflet.css");
 +
 +  function addOnload(evtFunc){
 +    if(window.addEventListener) {
 +      window.addEventListener('load', evtFunc, false);
 +    } else if(window.attachEvent){ //IE用
 +      window.attachEvent('onload', evtFunc);
 +    } else {
 +      //alert('window.onload エラー');
 +    }
 +  }  
 +  
 +  var mymap;
 +
 +  addOnload(function(){
 +    mymap = L.map('mapid');
 +   
 +    L.tileLayer('https://c.tile.openstreetmap.org/{z}/{x}/{y}.png', {
 +      maxZoom: 18,
 +      attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors, '
 +    }).addTo(mymap);
 +
 +    L.control.scale({imperial:false}).addTo(mymap);
 +    
 +    mymap.setView([35.6896, 139.6918], 8);
 +  });
 +</script>
 +</html>
 +
 +
 +
 +<html>
 +<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
 +<!-- respon_0 -->
 +<ins class="adsbygoogle"
 +     style="display:block"
 +     data-ad-client="ca-pub-9251612436023685"
 +     data-ad-slot="1409739163"
 +     data-ad-format="auto"></ins>
 +<script>
 +(adsbygoogle = window.adsbygoogle || []).push({});
 +</script>
 +</html>
 +
 +
 +
 +
 +----
 +===== ソースコード =====
 +<code javascript>
 +<!-- 1.マップを表示するための空のDIV要素 -->
 +<div id="mapid" style="width: 100%; height: 400px;"></div>
 +
 +<!-- 2.leafletのライブラリを読み込み -->
 +<script src="https://【自分のサーバーアドレスとパス】/leaflet/v1/leaflet.js"></script>
 +
 +<!-- 3.leflet用のcssを読み込む -->
 +<script>
 +  function cssLoad(cssFile){
 +    if(document.all){
 +      document.createStyleSheet(cssFile);
 +    }else{
 +      var link = document.createElement("link");
 +      link.rel = "stylesheet";
 +      link.href = cssFile;
 +      link.type = "text/css"
 +      document.getElementsByTagName('head')[0].appendChild(link);
 +    }
 +  }
 +  cssLoad("https://【自分のサーバーアドレスとパス】/leaflet/v1/leaflet.css");
 +
 +  var mymap; //4.マップ用インスタンス変数(グローバル変数)
 +
 +  //5.ページがロードされてからマップを処理を開始(window.onload代用)
 +  function addOnload(evtFunc){
 +    if(window.addEventListener) {
 +      window.addEventListener('load', evtFunc, false);
 +    } else if(window.attachEvent){ //IE用
 +      window.attachEvent('onload', evtFunc);
 +    } else {
 +      //alert('window.onload エラー');
 +    }
 +  }
 +
 +  addOnload(function(){
 +
 +    //6.マップオブジェクトをインスタンス化
 +    mymap = L.map('mapid');
 +
 +    //7.タイルサーバーの設定と著作権表示
 +    L.tileLayer('https://【タイルサーバーのアドレスとパス】/{z}/{x}/{y}.png', {
 +      maxZoom: 18,
 +      attribution: 'Map data &copy; <a href="【タイルサーバーの著作権アドレス】" target="_blank">【タイルサーバーの著作者】</a> contributors, '
 +    }).addTo(mymap);
 +
 +    //8.マップにスケールバー追加
 +    L.control.scale({imperial:false}).addTo(mymap);
 +
 +    //9.マップの座標をズームをセットして表示
 +    mymap.setView([35.6896, 139.6918], 8);
 +  });
 +</script>
 +</code>
 +
 +----
 +===== DokuWiki用の特殊設定 =====
 +DokuWikiで表示するために一般とは少し異なる点が2つあります。
 +
 +「3番」のLeaflet用のCSS読込
 +
 +本来CSSはHEAD内でロードすべきですが、DokuWikiではページ別にヘッダを編集できないためJavaScriptでBODY中で取得しています。通常のウェブサイトで使用する場合は下記のコード3番のかわりにヘッダ内に記述します。
 +<code html>
 +<link rel="stylesheet" type="text/css" href="http://【自分のサーバーアドレスとパス】leaflet/v1/leaflet.css">
 +</code>
 +
 +「5番」ページがロードされてからマップを処理を開始
 +
 +CSSを後読みしているため、何もせずマップ作成するとCSSが適用される前にマップが出来てしまうため表示が崩れます。表示が崩れないようページやCSSがロードされた後にマップの処理開始するようにしています。通常なら ''window.onload = function() { 処理 }'' でも良いのですが、他にwindow.onloadがあると衝突するので衝突回避用の ''addOnload''という関数を作って ''addOnload(function(){ 処理 });''で代用させています。
 +
 +
 +<html>
 +<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
 +<!-- respon_0 -->
 +<ins class="adsbygoogle"
 +     style="display:block"
 +     data-ad-client="ca-pub-9251612436023685"
 +     data-ad-slot="1409739163"
 +     data-ad-format="auto"></ins>
 +<script>
 +(adsbygoogle = window.adsbygoogle || []).push({});
 +</script>
 +</html>
 +
 +
 +----
 +===== 説明 =====
 +
 +(1)マップを表示したい場所に下記のHTMLタグを挿入します。id名をキーとしてマップが表示されます
 +<code html>
 +<div id="mapid" style="width: 100%; height: 400px;"></div>
 +</code>
 +
 +(2)Leafletを読み込みます。
 +
 +(3)Leaflet用のCSS読込(上記参照)
 +
 +(4)マップ用インスタンス変数をグローバル変数とします。現時点ではグローバル変数にする意味はありませんがグローバル化しておくとHTMLや外部関数からマップを操作したりマップの状態を取得する事ができるのでカスタマイズする時に役立ちます。
 +<code javascript>
 +var mymap;
 +</code>
 +
 +(5)window.onload ページがロードされてからマップを処理します(上記参照)
 +
 +(6)マップオブジェクトをインスタンス化、1番のdiv要素のidと関連付けしてmymapという名前でマップを制御します。
 +<code javascript>
 +mymap = L.map('mapid');
 +//変数 = L.map(マップ用DIVのid名);
 +</code>
 +
 +(7)タイルサーバーの設定と著作権表示
 +Leaflet自身は地図データを持っていないので地図画像を入手できるタイルサーバーが必要です。ここで使用しているタイルサーバーは[[https://www.openstreetmap.org/|OpenStreetMap]]ですが利用条件がありますので使用する場合は確認して下さい。リクエスト回数が多くなる場合などはサードパーティーのタイルサーバーを探すか自分自身でタイルサーバーを準備する必要があります。
 +<code javascript>
 +  //OpenStreetMapの場合は下記ような設定と著作権表示になります
 +  L.tileLayer('https://c.tile.openstreetmap.org/{z}/{x}/{y}.png', {
 +    maxZoom: 18,
 +    attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors, '
 +  }).addTo(mymap);
 +</code>
 +
 +(8)マップにスケールバーと追加します。スケールバーが不要な場合は削除して下さい、
 +<code javascript>
 +L.control.scale({imperial:false}).addTo(mymap);
 +//L.control.scale({mertric:false}).addTo(mymap); とするとマイル表示になります
 +//L.control.scale().addTo(mymap);とするとマイルとメートルの両方出ます
 +</code>
 +
 +
 +(9)地図の中心座標と倍率をセットすると地図が表示されます。
 +<code javascript>
 +mymap.setView([35.6896, 139.6918], 8);
 +//mymap.setView([ 緯度,経度 ], ズーム);
 +</code>
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki