<?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 }
Přihlášení členové mohou přispívat, sledovat aktualizace a další. Jste tu noví? Zaregistrujte si bezplatný účet.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.