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

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

ただいまの
回答率

90.50%

  • JavaScript

    16432questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 400

shiroikuma

score 2

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

  • 下記のようなコードにすると、一度imgレイヤーを消してから、再度imgレイヤーを加えるように
    なるのですが、例えば、時間を進むボタンなどを押して、このfunctionを呼び出すと、その度
    に一度レイヤーが消えるのでチカチカして見づらいです。
function addlayer(basetime,ft,valid,elem,l1,l2){
    ft =  ('00' + ft ).slice( -2 );
    if (ft == 0 ){ft="00"};

    var imgdir = "/home/test/img/"+elem;
    var jsondir = "/home/test/parse/json";

    //l1 = 1 (geojsom 表示)                                                                                                                                                                                                        
    //l2 = 1 (img表示)                                                                                                                                                                                                             

 // imgLayerの初期化                                                                                                                                                                                                            
    if (img != 0 ){
           map.removeLayer(img);
    }

    //imgタイルの追加                                                                                                                                                                                                              
    if (l2 == 1){
       img =  L.tileLayer(imgdir+"/"+basetime+"/"+ft+"/{z}/{x}/{y}.png",{
           maxZoom: 8,
           opacity:0.5,
       }).addTo(map);

   }
    if (l1 == 1){
        //geojson の読み込み(同期)                                                                                                                                                                                               
        $.getJSON(jsondir+"/"+valid+".json", function(data) {
            // geoJSONLayerの初期化                                                                                                                                                                                                
            if (geojson != 0){
                map.removeLayer(geojson);
            }
            geojson = L.geoJSON(data, {
                onEachFeature:function (feature, layer) {
                    var name = feature.properties.area_en;
                    name = name.charAt(0).toUpperCase() + name.slice(1);
                    layer.bindPopup(
                        "CMAID:"+feature.properties.localid+"("+name+")</br>"+elem+":"+feature.properties[elem]/10
                    )},
        pointToLayer: function (feature, latlng) {


               return new L.circleMarker(latlng,
                                              {radius: 8,
                                               fillOpacity: 0.8,
                                               color: 'black',
                                               fillColor: getColor(feature.properties[elem]/10,elem),
                                               weight: 0,});
                }
            });
            geojson.addTo(map);
        });
    }else{
        //geoJSONLayerの初期化                                                                                                                                                                                                     
        if (geojson != 0){
            map.removeLayer(geojson);
        }
    }
}
  • tilelayerのpngが全てloadされた時に、layerを消すもしくは再描画する、みたいにするといいのだと
    は思いますが、公式のdocを見てもうまくやり方がわかりません。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/20 09:35

    返答ありがとうございます。
    説明不足でしたが、このレイヤーは、オーバーレイ用で、時系列ごとにタイルを格納していて、時間を進めると前の時間のやるは消して、その後に次の時間のやつを表示する、みたいにしています。

    wms のサーバーから取ってくるタイルをTimeDemension なんかを与えて表示するサンプルならあるんですけど、それを自作タイルでやりたいな、って感じです。
    wmsサーバーから取得するときのTimeDimension のサンプル。
    https://github.com/socib/Leaflet.TimeDimension

    キャンセル

  • 2018/04/20 11:02

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

    キャンセル

  • 2018/04/20 13:43 編集

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

    キャンセル

  • 2018/04/20 13:47

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

    キャンセル

  • 2018/05/29 17:01

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

    キャンセル

  • 2018/05/29 17:16

    「別の方法」とは?

    キャンセル

  • 2018/05/29 17:20

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

    キャンセル

  • 2018/05/29 17:31

    そうなのですね、知見の共有ありがとうございます。

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16432questions

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