Hello, I'm using this this guide to identify which layers were clicked on MapView.
it works perfectly for every layers I have except from Feature Collection Layers. where the attributes are in a feature table and not elements.
how do I get the attributes inside a feature table?
to identify layers:
fun identifyClickedLayerResults(point: android.graphics.Point, mMap: MapView, callback: (MutableList<IdentifyLayerResult>) -> Unit){ val TAG = "ClickedLayerResults" var identifyLayerResult: MutableList<IdentifyLayerResult> val identifyLayerResultsFuture = mMap .identifyLayersAsync(point, 12.0, false, 5) identifyLayerResultsFuture.addDoneListener { try { identifyLayerResult = identifyLayerResultsFuture.get() callback(identifyLayerResult) } catch (e: InterruptedException) { Log.e(TAG, "Error identifying results: " + e.message) } catch (e: ExecutionException) { Log.e(TAG, "Error identifying results: " + e.message) } } }
to get attributes:
fun layerDetails(forLayer: IdentifyLayerResult): ArrayList<Map<String, String>>{ val resultGeoElements = forLayer.elements if (forLayer.layerContent.name == "Feature Collection"){ //doesn't work here } var mAttributesString = ArrayList<String>() var layersAttributeList = ArrayList<Map<String, String>>() if (!resultGeoElements.isEmpty()){ resultGeoElements.forEach { if (it is ArcGISFeature){ val mArcGISFeature = it as? ArcGISFeature mAttributesString.add(mArcGISFeature?.attributes.toString()) var mTempMap = mutableMapOf<String, String>() mArcGISFeature?.attributes?.forEach { if (!it.value.toString().isEmpty() && !it.key.toString().isEmpty() && !it.key.toString().contains(".FID")) mTempMap[it.key.toString()] = it.value.toString() } layersAttributeList.add(mTempMap) } } } return layersAttributeList }
what i got now :
private fun featureCollectionDetails(forLayer: IdentifyLayerResult){ var featureCollectionLayer = forLayer.layerContent as FeatureCollectionLayer var mFeatureTable = featureCollectionLayer.layers[0].featureTable }
the code is in kotlin, its ok if the answer will be in java
Solved! Go to Solution.
Actually, looking at your code, I must not understand what you're trying to achieve. I'm not an Android dev, but it looks like you're stripping out all the attributes from all the identified features, converting each attribute value to a string (is there a reason you want to discard the type info here?), and putting a Map of these converted values in a list - one Map for each feature.
If you're saying that in the case of a Feature Collection you're not getting any GeoElements back to read the attributes from, have you tried looking at the subLayerResults?
If I understand your question properly, you're nearly there! Each FeatureTable has Fields you can read. See getFields().
Does that help?
fields only return field aliases, is there any way to get attributes for the table?
Fields returns you a list of Field objects. Each Field has a Name and an Alias: Field (ArcGIS Runtime SDK for Android 100.7.0)
Actually, looking at your code, I must not understand what you're trying to achieve. I'm not an Android dev, but it looks like you're stripping out all the attributes from all the identified features, converting each attribute value to a string (is there a reason you want to discard the type info here?), and putting a Map of these converted values in a list - one Map for each feature.
If you're saying that in the case of a Feature Collection you're not getting any GeoElements back to read the attributes from, have you tried looking at the subLayerResults?
brilliant! subLayerResults solved it! I was looking at the wrong place
thank you dearly