一、PopupTemplate实现

var featureLayer = new FeatureLayer({
url: "...",
});

map.add(featureLayer);
featureLayer.when(() => {
let popupTemplate = {
title: featureLayer.title,
outFields: ["*"],
content: [{
type: "fields",
fieldInfos: featureLayer.fields.map(item=>({fieldName:item.name}))
}]
};
// console.log(popupTemplate);
featureLayer.popupTemplate = popupTemplate;
})

实现效果

JS API模块之FeatureLayer要素点击查询_属性表

二、View实现

var featureLayer = new FeatureLayer({
url: "...",
});

// 创建一个GraphicLayer,用来绘制查询结果
var graphicsLayer = new GraphicsLayer();

map.add(graphicsLayer);
map.add(featureLayer);

view.on("click", (event)=> {
view.hitTest(event).then(function (results) {
console.log("results:",results);
if (results.results.length) {
addGraphics(results.results);
}
});
});

function addGraphics(result) {
graphicsLayer.removeAll();
result.forEach(function (item) {
if (item.graphic.geometry.type == "point") {
} else if (item.graphic.geometry.type == "polyline") {

} else if (item.graphic.geometry.type == "polygon") {
const fillSymbol = {
type: "simple-fill",
color: [227, 139, 79, 0.8],
outline: {
color: [255, 255, 255],
width: 1,
},
};
var g = new Graphic({
geometry: item.graphic.geometry,
symbol: fillSymbol,
spatialReference: map.spatialReference
});
}
// console.log(Object.prototype.toString.call(feature));
graphicsLayer.add(g);
view.goTo(g);
});
}

实现效果

JS API模块之FeatureLayer要素点击查询_字段_02

三、FeatureLayer实现

var featureLayer = new FeatureLayer({
url: "...",
});

// 创建一个GraphicLayer,用来绘制查询结果
var graphicsLayer = new GraphicsLayer();

map.add(graphicsLayer);
map.add(featureLayer);
// Set up a click event handler and retrieve the screen point
view.on("click", (event) => {
// 查询的是attributes的内容
let query = featureLayer.createQuery();
query.geometry = event.mapPoint;
query.spatialRelationship = "intersects";
featureLayer.queryFeatures(query).then(function (results) {
// 返回一个要素集合
console.log("results:", results);
if(results.features.length>0)
addGraphics(results.features);
})
})
function addGraphics(result) {
graphicsLayer.removeAll();
result.forEach(function (feature) {
if (feature.geometry.type == "point") {
} else if (feature.geometry.type == "polyline") {

} else if (feature.geometry.type == "polygon") {
const fillSymbol = {
type: "simple-fill",
color: [227, 139, 79, 0.8],
outline: {
color: [255, 255, 255],
width: 1,
},
};
var g = new Graphic({
geometry: feature.geometry,
symbol: fillSymbol,
spatialReference: map.spatialReference
});
}
// console.log(Object.prototype.toString.call(feature));
graphicsLayer.add(g);
view.goTo(g);
});
}

实现效果

JS API模块之FeatureLayer要素点击查询_字段_03

四、FeatureLayerView实现

var featureLayer = new FeatureLayer({
url: "...",
});

let highlight;
view.on("click", (event) => {
view.whenLayerView(featureLayer).then(function (layerView) {
// 查询的是attributes的内容
let query = layerView.createQuery();
query.geometry = event.mapPoint;
query.spatialRelationship = "intersects";
layerView.queryFeatures(query).then(function (result) {
console.log("result:", result);
if (highlight) {
highlight.remove();
}
if (result.features.length) {
highlight = layerView.highlight(result.features);
view.goTo(result.features[0].geometry);
}

})
});
})

实现效果

JS API模块之FeatureLayer要素点击查询_属性表_04

我们可以看到FeatureLayer和FeatureLayerView查询的返回结果几乎一致,那区别在哪里呢?

​FeatureLayer​

JS API模块之FeatureLayer要素点击查询_属性表_05


​FeatureLayerView​

JS API模块之FeatureLayer要素点击查询_字段_06

可以看出,​​FeatureLayer​​​返回的attributes是属性表所有字段及内容,而​​FeatureLayerView​​返回的attributes只含有部分属性表的字段及内容。

所以在使用​​query.where​​指定属性查询的时候,就有所区别了。

另外,​​FeatureLayer​​​的查询会向后台发送请求,而​​FeatureLayerView​​不会。

​view​

JS API模块之FeatureLayer要素点击查询_属性表_07

箴言:因为这些东西是非常简单的。不要抱怨自己学不会,那是因为你没有足够用心。