对于所选择的特征的OpenLayers 3 GET层(openlayers 3 get layer

2019-09-29 17:43发布

我试图让该层的“ID”为选定的功能,并可能尝试实现这一目标3点或4的方法,但还没有实现它。

添加我的特点是这样的...

 angular.forEach(response.FieldList, function (Field, key) {
                if (Field.FieldID != "") {
                    var shape = response.FieldList[key].Shape;
                    shape = shape.replace('}', ',"id":' + '"' + Field.FieldID + '"' + '}');
                    var geoJsonObj = {
                        'type': 'Feature',
                        'geometry': JSON.parse(shape),
                        'name': Field.FieldID,
                        'id': Field.FieldID

                    }
                    var vectorSource = new ol.source.Vector({
                        features: (new ol.format.GeoJSON()).readFeatures(geoJsonObj)
                    });

                      Fields[Field.FieldID] = new ol.layer.Vector({
                        projection: 'EPSG:4269',
                        source: vectorSource,
                        id: Field.FieldID,
                        name: 'Fields',
                        style: function (feature, resolution) {
                            var text = resolution * 100000 < 10 ? response.FieldList[key].Acres : '';

                            if (text != "") {
                                styleCache[text] = [new ol.style.Style({
                                    stroke: new ol.style.Stroke({
                                        color: '#319FD3',
                                        width: 1
                                    }),
                                    text: new ol.style.Text({
                                        font: '12px Calibri,sans-serif',
                                        text: text,
                                        fill: new ol.style.Fill({
                                            color: '#000'
                                        }),
                                        stroke: new ol.style.Stroke({
                                            color: '#fff',
                                            width: 3
                                        })
                                    }),
                                    fill: new ol.style.Fill({
                                        color: rcisWebMapUtilities.convertHex(response.FieldList[key].Shade, '0.5')
                                    })
                                })];
                            }
                            else if (text == "") {
                                styleCache[text] = [new ol.style.Style({
                                    fill: new ol.style.Fill({
                                        color: rcisWebMapUtilities.convertHex(response.FieldList[key].Shade, '0.5')
                                    })
                                })
                                ]
                            } return styleCache[text];
                        }


                      });



                      webMapValues.vectorFieldLayer.push(Fields[Field.FieldID])
                      webMapValues.fieldValues.push({
                          color: response.FieldList[key].Shade,
                          plantingName: response.FieldList[key].CropNickName,
                          acres: response.FieldList[key].Acres,
                          cropId: response.FieldList[key].CropID,
                          cropNumber: response.FieldList[key].CropNumber,
                          fieldID: response.FieldList[key].FiledID,
                          fieldName: response.FieldList[key].FieldName,
                          legalDesc: response.FieldList[key].LegalDesc,
                          policyNum: response.FieldList[key].PolicyNumber
                      })
                      var found = $filter('filter')(webMapValues.legend, { plantingName: response.FieldList[key].CropNickName }, true);
                      if (found == 0) {
                          webMapValues.legend.push({
                              color: response.FieldList[key].Shade,
                              plantingName: response.FieldList[key].CropNickName                          
                          })
                      }
                }
            });

你可以看到我正在尝试设置在很多地方的“ID” ......即使改变以GeoJSON包括“身份证”,但它似乎得到某种方式丢弃,是不是有当我想用它?

我使用的是map.on“点击”像这样...

map.on('click', function (evt) {
        var pixel = map.getEventPixel(evt.originalEvent);
        displayFeatureInfo(evt.pixel, evt.coordinate);

        //var coordinate = evt.coordinate;


    })

这个代码来执行的亮点...

 var highlight;
    var displayFeatureInfo = function (pixel,coordinate) {

        var feature = map.forEachFeatureAtPixel(pixel, function (feature) {
            var id = Opelayers magic to get layer id;
            return feature;
        });

        var info = document.getElementById('info');
        if (feature) {
            info.innerHTML = feature.getId() + ': ' + feature.get('name');


        } else {
            info.innerHTML = '&nbsp;';
        }

        if (feature !== highlight) {
            if (highlight) {
                featureOverlay.getSource().removeFeature(highlight);
            }
            if (feature) {
                featureOverlay.getSource().addFeature(feature);
                document.getElementById('popup-content').innerHTML = '<p>It is working</p>';
                popup.setPosition(coordinate);
            }

            highlight = feature;
        }

    };

feature.getId()feature.get('name')返回undefined?

之后我得到的功能,我想获得该层的“ID”它是。 所以可能在此代码...

var feature = map.forEachFeatureAtPixel(pixel, function (feature) {
            var id = Opelayers magic to get layer id;
            return feature;
        });

这可能吗? 任何帮助是极大的赞赏!!

Answer 1:

看看ol.Feature 。 似乎没有成为一个内置的方式来获取包含源(或层),该功能在。所以,你有两个选择,至少我看到它的方式。

第一个选择是让你的代码是(使用map.forEachFeatureAtPixel ...),但确保每个要素,在这之前你叫的地方mySource.addFeature(myFeature) ,可以调用set(key, value, opt_silent)其中将键sourceId (或layerId )并将该值将是含源(或层)的标识值。 所以魔术的OpenLayers拿到层ID将被物化为feature.get('layerId')

第二个选择是不是使用, map.forEachFeatureAtPixel ,要考虑使用的东西沿着线:

// When there is a single click on the map.
map.on('singleclick', function(evt) {
    // Get all features at the event's coordinate for mySource1 and for mySource2 separately.
    var clickedFeatures1 = mySource1.getFeaturesAtCoordinate(evt.coordinate);
    var clickedFeatures2 = mySource2.getFeaturesAtCoordinate(evt.coordinate);
    ....
}

你知道这样,谁的父母源是每个功能,因为你直接问家长。 clickedFeatures1clickedFeatures2是阵列,其中任一个可以,当然,是空的。

至于该功能的ID和姓名,没有特征具有这样的属性被添加的时候吗? 如果没有,添加该功能之前,沿此线走:

myFeature.setId(42);
myFeature.set('name', 'foo');
mySource.addFeature(myFeature);


Answer 2:

在4的OpenLayers,我能得到每个选定的功能层是这样的:(林不知道,如果这个工程在OL3)

var infoClicker = map.on('click', function(evt) {
    map.forEachFeatureAtPixel(evt.pixel,
        function(feature, layer) {
            var idLayer = layer.get('myLayerID');

见http://openlayers.org/en/latest/apidoc/ol.Map.html#forEachFeatureAtPixel



文章来源: openlayers 3 get layer for selected feature