Javascript openlayers 3获取选定特征的图层
我正在尝试获取所选功能层的“id”,并尝试了3或4种方法来实现这一点,但尚未实现 我像这样添加我的功能Javascript openlayers 3获取选定特征的图层,javascript,openlayers-3,Javascript,Openlayers 3,我正在尝试获取所选功能层的“id”,并尝试了3或4种方法来实现这一点,但尚未实现 我像这样添加我的功能 angular.forEach(response.FieldList, function (Field, key) { if (Field.FieldID != "") { var shape = response.FieldList[key].Shape; shape = sha
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
})
}
}
});
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 = ' ';
}
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;
}
};
这可能吗?非常感谢您的帮助 看看。似乎没有一种内置的方法来获取要素所在的包含源(或层)。所以,至少在我看来,你有两个选择
第一种选择是保持代码不变(使用map.forEachFeatureAtPixel
…),但要确保在调用mySource.addFeature(myFeature)
之前,对每个功能调用set(key,value,opt_silent)
其中的键应该是sourceId
(或layerId
)该值将是包含源(或层)的标识值。因此,OpenLayers获取层ID的魔力将具体化为feature.get('layerId')
第二个选择是,而不是使用<代码> MAP.PrimaExtCurrasePrime,考虑使用沿
线的东西。// 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);
....
}
这样,您就知道每个功能的父源是谁,因为您直接询问父源clickedFeatures1
和clickedFeatures2
是数组,当然其中任何一个都可以为空
对于功能的ID和名称,添加功能时是否具有此类属性?如果没有,在添加功能之前,请按照以下步骤进行操作:
myFeature.setId(42);
myFeature.set('name', 'foo');
mySource.addFeature(myFeature);
在openlayers 4中,我能够获得每个选定功能的图层,如下所示: (我不确定这是否适用于OL3)
请参见如何将功能添加到源?你必须为每个人设置一个
id
,感谢Jonatas的回复…我得出了相同的结论,但正在努力找出如何正确添加“id”…我将用适当的代码编辑我的问题。OpenLayers不会(有意)从你的对象读取id
。您必须使用ol.Feature#setId
。看看你的代码,很难理解为什么你要在一个循环中创建一个新的ol.source.Vector
和一个新的ol.layer.Vector
。谢谢你的回复,我认为问题不在于“获取”代码的结尾意味着当我把矢量特征放在地图上并高亮显示它们时…我认为这是在图层上创建并正确添加“id”。我当然会使用myFeature.setId(42);myFeature.set('name','foo');addFeature(myFeature);如果是直接的,但我是通过ol.source.vector添加功能的,我不知道如何添加和id。
myFeature.setId(42);
myFeature.set('name', 'foo');
mySource.addFeature(myFeature);
var infoClicker = map.on('click', function(evt) {
map.forEachFeatureAtPixel(evt.pixel,
function(feature, layer) {
var idLayer = layer.get('myLayerID');