แผ่นพับไม่แสดงจุดสีใดสีหนึ่งจากกลุ่มเลเยอร์

ฉันใช้แผ่นพับเพื่อวาดเส้นทางที่เกี่ยวข้องกับยานพาหนะ เส้นทางของยานพาหนะแต่ละเส้นทางประกอบด้วยกลุ่มเลเยอร์เพื่อให้มีสีที่แตกต่างกันในเส้นทาง (เนื่องจากสีขึ้นอยู่กับอุณหภูมิ) ข้อมูลที่ได้รับจากเว็บซ็อกเก็ตในรูปแบบต่อไปนี้ (ตามที่แสดงโดยคอนโซลดีบักของโครเมียม):

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

ปัญหาของฉันคือสำหรับค่าสีบางค่า (เฉดสีน้ำเงินที่แตกต่างกัน) เส้นทางไม่ได้ถูกวาดลงบนแผนที่ แต่สำหรับค่าสีอื่น ๆ นั้นทำงานได้ถูกต้อง ในกรณีที่ฉันเปลี่ยนระดับการซูม ทุกอย่างจะปรากฏขึ้น (ทุกสีที่ฉันใช้)

คุณจะเห็นว่ามีสีน้ำเงินบางส่วนปรากฏขึ้นบนรูปภาพที่สอง (เหนือเส้นทางก่อนหน้า) ซึ่งควรจะจมลงโดยไม่จำเป็นต้องเปลี่ยนระดับการซูม

รหัสของฉันสำหรับการเพิ่มข้อมูลลงในเลเยอร์

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;
    },

[แก้ไข]

นี่คือ "ตัวอย่างขั้นต่ำ สมบูรณ์ และตรวจสอบได้" (อย่างน้อยฉันก็หวังว่าจะเป็นเช่นนั้น) ฉันได้อัปโหลดบน Github. มีแผนที่ที่แสดงเส้นทางบางส่วน เมื่อโหลดเส้นทางที่แสดงควรเป็นสีเขียวและสีชมพู แต่หากคุณเปลี่ยนระดับการซูม เส้นทางสีน้ำเงินควรปรากฏขึ้น ฉันได้รวมข้อเสนอแนะ @Jieter และ @snkashis แล้ว แต่ปัญหายังคงอยู่ที่นี่


person Sam_H_Cadman    schedule 21.06.2016    source แหล่งที่มา
comment
ตัวอย่างของคุณอ่านยากนิดหน่อย แต่ฉันสังเกตเห็นว่าคุณกำหนด _leaflet_ids นั่นไม่ใช่สิ่งที่คุณควรทำ มันอาจจะได้ผล แต่ก็อาจทำให้เกิดข้อผิดพลาดที่ติดตามได้ยากเช่นกัน คุณอาจมีการชนกันของรหัสหรือไม่?   -  person Jieter    schedule 21.06.2016
comment
ฉันได้ดำเนินการดังกล่าวเพื่อค้นหา layerGroup ที่เกี่ยวข้องกับยานพาหนะคันหนึ่งอย่างง่ายดาย (multi_polyline ที่ฉันสร้างสำหรับยานพาหนะหากไม่มีอยู่) เสร็จสิ้นแล้วสำหรับยานพาหนะแต่ละเลเยอร์ แต่ไม่ใช่ในระดับเลเยอร์ย่อย (อันที่ฉันเพิ่มใน multi_polyline) ฉันไม่คิดว่ามีการชนกันของรหัส ฉันไม่มีข้อผิดพลาดเกี่ยวกับเรื่องนั้นและไม่มีการเพิ่มประเด็นใด ๆ ในเส้นทางที่ผิด ฉันต้องยอมรับว่าฉันไม่รู้ว่าจะแน่ใจได้อย่างไร อย่างไรก็ตาม ฉันจะพยายามเปลี่ยนวิธีจัดการกับเลเยอร์ต่างๆ ของยานพาหนะแต่ละคัน โดยไม่ต้องกำหนด _leaflet_id   -  person Sam_H_Cadman    schedule 21.06.2016
comment
แผ่นพับเก็บเลเยอร์ในวัตถุโดยมี _leaflet_ids เป็นคีย์ หากคุณมีเลเยอร์ที่หายไป ฉันสงสัยว่ามีบางสิ่งถูกเขียนทับเนื่องจากรหัสไม่ซ้ำกันอีกต่อไป   -  person Jieter    schedule 21.06.2016
comment
ฉันได้เปลี่ยนรหัสของฉันแล้ว ดังนั้น _leaflet_id จึงไม่ได้รับการแก้ไขโดยตรงอีกต่อไป ฉันใช้อาเรย์เชื่อมโยงเพื่อค้นหา layerGroup ที่เกี่ยวข้องกับรถของฉันได้อย่างง่ายดาย น่าเสียดายที่ไม่มีอะไรเปลี่ยนแปลง: เลเยอร์ย่อย 'สีน้ำเงิน' ยังคงไม่แสดงเมื่อมีการเพิ่มจุด และจะปรากฏเฉพาะเมื่อเปลี่ยนระดับการซูมเท่านั้น จุดที่น่ารำคาญคือปัญหาจะเกิดขึ้นเฉพาะเมื่อเพิ่มจุดลงในส่วน 'สีน้ำเงิน' ของเส้นทางของฉันเท่านั้น   -  person Sam_H_Cadman    schedule 21.06.2016
comment
การแก้ไขจุดบกพร่องคงจะง่ายกว่าถ้าเราดูตัวอย่างที่น้อยที่สุด ครบถ้วน และตรวจสอบได้   -  person Jieter    schedule 21.06.2016
comment
ฉันต้องใช้เวลาพอสมควร แต่ฉันได้อัปเดตคำถามของฉันด้วยลิงก์ GitHub เป็นตัวอย่างซึ่งควรสอดคล้องกับสิ่งที่คุณถาม   -  person Sam_H_Cadman    schedule 22.06.2016


