<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx"> <!-- Flex SDK v. 4.6 --> <!-- ArcGIS API for Flex 3.0 --> <!-- Run - Execute Query (Button click) - Query result shown in grid as they are in database - double click on datagrid row - popup shown, where all coded value codes replaced && feature type Id's replaced --> <s:layout> <s:VerticalLayout horizontalAlign="center" /> </s:layout> <fx:Script> <![CDATA[ import com.esri.ags.FeatureSet; import com.esri.ags.layers.supportClasses.CodedValue; import com.esri.ags.layers.supportClasses.CodedValueDomain; import com.esri.ags.layers.supportClasses.FeatureType; import com.esri.ags.layers.supportClasses.Field; import com.esri.ags.layers.supportClasses.LayerDetails; import com.esri.ags.tasks.DetailsTask; import com.esri.ags.tasks.QueryTask; import com.esri.ags.tasks.supportClasses.Query; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.rpc.AsyncResponder; import mx.rpc.Fault; [Bindable] private var queryResults:ArrayCollection; private var layerDetails:LayerDetails; protected function onSubmit(event:MouseEvent):void { layerDetails = null; // reset var detailsTask:DetailsTask = new DetailsTask(serviceUrl.text); detailsTask.getDetails(layerId.value, new AsyncResponder(onDetailsResult, onDetailsFault)); } protected function onDetailsResult(detailsTaskResult:LayerDetails, token:Object = null):void { layerDetails = detailsTaskResult; executeQuery(); } protected function onDetailsFault(fault:Fault, token:Object = null):void { Alert.show("Can't get given service details!"); trace(fault.message.toString()); } private function executeQuery():void { queryResults = new ArrayCollection(); // reset var queryTask:QueryTask = new QueryTask(serviceUrl.text + "/" + layerId.value); var query:Query = new Query(); query.returnGeometry = false; query.outFields = new Array("*"); query.where = "1=1"; queryTask.execute(query, new AsyncResponder(onQueryResult, onQueryFault)); } protected function onQueryResult(featureSet:FeatureSet, token:Object = null):void { queryResults = new ArrayCollection(featureSet.attributes); } protected function onQueryFault(fault:Fault, token:Object = null):void { Alert.show("Query faults!"); trace(fault.message.toString()); } private function getDomainsByFieldName(fieldName:String):ArrayCollection { if (layerDetails != null && fieldName != null) { var layerFields:Array = layerDetails.fields; for each (var field:Field in layerFields) { if (field.name == fieldName) { if (field.domain is CodedValueDomain) { var codedValues:Array = CodedValueDomain(field.domain).codedValues; var domains:ArrayCollection = new ArrayCollection(); for each(var codedValue:CodedValue in codedValues) { domains.addItem(codedValue); } return domains; } } } } return null; } protected function onGridDoubleClick(event:MouseEvent):void { if (resultsGrid.selectedItem != null) { var selectedFeature:Object = resultsGrid.selectedItem; // get domains for each field, if it is replace it's code to name for each (var field:Field in layerDetails.fields) { var domains:ArrayCollection = getDomainsByFieldName(field.name); if (domains) { for each (var codedValue:CodedValue in domains) { if (codedValue.code == selectedFeature[field.name]) { selectedFeature[field.name] = codedValue.name; break; } } } } for each (var featureType:FeatureType in layerDetails.types) { // for each feature type replace its type ID to type name if (selectedFeature[layerDetails.typeIdField] == featureType.id) { selectedFeature[layerDetails.typeIdField] = featureType.name; } // loop through featureType.domains and replace codes to names for (var domainField:Object in featureType.domains) { if (featureType.domains[domainField] is CodedValueDomain) { var codedValueDomain:CodedValueDomain = featureType.domains[domainField] as CodedValueDomain; for each (var codedValue1:CodedValue in codedValueDomain.codedValues) { if (selectedFeature[domainField] == codedValue1.code) { selectedFeature[domainField] = codedValue1.name; break; } } } } } showPopup(selectedFeature); } } private function showPopup(attributes:Object):void { var message:String = ""; for each (var field:Field in layerDetails.fields) { message = message + field.alias + ": " + attributes[field.name] + "\n"; } Alert.show(message); } ]]> </fx:Script> <s:HGroup width="100%"> <s:Label text="service url: " /> <s:TextInput id="serviceUrl" width="100%" text="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/FeatureServer/" /> </s:HGroup> <s:HGroup width="100%"> <s:Label text="layer Id: " /> <s:NumericStepper id="layerId" value="0" minimum="0" maximum="999" /> </s:HGroup> <s:Button click="onSubmit(event)" label="Execute Query" /> <s:DataGrid dataProvider="{queryResults}" sortableColumns="false" id="resultsGrid" width="100%" height="100%" doubleClick="onGridDoubleClick(event)" doubleClickEnabled="true"/> </s:Application>
public function getDomainsByFieldName(fieldName:String, layerDetails:LayerDetails):ArrayCollection { if (layerDetails != null && fieldName != null) { var layerFields:Array = layerDetails.fields; for each (var field:Field in layerFields) { if (field.name == fieldName) { if (field.domain is CodedValueDomain) { var codedValues:Array = CodedValueDomain(field.domain).codedValues; var domains:ArrayCollection = new ArrayCollection(); for each(var codedValue:CodedValue in codedValues) { // filter domains here if needed domains.addItem(codedValue); } return domains; } /* else if (field.domain is RangeDomain) {} */ } } } return new ArrayCollection(); // empty list }
Aangemelde leden kunnen berichten plaatsen, updates volgen en meer. Nieuw hier? Registreer een gratis account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.