Leaflet tidak menampilkan titik-titik dengan warna tertentu dari suatu layerGroup

Saya menggunakan selebaran untuk menggambar jalur yang terkait dengan kendaraan. Setiap jalur kendaraan terdiri dari sebuah layerGroup untuk memungkinkan adanya warna berbeda di jalur tersebut (karena warna bergantung pada suhu). Data diterima dari soket web dalam format berikut (seperti yang ditampilkan oleh konsol debug chromium):

Object {color: "#cc0099", legende: "<someHtmlCode.TheSameForEveryPieceOfData>", data: {lat: 48.77905, lon: -3.44891}, c2a_id: "vehicle_1"}

Masalah saya adalah untuk nilai warna tertentu (nuansa biru berbeda) jalurnya tidak digambar di peta tetapi untuk nilai warna lainnya berfungsi dengan baik. Jika saya mengubah tingkat zoom maka semuanya ditampilkan (setiap warna yang saya gunakan).

Anda dapat melihat bahwa beberapa warna biru telah muncul pada gambar kedua (di jalur sebelumnya), yang seharusnya tenggelam tanpa perlu mengubah tingkat zoom.

Kode saya untuk menambahkan data ke lapisan.

var idAllLayers;
if (_data != null && _data['data'] != null) {
    current_lon = _data['data']['lon'];
    current_lat = _data['data']['lat'];

    // checking if there is already a layer associated to the vehicle _id_
    if (!(this.layer_group_real_time.hasLayer(id))) {
        var multi_polyline = L.layerGroup([]);  //create a layer for this vehicle
        multi_polyline._leaflet_id = id;
        //add a sublayer to this one (for a sub path to have different colors)
        multi_polyline.addLayer(this.newLayer(id, _data['color']));
        this.layer_group_real_time.addLayer(multi_polyline);
    }

    // get the differents layers of the layerGroup for the vehicle _id_
    idAllLayers = this.layer_group_real_time.getLayer(id).getLayers();
    currentLayerLatLng = idAllLayers[idAllLayers.length-1].getLatLngs();
    if (current_lat != null && current_lon != null) {
        // if previous elements have been stored
        if (this.previousDataPoints[id] != null && this.previousColor[id] != null) {
            oldDataPoint = this.previousDataPoints[id]['data'];
            delta = this.measure(current_lat, current_lon, oldDataPoint['lat'], oldDataPoint['lon']);
            if (delta > MAX_DIST || _data['color'] != this.previousColor[id]) { 
                if (delta < MAX_DIST){  // case where color has changed but we still need to add the point to the previous subpath
                    currentLayerLatLng.push(L.latLng(current_lat, current_lon));
                }                                     
                this.layer_group_real_time.getLayer(id).addLayer(this.newLayer(id, _data['color']));
                idAllLayers = this.layer_group_real_time.getLayer(id).getLayers();
                currentLayerLatLng = idAllLayers[idAllLayers.length - 1].getLatLngs();
             }
         }
         currentLayerLatLng.push(L.latLng(current_lat, current_lon));
         idAllLayers[idAllLayers.length - 1].setLatLngs(currentLayerLatLng);  // setting up the new coords
         this.previousDataPoints[id] = _data;
         this.previousColor[id] = _data['color'];
     }
 }

newLayer: function (_id, _color) {
        var nl = L.polyline([],
            {
                color: _color,
                opacity: 0.7,
                stroke: true,
                weight: 6,
                vehicle_id: _id
            });
        nl.on('click', this.traceOnClick);
        return nl;
    },

[EDIT]

Berikut adalah "contoh minimal, lengkap, dan dapat diverifikasi" (setidaknya saya berharap demikian) yang saya unggah di Github. Ini berisi peta di mana ditampilkan beberapa jalur. Saat memuat, jalur yang ditampilkan harus berwarna hijau dan merah muda tetapi jika Anda mengubah tingkat zoom, jalur biru akan muncul. Saya telah mengintegrasikan saran @Jieter dan @snkashis tetapi masalahnya masih ada.