คำตอบ (2)


ฉันยังคงเห็น multi_polyline._leaflet_id = id; ในตัวอย่างของคุณ..เหตุใดคุณจึงไม่ใช้ L.Util.setOptions เพื่อทำเครื่องหมายตัวระบุภายในของคุณเอง (รหัสยานพาหนะ ฯลฯ)

person snkashis    schedule 21.06.2016
comment
เมื่อฉันได้โค้ดนี้มา มันก็เป็นแบบนี้ และฉันไม่รู้เกี่ยวกับ L.Util.setOptions ฉันเปลี่ยนรหัสเพื่อใช้งานแล้ว แต่ปัญหายังคงอยู่ ฉันได้อัปเดตโพสต์ของฉันด้วยตัวอย่างบน GitHub - person Sam_H_Cadman; 22.06.2016
comment
และมีเหตุผลเฉพาะที่ทำให้คุณไม่สามารถใช้ปลั๊กอินที่สร้างไว้ล่วงหน้าสำหรับฟังก์ชันนี้เช่น iosphere.github io/Leaflet.hotline/demo แทนที่จะสร้างการใช้งานอื่นใช่ไหม - person snkashis; 22.06.2016
comment
ฉันไม่รู้เกี่ยวกับการมีอยู่ของปลั๊กอินนี้ ฉันลองดูแล้ว มันค่อนข้างดี แต่ดูเหมือนว่าจะหนักไปหน่อยสำหรับฉัน (แผนที่/เบราว์เซอร์ช้าลงมากหลังจากแสดงข้อมูลเรียลไทม์ไปไม่กี่นาที) และยังเป็นสาเหตุของปัญหาบางอย่างกับการควบคุมแผนที่ (เช่น ลากแผนที่) - person Sam_H_Cadman; 23.06.2016

ในที่สุดฉันก็มีแนวคิดที่จะเปลี่ยนประเภทของเลเยอร์ยานพาหนะจาก L.layerGroup เป็น L.geoJson และมันก็ได้ผล! แม้ว่าฉันจะไม่รู้ว่าทำไม

ฉันได้อัปเดต ที่เก็บ Git ด้วยโซลูชันของฉันแล้ว


(ดังที่กล่าวไว้ก่อนหน้านี้ในความคิดเห็น ฉันได้หยุดทำ multi_polyline._leaflet_id = id; และตอนนี้ใช้ L.Util.setOptions(vehicleLayer, {vehicle_id: id}); ฉันเปลี่ยนชื่อ multi_polyline เป็น vehicleLayer แล้ว)

person Sam_H_Cadman    schedule 23.06.2016
comment
ฉันช้าเล็กน้อยในการเปลี่ยนโซลูชันของคุณเป็นสิ่งที่ใช้ได้ผล (หยุดทำเพราะสังเกตว่าคุณใช้งานได้) หมายเหตุบางประการ: - person Jieter; 24.06.2016
comment
L.LatLng มีเมธอด DistanceTo ซึ่งทำหน้าที่เหมือนกับที่ฟังก์ชัน measure ของคุณทำ การใช้อ็อบเจ็กต์ latlng ที่สมบูรณ์จะช่วยลดความยุ่งเหยิงในโค้ดของคุณเล็กน้อย เนื่องจากตอนนี้คุณต้องการตัวแปรน้อยลง 2 เท่า - person Jieter; 24.06.2016
comment
ตัวอย่างของคุณไม่ได้น้อยมากด้วยรหัส JS ขนาด 18k คุณสามารถแสดงปัญหาได้ด้วย 10 ส่วน - person Jieter; 24.06.2016
comment
ฉันได้แทนที่ฟังก์ชัน `measure` ของฉันด้วย distanceTo มันทำงานได้อย่างสมบูรณ์และโค้ดก็อ่านง่ายกว่า ฉันจะจำคำแนะนำที่สองของคุณไว้สำหรับโพสต์ถัดไปของฉัน ขอบคุณ! - person Sam_H_Cadman; 24.06.2016