leaflet:layers2
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| leaflet:layers2 [2018/10/08 13:47] – 管理者 | leaflet:layers2 [2018/12/29 20:48] (現在) – [説明] 管理者 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 🌏Leaflet 地図タイル切り替え(改) ====== | ||
| + | Leafletの標準的なタイルレイヤーコントロール(L.control.layers)([[layers|関連記事]])ではズームによってタイルサーバーや著作権表を切り替える事ができないようなので、ズームによってタイルサーバーや著作権表を切り替える機能を(無理矢理)追加してみました。 | ||
| + | |||
| + | これによって高倍率時にマップタイル無い場合に代替のマップタイルを表示したり、国土地理院の写真などでズーム別に著作権表記を書き換える必要がある場合などに利用できます。 | ||
| + | |||
| + | 注意:「Leaflet勉強のための試作プログラムなので間違っている可能性があります」「DokuWikiは個別にヘッダを編集できないので通常とは少し違う構造になっています」 | ||
| + | ---- | ||
| + | ===== デモ ===== | ||
| + | |||
| + | 地図右上のタイルコントロールから「デモ」または「デモ写真」を選びズーム変更するとズームによって地図が切り替わります。 | ||
| + | |||
| + | タイルの「デモ」を選ぶとズームによって地図タイルが白地図・カラー地形図・モノクロ地形図に切り替わります。「デモ写真」を選ぶとズームによってタイルサーバーと著作権表示が切り替わります。 | ||
| + | |||
| + | < | ||
| + | <div id=" | ||
| + | <script src=" | ||
| + | < | ||
| + | function cssLoad(cssFile){ | ||
| + | if(document.all){ | ||
| + | document.createStyleSheet(cssFile); | ||
| + | }else{ | ||
| + | var link = document.createElement(" | ||
| + | link.rel = " | ||
| + | link.href = cssFile; | ||
| + | link.type = " | ||
| + | document.getElementsByTagName(' | ||
| + | } | ||
| + | } | ||
| + | cssLoad(" | ||
| + | function addOnload(evtFunc){ | ||
| + | if(window.addEventListener) { | ||
| + | window.addEventListener(' | ||
| + | } else if(window.attachEvent){ //IE用 | ||
| + | window.attachEvent(' | ||
| + | } else { | ||
| + | // | ||
| + | } | ||
| + | } | ||
| + | var mymap; | ||
| + | |||
| + | // | ||
| + | var tileList=[]; | ||
| + | var tileNowId=-1; | ||
| + | var tileSelectName=' | ||
| + | |||
| + | // | ||
| + | // | ||
| + | tileList[0]=L.tileLayer(' | ||
| + | tileList[1]=L.tileLayer(' | ||
| + | tileList[2]=L.tileLayer(' | ||
| + | | ||
| + | // | ||
| + | tileList[3]=L.tileLayer(' | ||
| + | tileList[4]=L.tileLayer(' | ||
| + | tileList[5]=L.tileLayer(' | ||
| + | tileList[6]=L.tileLayer(' | ||
| + | | ||
| + | addOnload(function(){ | ||
| + | mymap = L.map(' | ||
| + | | ||
| + | // | ||
| + | // | ||
| + | // | ||
| + | | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | }).addTo(mymap); | ||
| + | |||
| + | mymap.setView([35.6896, | ||
| + | |||
| + | // | ||
| + | tileChange(); | ||
| + | |||
| + | // | ||
| + | mymap.on(' | ||
| + | tileSelectName=e.name; | ||
| + | tileChange(); | ||
| + | }); | ||
| + | |||
| + | // | ||
| + | mymap.on(' | ||
| + | tileChange(); | ||
| + | }); | ||
| + | }); | ||
| + | |||
| + | function tileChange(){ | ||
| + | // | ||
| + | id=-1; | ||
| + | // | ||
| + | var zoom=mymap.getZoom(); | ||
| + | if(tileSelectName===' | ||
| + | if (zoom===5) { id=0; | ||
| + | }else if(zoom===6) { id=0; | ||
| + | }else if(zoom===7) { id=1; | ||
| + | }else if(zoom===8) { id=1; | ||
| + | }else if(zoom===9) { id=2; | ||
| + | }else if(zoom===10){ id=2; | ||
| + | } | ||
| + | }else if(tileSelectName===' | ||
| + | if(zoom< | ||
| + | }else if(zoom< | ||
| + | }else if(zoom< | ||
| + | }else { id=6; // | ||
| + | } | ||
| + | } | ||
| + | // | ||
| + | // | ||
| + | if(tileNowId !== id){ | ||
| + | if(tileNowId === -1){ // | ||
| + | tileNowId = id; // | ||
| + | tileList[tileNowId].addTo(mymap); | ||
| + | }else{ | ||
| + | if(id !== -1){ | ||
| + | tileList[id].addTo(mymap); | ||
| + | } | ||
| + | tileList[tileNowId].remove(mymap);// | ||
| + | tileNowId = id; // | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | <script async src="// | ||
| + | <!-- respon_0 --> | ||
| + | <ins class=" | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | < | ||
| + | (adsbygoogle = window.adsbygoogle || []).push({}); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== ソースコード ===== | ||
| + | |||
| + | 主にコメント行のある部分が[[map]]から追加された部分です(削除された部分は書いてありません) | ||
| + | |||
| + | html部分 | ||
| + | <code html> | ||
| + | <div id=" | ||
| + | </ | ||
| + | |||
| + | JavaScript部分 | ||
| + | <code javascript> | ||
| + | <div id=" | ||
| + | <script src=" | ||
| + | < | ||
| + | function cssLoad(cssFile){ | ||
| + | if(document.all){ | ||
| + | document.createStyleSheet(cssFile); | ||
| + | }else{ | ||
| + | var link = document.createElement(" | ||
| + | link.rel = " | ||
| + | link.href = cssFile; | ||
| + | link.type = " | ||
| + | document.getElementsByTagName(' | ||
| + | } | ||
| + | } | ||
| + | cssLoad(" | ||
| + | function addOnload(evtFunc){ | ||
| + | if(window.addEventListener) { | ||
| + | window.addEventListener(' | ||
| + | } else if(window.attachEvent){ //IE用 | ||
| + | window.attachEvent(' | ||
| + | } else { | ||
| + | // | ||
| + | } | ||
| + | } | ||
| + | var mymap; | ||
| + | |||
| + | |||
| + | // | ||
| + | var tileList=[]; | ||
| + | var tileNowId=-1; | ||
| + | var tileSelectName=' | ||
| + | |||
| + | // | ||
| + | // | ||
| + | tileList[0]=L.tileLayer(' | ||
| + | tileList[1]=L.tileLayer(' | ||
| + | tileList[2]=L.tileLayer(' | ||
| + | // | ||
| + | tileList[3]=L.tileLayer(' | ||
| + | tileList[4]=L.tileLayer(' | ||
| + | tileList[5]=L.tileLayer(' | ||
| + | tileList[6]=L.tileLayer(' | ||
| + | |||
| + | |||
| + | addOnload(function(){ | ||
| + | mymap = L.map(' | ||
| + | |||
| + | |||
| + | // | ||
| + | // | ||
| + | // | ||
| + | L.control.layers({ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | }).addTo(mymap); | ||
| + | |||
| + | |||
| + | mymap.setView([35.6896, | ||
| + | |||
| + | |||
| + | // | ||
| + | tileChange(); | ||
| + | |||
| + | // | ||
| + | mymap.on(' | ||
| + | tileSelectName=e.name; | ||
| + | tileChange(); | ||
| + | }); | ||
| + | |||
| + | // | ||
| + | mymap.on(' | ||
| + | tileChange(); | ||
| + | }); | ||
| + | |||
| + | }); | ||
| + | |||
| + | |||
| + | // | ||
| + | function tileChange(){ | ||
| + | var id=-1; // | ||
| + | var zoom=mymap.getZoom(); | ||
| + | if(tileSelectName===' | ||
| + | if (zoom===5) { id=0; | ||
| + | }else if(zoom===6) { id=0; | ||
| + | }else if(zoom===7) { id=1; | ||
| + | }else if(zoom===8) { id=1; | ||
| + | }else if(zoom===9) { id=2; | ||
| + | }else if(zoom===10){ id=2; | ||
| + | } | ||
| + | }else if(tileSelectName===' | ||
| + | if(zoom< | ||
| + | }else if(zoom< | ||
| + | }else if(zoom< | ||
| + | }else { id=6; // | ||
| + | } | ||
| + | } | ||
| + | // | ||
| + | if(tileNowId !== id){ | ||
| + | if(tileNowId === -1){ | ||
| + | tileNowId = id; | ||
| + | tileList[tileNowId].addTo(mymap); | ||
| + | }else{ | ||
| + | tileList[tileNowId].remove(mymap); | ||
| + | if(id === -1){ | ||
| + | tileNowId = -1; | ||
| + | }else{ | ||
| + | tileNowId = id; | ||
| + | tileList[tileNowId].addTo(mymap); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | <script async src="// | ||
| + | <!-- respon_0 --> | ||
| + | <ins class=" | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | < | ||
| + | (adsbygoogle = window.adsbygoogle || []).push({}); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== 説明 ===== | ||
| + | 処理の概要は、通常のタイルコントロールによる地図表示は透過度ゼロで見えない状態にし、代わりに選択したタイル名とズームから表示したいマップを重ね表示しているだけです。 | ||
| + | |||
| + | 主な処理内容と使用するマップタイルごとの変更箇所は下記のようになります。 | ||
| + | |||
| + | **(1)保持変数** | ||
| + | |||
| + | タイルの表示状態を自己管理するための変数です。 | ||
| + | |||
| + | タイル名を取得する方法がわからないので、最初に表示するタイル名は '' | ||
| + | |||
| + | <code javascript> | ||
| + | var tileSelectName=' | ||
| + | </ | ||
| + | |||
| + | **(2)タイルチェンジ用** | ||
| + | |||
| + | タイル変更で使用するタイルサーバーや著作権情報などを登録します。(番号は通し番号でなくても良い) | ||
| + | |||
| + | <code javascript> | ||
| + | tileList[番号]=L.tileLayer(' | ||
| + | </ | ||
| + | |||
| + | ** (3)タイルメニューを登録 ** | ||
| + | |||
| + | 地図タイルズームで切り替えない項目は通常と同じように登録します。([[layers|関連記事]]) | ||
| + | |||
| + | 地図タイルを切り替える項目は透過度を0(opacity: | ||
| + | |||
| + | (1)の'' | ||
| + | |||
| + | minZoom, | ||
| + | |||
| + | <code javascript> | ||
| + | L.control.layers({ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | }).addTo(マップ名); | ||
| + | </ | ||
| + | |||
| + | ** (4)初回処理 ** | ||
| + | |||
| + | 初回のタイル変更用です。 | ||
| + | |||
| + | ** (5)タイル変更イベント ** | ||
| + | |||
| + | レイヤーコントロールでタイルを変更した時に発生するイベントです。選択したタイル名を取得して(7)レイヤー変更関数をを呼び出す。 | ||
| + | |||
| + | ** (6)ズーム変更イベント ** | ||
| + | |||
| + | ズームが変更した時に発生するイベント。(7)レイヤー変更関数を呼び出す | ||
| + | |||
| + | ** (7)レイヤー変更関数 ** | ||
| + | |||
| + | レイヤーコントロールで選択したタイル名とズームから実際に表示したいタイルを追加表示します。既に別のタイルが表示されている場合は先にそのタイルを削除します。 | ||
| + | |||
| + | 下記の部分の '' | ||
| + | |||
| + | <code javascript> | ||
| + | if(tileSelectName===' | ||
| + | if (zoom===5) { id=0; | ||
| + | }else if(zoom===6) { id=0; | ||
| + | }else if(zoom===7) { id=1; | ||
| + | }else if(zoom===8) { id=1; | ||
| + | }else if(zoom===9) { id=2; | ||
| + | }else if(zoom===10){ id=2; | ||
| + | } | ||
| + | }else if(tileSelectName===' | ||
| + | if(zoom< | ||
| + | }else if(zoom< | ||
| + | }else if(zoom< | ||
| + | }else { id=6; // | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