person Sam_H_Cadman    schedule 21.06.2016    source sumber
comment
Contoh Anda agak sulit dibaca, tetapi saya perhatikan Anda menetapkan _leaflet_ids. Itu bukan sesuatu yang seharusnya Anda lakukan, ini mungkin berhasil, tetapi mungkin juga menimbulkan beberapa kesalahan yang sulit dilacak. Apakah Anda mungkin mengalami tabrakan identitas?   -  person Jieter    schedule 21.06.2016
comment
Saya telah melakukan itu untuk dengan mudah menemukan layerGroup yang terkait dengan satu kendaraan (multi_polyline saya buat untuk kendaraan jika belum ada). Ini dilakukan untuk setiap lapisan kendaraan tetapi tidak pada tingkat sublapisan (yang saya tambahkan ke multi_polyline). Saya rasa saya tidak mengalami tabrakan id, saya tidak mengalami kesalahan tentang hal seperti itu dan tidak ada gunanya ditambahkan ke jalur yang salah. Harus saya akui, saya tidak tahu bagaimana cara memastikannya. Namun saya akan mencoba mengubah cara saya menangani berbagai lapisan setiap kendaraan, tanpa menugaskan _leaflet_id   -  person Sam_H_Cadman    schedule 21.06.2016
comment
Leaflet menyimpan lapisan dalam suatu objek dengan _leaflet_ids sebagai kuncinya. Jika Anda memiliki lapisan yang hilang, saya curiga ada sesuatu yang tertimpa karena idnya tidak lagi unik.   -  person Jieter    schedule 21.06.2016
comment
Saya telah mengubah kode saya sehingga _leaflet_id tidak lagi diedit secara langsung. Saya menggunakan beberapa array asosiatif untuk dengan mudah menemukan kembali layerGroup yang terkait dengan kendaraan saya. Sayangnya tidak ada yang berubah: sub lapisan 'biru' masih tidak ditampilkan ketika sebuah titik ditambahkan dan hanya muncul ketika tingkat zoom diubah. Hal yang mengganggu adalah masalah hanya terjadi ketika menambahkan titik ke segmen 'biru' pada jalur saya.   -  person Sam_H_Cadman    schedule 21.06.2016
comment
Debug akan lebih mudah jika kita dapat melihat contoh minimal, lengkap, dan dapat diverifikasi   -  person Jieter    schedule 21.06.2016
comment
Butuh beberapa waktu bagi saya, tetapi saya telah memperbarui pertanyaan saya dengan tautan GitHub ke contoh yang sesuai dengan apa yang Anda minta.   -  person Sam_H_Cadman    schedule 22.06.2016


Jawaban (2)


Saya masih melihat multi_polyline._leaflet_id = id; dalam contoh Anda..mengapa Anda tidak menggunakan L.Util.setOptions untuk menandai pengenal internal Anda sendiri (id kendaraan, dll)?

person snkashis    schedule 21.06.2016
comment
Ketika saya mendapatkan kode ini, itu dilakukan dengan cara ini dan saya tidak tahu tentang L.Util.setOptions. Saya telah mengubah kode saya untuk menggunakannya tetapi masalahnya masih ada. Saya telah memperbarui posting saya dengan contoh di GitHub. - person Sam_H_Cadman; 22.06.2016
comment
Dan apakah ada alasan khusus mengapa Anda tidak dapat menggunakan plugin bawaan untuk fungsi ini seperti iosphere.github. io/Leaflet.hotline/demo alih-alih membuat implementasi lain? - person snkashis; 22.06.2016
comment
Saya tidak tahu tentang keberadaan plugin ini. Saya sudah mencobanya. Ini melakukan hal-hal yang cukup bagus tetapi tampaknya agak berat bagi saya (peta/browser menjadi sangat lambat setelah beberapa menit menampilkan data waktu nyata) dan ini juga merupakan sumber beberapa masalah dengan kontrol peta (misalnya menyeret peta). - person Sam_H_Cadman; 23.06.2016

Akhirnya saya mendapat ide untuk mengubah jenis lapisan kendaraan dari L.layerGroup menjadi L.geoJson. Dan itu berhasil! Meski aku tidak tahu alasannya.

Saya telah memperbarui repositori Git dengan solusi saya.


(Seperti yang dikatakan sebelumnya di komentar, saya juga berhenti melakukan multi_polyline._leaflet_id = id; dan sekarang menggunakan L.Util.setOptions(vehicleLayer, {vehicle_id: id});. Omong-omong, saya telah mengganti nama multi_polyline menjadi vehicleLayer.)

person Sam_H_Cadman    schedule 23.06.2016
comment
Saya agak lambat dalam mengubah solusi Anda menjadi sesuatu yang berhasil (berhenti mengerjakannya sejak mengetahui bahwa Anda berhasil), beberapa catatan: - person Jieter; 24.06.2016
comment
L.LatLng memiliki metode distanceTo yang melakukan apa yang dilakukan fungsi measure Anda. Menggunakan objek latlng lengkap mengurangi sedikit kekacauan dalam kode Anda karena Anda memerlukan variabel 2x lebih sedikit sekarang. - person Jieter; 24.06.2016
comment
Contoh Anda tidak terlalu minimal dengan 18k kode JS, Anda bisa menunjukkan masalahnya dengan katakanlah 10 segmen. - person Jieter; 24.06.2016
comment
Saya telah mengganti fungsi `ukur` saya dengan distanceTo. Ini berfungsi dengan sempurna dan kodenya lebih mudah dibaca. Saya akan mengingat saran kedua Anda untuk posting saya berikutnya. Terima kasih! - person Sam_H_Cadman; 24.06.2016