質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

7556閲覧

leaflet tilelayer の再表示をスムーズに行いたい

shiroikuma

総合スコア11

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/04/19 08:07

##leaflet の独自タイルレイヤーの表示方法で悩んでいます。

  • 下記のようなコードにすると、一度imgレイヤーを消してから、再度imgレイヤーを加えるように

なるのですが、例えば、時間を進むボタンなどを押して、このfunctionを呼び出すと、その度
に一度レイヤーが消えるのでチカチカして見づらいです。

javascript

1function addlayer(basetime,ft,valid,elem,l1,l2){ 2 ft = ('00' + ft ).slice( -2 ); 3 if (ft == 0 ){ft="00"}; 4 5 var imgdir = "/home/test/img/"+elem; 6 var jsondir = "/home/test/parse/json"; 7 8 //l1 = 1 (geojsom 表示) 9 //l2 = 1 (img表示) 10 11 // imgLayerの初期化 12 if (img != 0 ){ 13 map.removeLayer(img); 14 } 15 16 //imgタイルの追加 17 if (l2 == 1){ 18 img = L.tileLayer(imgdir+"/"+basetime+"/"+ft+"/{z}/{x}/{y}.png",{ 19 maxZoom: 8, 20 opacity:0.5, 21 }).addTo(map); 22 23 } 24 if (l1 == 1){ 25 //geojson の読み込み(同期) 26 $.getJSON(jsondir+"/"+valid+".json", function(data) { 27 // geoJSONLayerの初期化 28 if (geojson != 0){ 29 map.removeLayer(geojson); 30 } 31 geojson = L.geoJSON(data, { 32 onEachFeature:function (feature, layer) { 33 var name = feature.properties.area_en; 34 name = name.charAt(0).toUpperCase() + name.slice(1); 35 layer.bindPopup( 36 "CMAID:"+feature.properties.localid+"("+name+")</br>"+elem+":"+feature.properties[elem]/10 37 )}, 38 pointToLayer: function (feature, latlng) { 39 40 41 return new L.circleMarker(latlng, 42 {radius: 8, 43 fillOpacity: 0.8, 44 color: 'black', 45 fillColor: getColor(feature.properties[elem]/10,elem), 46 weight: 0,}); 47 } 48 }); 49 geojson.addTo(map); 50 }); 51 }else{ 52 //geoJSONLayerの初期化 53 if (geojson != 0){ 54 map.removeLayer(geojson); 55 } 56 } 57}
  • tilelayerのpngが全てloadされた時に、layerを消すもしくは再描画する、みたいにするといいのだと

は思いますが、公式のdocを見てもうまくやり方がわかりません。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

タイルレイヤーは複数登録できるので、消さずに処理するとか、どうでしょう。

【Leafletでちょっとカスタマイズしてみたメモ - Qiita】
https://qiita.com/ShingoOikawa/items/41a522c1361e33c3c3dd

投稿2018/04/19 14:55

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiroikuma

2018/04/20 00:35

返答ありがとうございます。 説明不足でしたが、このレイヤーは、オーバーレイ用で、時系列ごとにタイルを格納していて、時間を進めると前の時間のやるは消して、その後に次の時間のやつを表示する、みたいにしています。 wms のサーバーから取ってくるタイルをTimeDemension なんかを与えて表示するサンプルならあるんですけど、それを自作タイルでやりたいな、って感じです。 wmsサーバーから取得するときのTimeDimension のサンプル。 https://github.com/socib/Leaflet.TimeDimension
kei344

2018/04/20 02:02

その消すタイミングを遅らせればよいのでは。
shiroikuma

2018/04/20 04:44 編集

はい。そうしたいのです。 質問にも書いてますが、tilelayerのpngが全てloadされた時に、layerを消すもしくは再描画する、みたいにするといいのだとは思いますが、公式のdocを見てもうまくやり方がわかりません。。。
kei344

2018/04/20 04:47

複数追加する⇒追加した物にメインのタイルを切り替える⇒次に追加するときに最初のタイルを消す、とかすればいいのでは?
shiroikuma

2018/05/29 08:01

タイミングを調整しましたが、やはりチカチカ消えたり出たりします。 いくつか試しましたが、シームレスに表示るすには別の方法をとるしかないようです。
kei344

2018/05/29 08:16

「別の方法」とは?
shiroikuma

2018/05/29 08:20

タイル化して表示しているのは、時系列ごとのimage(サイズ大きい)でして、他のサイトを見てみると、そういう場合は、canvasに別に描画して(めんどくさいけど)それを表示させる、みたいにしているようです。geojsonの点データの表示はうまくいっているので、ベクターファイルだとうまくいくのかもしれませんね。
kei344

2018/05/29 08:31

そうなのですね、知見の共有ありがとうございます。 以前GoogleMapsAPIで近い処理をした際には2つマップを重ねて表示し、要素自体の透明度を切り替えるような実装をしたことがあります。 切り替え用に2つマップを用意し、切り替えボタンをクリックしたタイミングで準備用マップのタイルを変更して座標を同期、透明にして前面に置いてフェードで表示、という処理をしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問