Hello Everyone,
How do we extract all fields of featurelayer as an object? I tried this but didn't worked:
Solved! Go to Solution.
Blake's response gets you almost there:
// LAYER QUERY //
const query = HIMLayer.createQuery();
query.set({
where: "1=1",
returnGeometry: false
});
// RETRIEVE ALL FEATURES FROM LAYER //
HINLayer.queryFeatures(query).then((featureSet) => {
// FEATURES THAT SATISFY THE ABOVE QUERY //
const features = featureSet.features;
// CREATE LIST OF ATTRIBUTES FROM THE FEATURES //
const attributeData = features.map(feature => {
return feature.attributes;
});
// DO SOMETHING WITH LIST OF ATTRIBUTES //
document.getElementById("List").textContent = attributeData;
});
If you're only interested in the OBJECTIDS, then check out the queryObjectIds() method.
The fields property of FeatureLayer will return an array of field objects, each having a field's properties. I found this only to be available once the FeatureLayer's layerview-create event has fired.
featureLayer.on("layerview-create", function(event){
console.log(featureLayer.fields);
console.log(featureLayer.getField("NLFID"));
});
Thanks @BlakeTerhune for your reply. I used layerview-create event and tried to test the result by printing NLFID value of the first feature, but it didn't work. Can you please take a look at it? Does the 'fieldsList' variable contain all the fields (let's say the whole attribute table)?
Thanks much!
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
<title>High Injury Network</title>
<style>
html, body, #viewDiv {
padding: 0;
margin: 0;
height: 50%;
width: 100%;
}
</style>
<link rel="stylesheet" href="https://js.arcgis.com/4.18/esri/themes/light/main.css">
<script src="https://js.arcgis.com/4.18/"></script>
<script>
require([
"esri/Map",
"esri/views/MapView",
"esri/layers/FeatureLayer",
"esri/layers/GraphicsLayer",
"esri/geometry/geometryEngine",
"esri/Graphic"
], function (
Map,
MapView,
FeatureLayer,
GraphicsLayer,
geometryEngine,
Graphic
) {
var Crashes = [1,2];
var HINLayer = new FeatureLayer({
url: "https://services1.arcgis.com/wb4Og4gH5mvzQAIV/arcgis/rest/services/HIN_Columbus/FeatureServer",
outFields: ["*"],
visible: true
});
var resultsLayer = new GraphicsLayer();
var map = new Map({
basemap: "topo-vector",
layers: [HINLayer, resultsLayer]
});
var view = new MapView({
container: "viewDiv",
map: map,
center: [-82.9, 39.99], // longitude, latitude
zoom: 10
});
HINLayer.on("layerview-create", function(event){
var fieldsList= HINLayer.fields;
document.getElementById("List").innerHTML = fieldsList[0].NLFID;
});
var sortedList = Crashes.sort();
var sortedString = sortedList.join("','");
var whereClause = "VehCrashCo IN ('" + sortedString + "')";
var query = HINLayer.createQuery();
query.where = whereClause ;
// query.outStatistics = [ sumCost];
query.returnGeometry= true;
return HINLayer.queryFeatures(query).then(function(results){
resultsLayer.removeAll();
var features = results.features.map(function (graphic) {
graphic.symbol = {
color: "darkorange"
};
return graphic;
});
resultsLayer.addMany(features);
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
<div id="List"></div>
</body>
</html>
Oh, you want field values, not field names? You'll have to query the FeatureLayer and then do something with the result. In your case, if you only want to display a single value from the first feature returned. Something like this maybe? And you don't need the layerview-create event listener for query.
HINLayer.queryFeatures({
start: 0,
num: 1,
returnGeometry: false,
outFields: ["NLFID"],
})
.then(function(featureSet) {
let listContent;
if(featureSet.features.length > 0) {
listContent = featureSet.features[0].attributes.NLFID;
} else {
listContent = "There are no records in HINLayer";
}
document.getElementById("List").textContent = listContent;
});
Actually, I need to do a tradeoff analysis with the data of this layer and present the resulting features in map and charts. I need to perform multiple queries and filtering according to my task requirement, which might be possible with ArcGIS JS API but I am not familiar with it, so it will take me a lot of time. I was hoping to extract the whole attribute table in the form of an object like this:
attributeData = [ { "OBJECTID": 1, "NLFID": "CFRACR00125**C", "SUM_c_segm": 6.0, "SUM_w_segm": 11.0, "STREET_NAM": "FRANK RD"},
{ "OBJECTID": 2, "NLFID": "CFRACR00114**C", "SUM_c_segm": 5.0, "SUM_w_segm": 6.0, "STREET_NAM": "COURTRIGHT RD"},
{ "OBJECTID": 3, "NLFID": "CFRACR00602**C", "SUM_c_segm": 5.0, "SUM_w_segm": 7.0, "STREET_NAM": "TOWN ST"}
...
...
...
}]
After the analysis, I plan to pass the array of OBJECTID of resulting features to the query to display them in the map. Is it possible to extract all data in this way?
I am sorry I couldn't make it clear earlier and I apologize for your trouble.
Thank You!
Blake's response gets you almost there:
// LAYER QUERY //
const query = HIMLayer.createQuery();
query.set({
where: "1=1",
returnGeometry: false
});
// RETRIEVE ALL FEATURES FROM LAYER //
HINLayer.queryFeatures(query).then((featureSet) => {
// FEATURES THAT SATISFY THE ABOVE QUERY //
const features = featureSet.features;
// CREATE LIST OF ATTRIBUTES FROM THE FEATURES //
const attributeData = features.map(feature => {
return feature.attributes;
});
// DO SOMETHING WITH LIST OF ATTRIBUTES //
document.getElementById("List").textContent = attributeData;
});
If you're only interested in the OBJECTIDS, then check out the queryObjectIds() method.
It works, Thank you very Much @BlakeTerhune @JohnGrayson