Openlayers - ลดการเลือกหรือสไตล์บนเลเยอร์วาดใหม่


10

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

    wfs = new OpenLayers.Layer.Vector("WFS", {
    strategies: [new OpenLayers.Strategy.BBOX({
                    resFactor: 1,
                    ratio:1
                })],
    protocol: new OpenLayers.Protocol.WFS({
              maxFeatures:1000,
              url:  myUrl,
              featureType: myFeatureType,
              featureNS: myFeaturedNS,
              version: "1.1.0"
              }),
      filter: setFilter(year, variant)
});

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

    selectCtrl = new OpenLayers.Control.SelectFeature(
        wfs,
        {
            clickout: true, toggle: false,
            multiple: false, hover: false,
            box: true,
            toggleKey: "shiftKey", // ctrl key removes from selection
            multipleKey: "shiftKey",
            eventListeners: {
                featurehighlighted: onFeatureSelect,
                featureunhighlighted: onFeatureUnselect

            }
        }
    );

@geographika

ฟังก์ชัน onFeatureSelect ของฉันและ onFeatureUnselect ของฉัน:

function onFeatureSelect(e) {
var feature = e.feature.attributes;
var featureclone = e.feature.clone();

var style = {
    pointRadius: 10,
    fillOpacity:0,
    strokeColor: "#000000"
    };

featureclone.style = style;

layer2.addFeatures([featureclone]);
selectedFeatures[featureclone.attributes.receptor_id] = featureclone;
}

function onFeatureUnselect(e) {
    var feature = e.feature.attributes;
    layer2.removeFeatures(selectedFeatures[feature.receptor_id]);   
    delete selectedFeatures[feature.receptor_id];
}

ฟังก์ชั่น onFeatureSelect ของคุณคืออะไร?
geographika

ฉันได้อัปเดตโพสต์ของฉันด้วยฟังก์ชันทั้งสองแล้ว
Boedy

คำตอบ:


4

ฉันพบวิธีที่ง่ายที่สุดในการรักษาการเลือกเวกเตอร์ในการซูมการแพนและการวาดซ้ำคือการเพิ่มเลเยอร์เวกเตอร์ที่ว่างเปล่าใหม่ลงในแผนที่ของคุณและเมื่อคุณสมบัติถูกเลือกให้วางสำเนาในเลเยอร์นี้

คุณสามารถตั้งค่าสไตล์เลเยอร์ที่เลือกให้เป็นสไตล์ที่มองเห็นได้ชัดเจน

ในฟังก์ชั่นการเน้นเครื่องมือที่คุณเลือกให้เพิ่มโคลนของคุณสมบัติเมื่อเลือกและลบออกเมื่อเลือกเป็นครั้งที่สอง

onFeatureSelect(feat){
  //check if the feature is in the select layer
  var cloned_feat = selectionLayer.getFeatureById(feat.id); 
  //or a getFeatureBy with a unique property

  if(cloned_feat){
      selectionLayer.removeFeatures([cloned_feat]);
  }
  else {
      var featCopy = feat.clone();
      this.sketchLayer.addFeatures([featCopy]);
  }
}

สิ่งนี้ง่ายขึ้นเล็กน้อย (และยังไม่ทดลอง) - คุณอาจต้องการจัดเก็บเลเยอร์การเลือกเป็นคุณสมบัติของเครื่องมือที่คุณเลือก

ตรวจสอบฟังก์ชัน getFeatureById ด้วย - คุณอาจต้องใช้คุณสมบัติที่แตกต่างในคุณสมบัติของคุณแทนที่จะใช้ ID


ขอบคุณสำหรับการตอบกลับ. ฉันคิดว่านี่อาจเป็นทางออกที่ดี ฉันกำลังเล่นซอกับโค้ดบางส่วน แต่ฉันติดอยู่ที่จุดที่เหตุการณ์ onFeatureUnselect ไม่ทำงานเมื่อการเลือกหายไป ดังนั้นในเหตุการณ์ใดที่ฉันจะลบคุณสมบัติของโคลน ดูโพสต์ต้นฉบับของฉัน
Boedy

@Boedy ดูคำตอบที่อัพเดตแล้ว คุณควรทำทุกอย่างในฟังก์ชั่นที่เลือก เลือกหนึ่งครั้งเพื่อเลือกและอีกครั้งเพื่อยกเลิกการเลือก
geographika

ขอบคุณมาก! ตรวจดูว่าคุณลักษณะอยู่ในเลเยอร์ที่เลือกหรือไม่ ตอนนี้ฉันมีปัญหาในการจัดแต่งทรงผม แต่ฉันคิดว่าฉันสามารถหามันได้
Boedy

0

จากการทดลองของฉัน ( http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html ) ดูเหมือนว่าการเลือกและสไตล์ควรได้รับการดูแลมากกว่าการซูม


ในกรณีของคุณมันใช้งานได้ แต่โค้ดของคุณไม่ได้ใช้: resFactor: 1 และอัตราส่วน: 1 ซึ่งทำให้เกิดการวาดใหม่เมื่อซูมเปลี่ยนไป ตัวอย่างของคุณไม่ทำให้เกิดการวาดซ้ำ
Boedy

ทีนี้นั่นทำให้ปัญหาแคบลงสำหรับคุณแล้ว
เอียนแทร์ตัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.