leaflet:geolocation
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| leaflet:geolocation [2018/10/06 10:42] – 管理者 | leaflet:geolocation [2018/10/06 13:00] (現在) – [Leaflet 現在位置を中心にする] 管理者 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== Leaflet 現在位置を中心にする ====== | ||
| + | GPSなどから取得した位置情報を使い、地図の中心位置に表示します。 | ||
| + | |||
| + | 注意:「Leaflet勉強のための試作プログラムなので間違っている可能性があります」「DokuWikiは個別にヘッダを編集できないので通常とは少し違う構造になっています」 | ||
| + | ---- | ||
| + | ===== デモ ===== | ||
| + | 下記の「現在地に移動」ボタンをクリックするとPCやスマートフォンのGPS・公衆無線LAN・携帯電話基地局・IPアドレスなどから位置情報を取得し地図の中心に表示します。 | ||
| + | |||
| + | * ブラウザの仕様上位置情報を取得する際にプライバシー保護の観点からユーザーに同意画面が表示されます。 | ||
| + | * サーバー側で位置情報の収集はしていません。 | ||
| + | * 初回設定後の同意変更はブラウザの設定画面などから行います。 | ||
| + | * 低精度モードで位置情報を取得しているため誤差が大きいです。 | ||
| + | * HTML5非対応のブラウザでは位置情報を取得できません。 | ||
| + | * 位置情報が取得できない場合はエラーが表示されます。 | ||
| + | |||
| + | < | ||
| + | <!-- 現在位置に移動するボタン --> | ||
| + | < | ||
| + | |||
| + | |||
| + | <div id=" | ||
| + | <script src=" | ||
| + | < | ||
| + | |||
| + | function currentPos(){ | ||
| + | |||
| + | // | ||
| + | if (navigator.geolocation === false) { | ||
| + | alert(" | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // | ||
| + | var options = { | ||
| + | enableHighAccuracy: | ||
| + | timeout: 5000, | ||
| + | maximumAge: 0 | ||
| + | }; | ||
| + | |||
| + | // | ||
| + | function success(pos) { | ||
| + | // | ||
| + | var lat=pos.coords.latitude; | ||
| + | var lon=pos.coords.longitude; | ||
| + | mymap.setView([ lat,lon ]); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | function error(err) { | ||
| + | alert(" | ||
| + | } | ||
| + | |||
| + | navigator.geolocation.getCurrentPosition(success, | ||
| + | } | ||
| + | |||
| + | | ||
| + | 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; | ||
| + | addOnload(function(){ | ||
| + | mymap = L.map(' | ||
| + | L.tileLayer(' | ||
| + | maxZoom: 18, | ||
| + | attribution: | ||
| + | }).addTo(mymap); | ||
| + | L.control.scale({imperial: | ||
| + | mymap.setView([35.6896, | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | ===== ソースコード ===== | ||
| + | HTML部分 | ||
| + | <code HTML> | ||
| + | <!-- 現在位置に移動するボタン --> | ||
| + | < | ||
| + | |||
| + | <div id=" | ||
| + | </ | ||
| + | |||
| + | JavaScript部分 | ||
| + | <code javascript> | ||
| + | <script src=" | ||
| + | < | ||
| + | |||
| + | <code javascript> | ||
| + | function currentPos(){ | ||
| + | |||
| + | // | ||
| + | if (navigator.geolocation === false) { | ||
| + | alert(" | ||
| + | } | ||
| + | |||
| + | // | ||
| + | var options = { | ||
| + | enableHighAccuracy: | ||
| + | timeout: 5000, | ||
| + | maximumAge: 0 | ||
| + | }; | ||
| + | |||
| + | // | ||
| + | function success(pos) { | ||
| + | var lat=pos.coords.latitude; | ||
| + | var lon=pos.coords.longitude; | ||
| + | mymap.setView([ lat,lon ]); // | ||
| + | } | ||
| + | |||
| + | // | ||
| + | function error(err) { | ||
| + | alert(" | ||
| + | } | ||
| + | |||
| + | // | ||
| + | navigator.geolocation.getCurrentPosition(success, | ||
| + | } | ||
| + | |||
| + | 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; | ||
| + | addOnload(function(){ | ||
| + | mymap = L.map(' | ||
| + | L.tileLayer(' | ||
| + | maxZoom: 18, | ||
| + | attribution: | ||
| + | }).addTo(mymap); | ||
| + | L.control.scale({imperial: | ||
| + | mymap.setView([35.6896, | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | ---- | ||
| + | ===== 説明 ===== | ||
| + | マップの基本部分は[[map]]をご覧ください、ここでは変更部分のみ説明します。 | ||
| + | |||
| + | |||
| + | HTML部分にプログラムを実行するためのボタンを設置します。 | ||
| + | <code HTML> | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | 位置情報の取得は、HTML5から実装されたgeolocation APIを使います。 | ||
| + | |||
| + | geolocation APIはGPSやIPアドレス・公衆無線LAN・携帯基地局などの情報から位置情報を取得します。 | ||
| + | |||
| + | 処理の流れは、(1)で未対応ブラウザを排除し、(2)~(4)で動作設定をした後に、(5)の位置情報取得のコマンドを実行、成功すればコールバックで(3)を実行し失敗すれば(4)を実行します。 | ||
| + | |||
| + | <code javascript> | ||
| + | function currentPos(){ | ||
| + | |||
| + | // | ||
| + | if (navigator.geolocation === false) { | ||
| + | alert(" | ||
| + | } | ||
| + | |||
| + | // | ||
| + | var options = { | ||
| + | enableHighAccuracy: | ||
| + | timeout: 5000, | ||
| + | maximumAge: 0 | ||
| + | }; | ||
| + | |||
| + | // | ||
| + | function success(pos) { | ||
| + | var lat=pos.coords.latitude; | ||
| + | var lon=pos.coords.longitude; | ||
| + | mymap.setView([ lat,lon ]); // | ||
| + | } | ||
| + | |||
| + | // | ||
| + | function error(err) { | ||
| + | alert(" | ||
| + | } | ||
| + | |||
| + | // | ||
| + | navigator.geolocation.getCurrentPosition(success, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **geolocationAPIのオプション** | ||
| + | |||
| + | <code javascript> | ||
| + | var options = { | ||
| + | enableHighAccuracy: | ||
| + | timeout: 5000, | ||
| + | maximumAge: 0 | ||
| + | }; | ||
| + | </ | ||
| + | * **enableHighAccuracy** | ||
| + | * 高精度(GPS)で取得するか?、高精度で取得する場合はtrue、使用しない場合はfalseを指定します。高精度モードはGPSを使用するた位置の取得に時間がかかるのと電池消費が激しいので注意して下さい。端末に高精度モードが存在しない場合はtrue・falseどちらも同じ結果を返します | ||
| + | * **timeout** | ||
| + | * タイムアウト時間、ミリ秒で指定します。高精度モードを使用する場合は長めに指定して下さい。 | ||
| + | * **maximumAge** | ||
| + | * 位置情報の有効期限、ミリ秒で指定します。0を指定すると最新の情報を取得します。数値を指定すると指定時間内に取得した情報を再利用します(未確認:GPSの連続使用による電池の消耗を抑えれると推測?) | ||
| + | |||
