|
POST
|
Using HttpService components (with samples - how to listen result/fault events, how to set additional parameters) Spark DropDownList control (with samples). It's dataProvider must be an IList. A good sample of "How to Access XML data" is reading data from configuration xml files in ArcGIS Viewer for Flex. The first day trainings in "Flex in a Week video training" (from Adobe with sources) has lesson with name "Requesting and retrieving XML data from the server".
... View more
06-13-2012
11:15 PM
|
0
|
0
|
1161
|
|
POST
|
if you find com.esri.viewer.skins.WidgetTemplateSkin.mxml, you'll understand 1 - each widget has 5 states(by default) <!-- in com.esri.viewer.skins.WidgetTemplateSkin.mxml --> <s:states> <s:State name="normal"/> <s:State name="open"/> <s:State name="minimized"/> <s:State name="closed"/> <s:State name="disabled"/> </s:states> 2 - widget and it's child components visibility, accessibility ... regulated by the state of widget. for example: if widget state is "closed" - it's main container is fully transparent <!-- in com.esri.viewer.skins.WidgetTemplateSkin.mxml --> <!-- the widget template wireframe --> <s:Group id="widgetFrame" left="0" right="0" top="0" bottom="0" alpha.closed="0"> minimize&close buttons container and it's childs is not visible, when widget is in "minimized" state <s:Group id="minclose" height="30" right="3" top="0" includeInLayout.minimized="false" visible.closed="false" visible.minimized="false"> when I reopen it, it creates another instance of the widget No. Because, when you click on widget close button - NOTHING happens with widget and it's contents, but it's transparency changes to fully transparent. And, when you open closed/minimized widget you just change it's transparency. [INDENT][INDENT][INDENT]:rolleyes:[/INDENT][/INDENT][/INDENT] P.S. FlexViewer has no mechanism to unload modules (I did not find any). If you really want to unload smthing take a look to adobe forums and blogs.
... View more
06-07-2012
01:38 AM
|
2
|
0
|
710
|
|
POST
|
Farhad, in FlexViewer versions 2.1, 2.2, 2.3: ViewerContainer.dispatchEvent(new AppEvent(AppEvent.WIDGET_RUN, id)); in FlexViewer versions 2.4, 2.5, 3.0: AppEvent.dispatch(AppEvent.WIDGET_RUN, id);
... View more
06-05-2012
11:46 PM
|
0
|
0
|
798
|
|
POST
|
Amanda, 1 make query from FeatureService (editable) 2 select feature by clicking on grid row 3 selected feature is shown in attribute inspector (attribute inspector is a form developed by ESRI team for editing attributes) <?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"
xmlns:esri="http://www.esri.com/2008/ags">
<!-- Adobe Flex SDK 4.6.0 -->
<!-- ArcGIS API for Flex 3.0 15.03.2012 -->
<!-- web.zone.ee/bespiva -->
<s:layout>
<s:VerticalLayout gap="10"
paddingLeft="10"
paddingBottom="10"
paddingRight="10"
paddingTop="10"/>
</s:layout>
<fx:Script>
<![CDATA[
import com.esri.ags.FeatureSet;
import com.esri.ags.Graphic;
import com.esri.ags.events.LayerEvent;
import com.esri.ags.layers.FeatureLayer;
import com.esri.ags.layers.supportClasses.Field;
import com.esri.ags.tasks.supportClasses.Query;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.AsyncResponder;
import mx.rpc.Fault;
import mx.utils.StringUtil;
import spark.components.gridClasses.GridColumn;
import spark.events.GridSelectionEvent;
[Bindable]
private var gridSource:ArrayCollection = new ArrayCollection();
[Bindable]
private var gridColumns:ArrayCollection = new ArrayCollection();
private var queryLayer:FeatureLayer = null;
private function initializeLayer():void
{
lblMessage.text = "";
queryLayer = new FeatureLayer(txtServiceUrl.text);
queryLayer.mode = FeatureLayer.MODE_ON_DEMAND;
queryLayer.outFields = new Array("*");
queryLayer.addEventListener(LayerEvent.LOAD, onLayerLoaded, false, 0, true);
dispatchEvent(new LayerEvent(LayerEvent.LOAD, queryLayer));
}
protected function onLayerLoaded(event:LayerEvent):void
{
//queryLayer.removeEventListener(LayerEvent.LOAD, onLayerLoaded);
//txtServiceUrl.editable = false;
if (queryLayer.isEditable)
{
lblMessage.text = "Selected layer is editable";
}
else
{
lblMessage.text = "Selected layer is not valid for editing";
}
executeQuery();
}
protected function onExecuteButtonClick(event:MouseEvent):void
{
if (queryLayer != null && queryLayer.loaded)
{
executeQuery();
}
else
{
initializeLayer();
}
}
private function executeQuery():void
{
var query:Query = new Query();
query.where = txtWhere.text;
var outs:Array = StringUtil.trim(txtOuts.text).split(",");
query.outFields = queryLayer.outFields = outs;
queryLayer.queryFeatures(query, new AsyncResponder(onQueryResult, onQueryFault));
}
protected function onQueryResult(featureSet:FeatureSet, token:Object = null):void
{
gridSource = new ArrayCollection();
var doubleClickMessage:String = "";
if (queryLayer.isEditable)
{
doubleClickMessage = "Click to select feature.";
}
lblResultsCount.text = StringUtil.substitute("Found: {0} features. {1}",
featureSet.features.length,
doubleClickMessage);
for each(var gr:Graphic in featureSet.features)
{
gridSource.addItem(gr.attributes);
}
gridSource.refresh();
gridColumns = new ArrayCollection();
for each (var field:Field in featureSet.fields)
{
var gridColumn:GridColumn = new GridColumn(field.name);
gridColumn.headerText = field.alias;
gridColumns.addItem(gridColumn);
}
gridColumns.refresh();
}
protected function onQueryFault(fault:Fault, token:Object = null):void
{
trace(fault.getStackTrace());
Alert.show("Query faults.", "Error");
}
protected function onGetLastResults(event:MouseEvent):void
{
if (gridSource) // != null
{
var messgae:String = StringUtil.substitute("Last results length is {0}", gridSource.length);
Alert.show(messgae, "Message");
}
else
{
Alert.show("No last results found!", "Warning");
}
}
protected function onGridSelectionChange(event:GridSelectionEvent):void
{
if (queryLayer.isEditable && queryLayer.layerDetails && gridResults.selectedItem)
{
var attributes:Object = gridResults.selectedItem;
var oid:Number = attributes[queryLayer.layerDetails.objectIdField];
aInspector.featureLayers = [queryLayer];
var q:Query = new Query();
q.objectIds = [oid];
queryLayer.mode = FeatureLayer.MODE_SELECTION;
queryLayer.selectFeatures(q);
}
}
]]>
</fx:Script>
<s:Panel width="100%"
title="Query parameters">
<s:HGroup width="100%"
height="100%">
<s:VGroup gap="5"
paddingLeft="5"
paddingTop="5"
paddingRight="5"
paddingBottom="5"
width="100%">
<s:HGroup width="100%">
<s:Label text="Url:"
width="150" />
<s:TextInput id="txtServiceUrl"
width="100%"
text="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/FeatureServer/2" />
</s:HGroup>
<s:HGroup width="100%">
<s:Label text="Where clause:"
width="150" />
<s:TextInput id="txtWhere"
width="100%"
text="1=1" />
</s:HGroup>
<s:HGroup width="100%">
<s:Label text="Out fields (CSV):"
width="150" />
<s:TextInput id="txtOuts"
width="100%"
text="*" />
</s:HGroup>
<s:HGroup width="100%">
<s:Button label="Execute" click="onExecuteButtonClick(event)" />
<s:Button label="Last result length" click="onGetLastResults(event)" />
</s:HGroup>
</s:VGroup>
<s:VGroup width="100%"
height="100%"
gap="5"
paddingLeft="5"
paddingTop="5"
paddingRight="5"
paddingBottom="5">
<s:Label id="lblMessage" />
<esri:AttributeInspector id="aInspector"
deleteButtonVisible="false" />
</s:VGroup>
</s:HGroup>
</s:Panel>
<s:Panel title="Results"
width="100%"
height="100%">
<s:VGroup gap="5"
paddingLeft="5"
paddingTop="5"
paddingRight="5"
paddingBottom="5"
width="100%"
height="100%">
<s:Label id="lblResultsCount" />
<s:DataGrid width="100%"
height="100%"
id="gridResults"
dataProvider="{gridSource}"
columns="{gridColumns}"
selectionChange="onGridSelectionChange(event)"/>
</s:VGroup>
</s:Panel>
</s:Application> I don't think that the Attribute Inspector will work for me. If I changed your opinion, see the previous topic "AttributeInspector (with samples)" Anywhere, good luck.
... View more
06-04-2012
11:38 PM
|
0
|
0
|
1465
|
|
POST
|
NB! tested in FlexViewer 25 1 in <BaseWidget> tag of MyGreatestWidget.mxml: <?xml version="1.0" encoding="utf-8"?> <viewer:BaseWidget xmlns:fx="http://ns.adobe.com/mxml/2009" [INDENT]xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:viewer="com.esri.viewer.*" isResizeable="false">[/INDENT] [/HR] 2 in <script> tag of MyGreatestWidget.mxml: <?xml version="1.0" encoding="utf-8"?> <viewer:BaseWidget xmlns:fx="http://ns.adobe.com/mxml/2009" [INDENT]xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:viewer="com.esri.viewer.*" preinitialize="basewidget1_preinitializeHandler(event)"> <fx:Script> <![CDATA[ [INDENT]import mx.events.FlexEvent; protected function basewidget1_preinitializeHandler(event:FlexEvent):void { [INDENT]this.isResizeable = false;[/INDENT] }[/INDENT] ]]> </fx:Script>[/INDENT] [/HR] 3 in configuration file of MyGreatestWidget.mxml: <configuration> [INDENT]<ismygreatestwidgetresizeable>mygreatestwidgetisnotresizeable</ismygreatestwidgetresizeable>[/INDENT] </configuration> <?xml version="1.0" encoding="utf-8"?> <viewer:BaseWidget xmlns:fx="http://ns.adobe.com/mxml/2009" [INDENT]xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:viewer="com.esri.viewer.*" widgetConfigLoaded="init()"> [INDENT]<fx:Script> <![CDATA[ [INDENT]import mx.events.FlexEvent; private function init():void { [INDENT]if (configXML) { [INDENT]if (String(configXML.ismygreatestwidgetresizeable) == "mygreatestwidgetisnotresizeable") { [INDENT]this.isResizeable = false;[/INDENT] }[/INDENT] }[/INDENT] }[/INDENT] ]]> </fx:Script>[/INDENT][/INDENT] [/HR] ... and other 357 ways to do it :cool: [/HR] P.S. There is such an ancient tradition, to ask questions about "Flex Viewer" on Flex Viewer Forum page
... View more
06-03-2012
09:42 PM
|
1
|
0
|
838
|
|
POST
|
Farhad, I could use your sample code with a small change. I declared gridColumns as Array instead of ArrayCollection. If your code works - very well. Good luck. from adobe reference columns property columns:IList that's why I use ArrayCollection�?�ListCollectionView�?�IList My compiler reports an error if Array used
1067: Implicit coercion of a value of type Array to an unrelated type mx.collections:IList. ...
... View more
06-01-2012
10:04 PM
|
0
|
0
|
1405
|
|
POST
|
AttributeInspector (with samples) You can skin and its child components (fields). You can choose editable fields vs readonly fields. You can create own fields (search in this forum for Date Time field for example) ...
... View more
06-01-2012
01:09 PM
|
0
|
0
|
1465
|
|
POST
|
working with FeatureLayer <?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"> <fx:Script> <![CDATA[ import com.esri.ags.FeatureSet; import com.esri.ags.Graphic; import com.esri.ags.events.LayerEvent; import com.esri.ags.layers.FeatureLayer; import com.esri.ags.layers.supportClasses.Field; import com.esri.ags.tasks.supportClasses.Query; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.rpc.AsyncResponder; import mx.rpc.Fault; import mx.utils.StringUtil; import spark.components.gridClasses.GridColumn; [Bindable] private var gridSource:ArrayCollection = new ArrayCollection(); [Bindable] private var gridColumns:ArrayCollection = new ArrayCollection(); private var queryLayer:FeatureLayer = null; private function initializeLayer():void { queryLayer = new FeatureLayer(txtServiceUrl.text); queryLayer.mode = FeatureLayer.MODE_ON_DEMAND; queryLayer.outFields = new Array("*"); queryLayer.addEventListener(LayerEvent.LOAD, onLayerLoaded, false, 0, true); dispatchEvent(new LayerEvent(LayerEvent.LOAD, queryLayer)); } protected function onLayerLoaded(event:LayerEvent):void { queryLayer.removeEventListener(LayerEvent.LOAD, onLayerLoaded); txtServiceUrl.editable = false; executeQuery(); } protected function onExecuteButtonClick(event:MouseEvent):void { if (queryLayer != null && queryLayer.loaded) { executeQuery(); } else { initializeLayer(); } } private function executeQuery():void { var query:Query = new Query(); query.where = txtWhere.text; var outs:Array = StringUtil.trim(txtOuts.text).split(","); query.outFields = queryLayer.outFields = outs; queryLayer.queryFeatures(query, new AsyncResponder(onQueryResult, onQueryFault)); } protected function onQueryResult(featureSet:FeatureSet, token:Object = null):void { gridSource = new ArrayCollection(); lblResultsCount.text = StringUtil.substitute("Found: {0} features.", featureSet.features.length); for each(var gr:Graphic in featureSet.features) { gridSource.addItem(gr.attributes); } gridSource.refresh(); gridColumns = new ArrayCollection(); for each (var field:Field in featureSet.fields) { var gridColumn:GridColumn = new GridColumn(field.alias); gridColumns.addItem(gridColumn); } gridColumns.refresh(); } protected function onQueryFault(fault:Fault, token:Object = null):void { trace(fault.getStackTrace()); Alert.show("Query faults.", "Error"); } protected function onGetLastResults(event:MouseEvent):void { if (gridSource) // != null { var messgae:String = StringUtil.substitute("Last results length is {0}", gridSource.length); Alert.show(messgae, "Message"); } else { Alert.show("No last results found!", "Warning"); } } ]]> </fx:Script> <s:Panel width="100%" title="Query parameters"> <s:VGroup gap="5" paddingLeft="5" paddingTop="5" paddingRight="5" paddingBottom="5" width="100%"> <s:HGroup width="100%"> <s:Label text="Url:" width="150" /> <s:TextInput id="txtServiceUrl" width="100%" text="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5" /> </s:HGroup> <s:HGroup width="100%"> <s:Label text="Where clause:" width="150" /> <s:TextInput id="txtWhere" width="100%" text="1=1" /> </s:HGroup> <s:HGroup width="100%"> <s:Label text="Out fields (CSV):" width="150" /> <s:TextInput id="txtOuts" width="100%" text="STATE_NAME,STATE_FIPS,SUB_REGION,STATE_ABBR,POP2000,POP2007" /> </s:HGroup> <s:HGroup width="100%"> <s:Button label="Execute" click="onExecuteButtonClick(event)" /> <s:Button label="Last result length" click="onGetLastResults(event)" /> </s:HGroup> </s:VGroup> </s:Panel> <s:Panel title="Results" width="100%" height="100%"> <s:VGroup gap="5" paddingLeft="5" paddingTop="5" paddingRight="5" paddingBottom="5" width="100%" height="100%"> <s:Label id="lblResultsCount" /> <s:DataGrid width="100%" height="100%" dataProvider="{gridSource}" columns="{gridColumns}"/> </s:VGroup> </s:Panel> </s:Application> or working without feature layer (using QueryTask) <?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"> <fx:Script> <![CDATA[ import com.esri.ags.FeatureSet; import com.esri.ags.Graphic; import com.esri.ags.layers.supportClasses.Field; 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; import mx.utils.StringUtil; import spark.components.gridClasses.GridColumn; [Bindable] private var gridSource:ArrayCollection = new ArrayCollection(); [Bindable] private var gridColumns:ArrayCollection = new ArrayCollection(); private var queryTask:QueryTask; protected function onExecuteButtonClick(event:MouseEvent):void { executeQuery(); } private function executeQuery():void { var query:Query = new Query(); query.where = txtWhere.text; query.returnGeometry = false; var outs:Array = StringUtil.trim(txtOuts.text).split(","); query.outFields = outs; queryTask = new QueryTask(txtServiceUrl.text); queryTask.execute(query, new AsyncResponder(onQueryResult, onQueryFault)); } protected function onQueryResult(featureSet:FeatureSet, token:Object = null):void { gridSource = new ArrayCollection(); lblResultsCount.text = StringUtil.substitute("Found: {0} features.", featureSet.features.length); for each(var gr:Graphic in featureSet.features) { gridSource.addItem(gr.attributes); } gridSource.refresh(); gridColumns = new ArrayCollection(); for each (var field:Field in featureSet.fields) { var gridColumn:GridColumn = new GridColumn(field.alias); gridColumns.addItem(gridColumn); } gridColumns.refresh(); } protected function onQueryFault(fault:Fault, token:Object = null):void { trace(fault.getStackTrace()); Alert.show("Query faults.", "Error"); } protected function onGetLastResults(event:MouseEvent):void { if (queryTask && queryTask.executeLastResult) // != null { var results:Array = queryTask.executeLastResult.attributes; var messgae:String = StringUtil.substitute("Last results length is {0}", results.length); Alert.show(messgae, "Message"); } else { Alert.show("Query task is null or has no results!", "Warning"); } } ]]> </fx:Script> <s:Panel width="100%" title="Query parameters"> <s:VGroup gap="5" paddingLeft="5" paddingTop="5" paddingRight="5" paddingBottom="5" width="100%"> <s:HGroup width="100%"> <s:Label text="Url:" width="150" /> <s:TextInput id="txtServiceUrl" width="100%" text="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5" /> </s:HGroup> <s:HGroup width="100%"> <s:Label text="Where clause:" width="150" /> <s:TextInput id="txtWhere" width="100%" text="1=1" /> </s:HGroup> <s:HGroup width="100%"> <s:Label text="Out fields (CSV):" width="150" /> <s:TextInput id="txtOuts" width="100%" text="STATE_NAME,STATE_FIPS,SUB_REGION,STATE_ABBR,POP2000,POP2007" /> </s:HGroup> <s:HGroup width="100%"> <s:Button label="Execute" click="onExecuteButtonClick(event)" /> <s:Button label="Last result length" click="onGetLastResults(event)" /> </s:HGroup> </s:VGroup> </s:Panel> <s:Panel title="Results" width="100%" height="100%"> <s:VGroup gap="5" paddingLeft="5" paddingTop="5" paddingRight="5" paddingBottom="5" width="100%" height="100%"> <s:Label id="lblResultsCount" /> <s:DataGrid width="100%" height="100%" dataProvider="{gridSource}" columns="{gridColumns}"/> </s:VGroup> </s:Panel> </s:Application> Query execution returns: query faults (wrong query params, url, ...) query complete, but no results returned (nothing found ...) query complete, and results returned so you must listen/handle query complete/fault events to know "what happens?", to know "where happens?", to know "why queryTask.executeLastResult.attributes is null?"... good luck
... View more
05-31-2012
11:14 PM
|
0
|
0
|
1022
|
|
POST
|
from reference See also Input JSON should match this REST response syntax What is valid syntaxis? Make query and get results in JSON format so valid JSON string for method FeatureSet.fromJSON() looks like {
"displayFieldName" : "description",
"fieldAliases" : {
"objectid" : "Object ID",
"type" : "Type",
"description" : "Description"
},
"geometryType" : "esriGeometryPoint",
"spatialReference" : {
"wkid" : 4326
},
"fields" : [
{
"name" : "objectid",
"type" : "esriFieldTypeOID",
"alias" : "Object ID"
},
{
"name" : "type",
"type" : "esriFieldTypeInteger",
"alias" : "Type"
},
{
"name" : "description",
"type" : "esriFieldTypeString",
"alias" : "Description",
"length" : 1073741822
}
],
"features" : [
{
"attributes" : {
"objectid" : 2010,
"type" : 3,
"description" : "xzc"
},
"geometry" : {
"x" : -117.53253785200002,
"y" : 34.244472716000075
}
},
{
"attributes" : {
"objectid" : 2011,
"type" : 0,
"description" : "adf"
},
"geometry" : {
"x" : -100.62294522999991,
"y" : -15.344261442999937
}
}
]
} sample app works fine with this JSON string <?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" xmlns:esri="http://www.esri.com/2008/ags">
<s:layout>
<s:VerticalLayout gap="10"
paddingBottom="10"
paddingLeft="10"
paddingRight="10"
paddingTop="10" />
</s:layout>
<fx:Script>
<![CDATA[
import com.esri.ags.FeatureSet;
import com.esri.ags.Graphic;
import com.esri.ags.geometry.Geometry;
import com.esri.ags.symbols.SimpleFillSymbol;
import com.esri.ags.symbols.SimpleLineSymbol;
import com.esri.ags.symbols.SimpleMarkerSymbol;
import com.esri.ags.utils.JSON;
import com.esri.ags.utils.WebMercatorUtil;
import mx.charts.CategoryAxis;
import mx.controls.Alert;
private const sms:SimpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_TRIANGLE, 22, 0x00FF00);
private var sls:SimpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, 0xFF0000);
private var sfs:SimpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_DIAGONAL_CROSS, 0x0000FF);
protected function onAddButtonClick(event:MouseEvent):void
{
var jsonString:String = txtInput.text;
if (jsonString.length > 0)
{
try
{
if (rbtnFeatureSetType.selected)
{
var featureSet:FeatureSet = FeatureSet.fromJSON(txtInput.text);
if (featureSet && featureSet.features)
{
addGraphicsToMap(featureSet.features);
}
}
else
{
var jsonObj:* = com.esri.ags.utils.JSON.decode(jsonString);
Alert.show("JSON string is valid", "Message");
// TODO: complete code
}
}
catch (error:Error)
{
trace(error.getStackTrace());
Alert.show("The input string cannot be parsed", "Error");
}
}
else
{
Alert.show("You must input valid json string in text area", "Error");
}
}
private function addGraphicsToMap(graphics:Array):void
{
if (graphicsLayer)
{
var isModified:Boolean = false;
for (var i:int; i < graphics.length; i++)
{
var graphic:Graphic = graphics;
if (graphic && graphic.geometry)
{
var geometry:Geometry = graphic.geometry;
switch (geometry.type)
{
case Geometry.MAPPOINT:
{
graphic.symbol = sms;
break;
}
case Geometry.POLYLINE:
{
graphic.symbol = sls;
break;
}
case Geometry.POLYGON:
{
graphic.symbol = sfs;
break;
}
}
trace("Added graphic id=" + graphicsLayer.add(graphic));
isModified = true;
}
}
if (isModified)
{
graphicsLayer.refresh();
}
}
}
]]>
</fx:Script>
<fx:Script>
<![CDATA[
protected function onClearButtonClick(event:MouseEvent):void
{
if (graphicsLayer)
{
graphicsLayer.clear();
}
}
]]>
</fx:Script>
<fx:Declarations>
<s:RadioButtonGroup id="rbtnGroup"/>
</fx:Declarations>
<s:Panel title="Map panel"
width="100%"
height="100%">
<s:layout>
<s:VerticalLayout gap="5"
verticalAlign="middle"
horizontalAlign="center" />
</s:layout>
<s:Button label="Clear graphics"
click="onClearButtonClick(event)" />
<esri:Map id="map">
<esri:ArcGISTiledMapServiceLayer id="baseLayer"
url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer"
alpha="0.7" />
<esri:GraphicsLayer id="graphicsLayer" />
</esri:Map>
</s:Panel>
<s:Panel title="Input panel"
width="100%"
height="100%">
<s:layout>
<s:VerticalLayout gap="5"
verticalAlign="middle"
horizontalAlign="center"
paddingBottom="5"/>
</s:layout>
<s:TextArea id="txtInput"
width="100%"
height="100%" />
<s:HGroup width="100%"
horizontalAlign="center"
gap="20">
<s:RadioButton id="rbtnFeatureSetType"
label="is FeatureSet"
selected="true"
group="{rbtnGroup}"/>
<s:RadioButton id="rbtnCustomType"
label="is not FeatureSet"
group="{rbtnGroup}" />
<s:Button label="Add features"
click="onAddButtonClick(event)" />
</s:HGroup>
</s:Panel>
</s:Application>
to work with own JSON string you must create own serializer P.S. yes, your json is valid json string, but not valid feature set - I did not find why 😞
... View more
05-31-2012
01:17 PM
|
0
|
0
|
804
|
|
POST
|
The request that is being sent is: /ArcGIS/rest/services/chs/MapServer/35/query?f=json&geometryType=esriGeometryPolygon& outFields=*&geometry={...}& returnGeometry=true&inSR=28992&spatialRel=esriSpatialRelIntersects&outSR=28992 As i see outFields=* - all fields returnGeometry=true from API reference for queryFeatures() method Query features from the feature layer. Current layer properties (layer definition, time definition) will be honored and passed into the query. as i understand, layer definition = all layer params you set (mode, out fields ...) if you query through layer (not through QueryTask) you returnGeometry=false is ingored you need in ID's only? you can use queryIds() method - returns only objectIdField values
... View more
05-30-2012
03:25 AM
|
0
|
0
|
1044
|
|
POST
|
here is other discussion To implement widget as it is (created specifically for ArcGIS Viewer for Flex) you must implement: all interfaces and base classes used to create widget; widget managers and containers; widget configurations file (*.xml) parsers; ... The result of this tedious work will be trimmed (without some functionality) ArcGIS Viewer for Flex, wasted time, corruption of your nervous system :rolleyes: Creating own navigation tool is about 80 lines of code... you can skin it as you want ...
... View more
05-30-2012
12:40 AM
|
0
|
0
|
992
|
|
POST
|
Using Singleton class TransferDataManager.as: package ee { import flash.events.Event; import flash.events.EventDispatcher; [Event(name="onDataChanged", type="flash.events.Event")] [Bindable] public class TransferDataManager extends EventDispatcher { public static const TRANSFER_DATA_CHANGED:String = "onDataChanged"; private static var _instance:TransferDataManager; /** * @private */ public function TransferDataManager(caller:Function = null) { if (caller != hidden) throw new Error ("TransferDataManager is a singleton class, use getInstance() instead"); if (_instance != null) throw new Error("Only one Singleton instance should be instantiated"); } /** * @return instance of ResourcesManager * */ public static function getInstance():TransferDataManager { if(!_instance) { _instance = new TransferDataManager(hidden); } return _instance; } /** * @private */ private static function hidden():void {} public var transferedData:Object = null; public function updateTransferData(obj:Object = null):void { transferedData = obj; dispatchEvent(new Event(TRANSFER_DATA_CHANGED)); } } } define it firstly in top level component ViewerContainer.mxml: <!--- Main application container. --> <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" width="100%" height="100%" preinitialize="group1_preinitializeHandler(event)" ... protected function group1_preinitializeHandler(event:FlexEvent):void { initDataManager(); } [Bindable] private var transferManager:TransferDataManager; protected function initDataManager():void { trace("ViewerContainer::initDataManager()"); transferManager = TransferDataManager.getInstance(); } Create SenderWidget.mxml: <?xml version="1.0" encoding="utf-8"?> <viewer:BaseWidget xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:viewer="com.esri.viewer.*" preinitialize="basewidget1_preinitializeHandler(event)"> <fx:Script> <![CDATA[ import ee.TransferDataManager; import mx.events.FlexEvent; [Bindable] private var transferManager:TransferDataManager; protected function button1_clickHandler(event:MouseEvent):void { trace("SenderWidget::button1_clickHandler()"); // create some data you wand to pass var transferData:Object = new Object(); transferData.message = txtInput.text; transferData.date = new Date(); // get transfer manager instance transferManager = TransferDataManager.getInstance(); transferManager.updateTransferData(transferData); } protected function basewidget1_preinitializeHandler(event:FlexEvent):void { initDataManager(); } protected function initDataManager():void { trace("SenderWidget::initDataManager()"); transferManager = TransferDataManager.getInstance(); transferManager.addEventListener(TransferDataManager.TRANSFER_DATA_CHANGED, onTransferDataChanged); } protected function onTransferDataChanged(event:Event):void { trace("SenderWidget::onTransferDataChanged()"); } ]]> </fx:Script> <viewer:WidgetTemplate id="senderWidget" width="300" height="300"> <viewer:layout> <s:VerticalLayout horizontalAlign="center" verticalAlign="middle"/> </viewer:layout> <s:TextInput id="txtInput" /> <s:Button label="Send" click="button1_clickHandler(event)" /> </viewer:WidgetTemplate> </viewer:BaseWidget> and RecieverWidget.mxml: <?xml version="1.0" encoding="utf-8"?> <viewer:BaseWidget xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:viewer="com.esri.viewer.*" preinitialize="basewidget1_preinitializeHandler(event)"> <fx:Script> <![CDATA[ import ee.TransferDataManager; import mx.events.FlexEvent; import mx.utils.StringUtil; [Bindable] private var transferManager:TransferDataManager; protected function basewidget1_preinitializeHandler(event:FlexEvent):void { trace("RecieverWidget::basewidget1_preinitializeHandler()"); initDataManager(); } protected function initDataManager():void { trace("RecieverWidget::initDataManager()"); transferManager = TransferDataManager.getInstance(); transferManager.addEventListener(TransferDataManager.TRANSFER_DATA_CHANGED, onTransferDataChanged); var transferedData:Object = transferManager.transferedData; if (transferedData) { if (transferedData.hasOwnProperty("message") && transferedData.hasOwnProperty("date")) { var msg:String = StringUtil.substitute("{0} -> {1}", transferedData.message, transferedData.date); writeLog(msg); } } } protected function onTransferDataChanged(event:Event):void { trace("RecieverWidget::onTransferDataChanged()"); transferManager = TransferDataManager.getInstance(); var transferedData:Object = transferManager.transferedData; if (transferedData) { if (transferedData.hasOwnProperty("message") && transferedData.hasOwnProperty("date")) { var msg:String = StringUtil.substitute("{0} -> {1}", transferedData.message, transferedData.date); writeLog(msg); } } } private function writeLog(message:String):void { trace("RecieverWidget::writeLog()"); log.text = StringUtil.substitute("{0}\n{1}", message, log.text); } ]]> </fx:Script> <viewer:WidgetTemplate id="recieverWidget" width="300" height="300"> <viewer:layout> <s:VerticalLayout horizontalAlign="center" verticalAlign="middle"/> </viewer:layout> <s:TextArea width="100%" height="100%" id="log" /> </viewer:WidgetTemplate> </viewer:BaseWidget> Sender and Receiver - is conditional. It can work in reverse mode.
... View more
05-29-2012
01:01 AM
|
0
|
0
|
981
|
|
POST
|
Creating Singleton class is not hard in Flex (a lot of samples in web) (EventBus.as in FlexVewer). Other way - extend flex viewer widget management. classes changed/extended (for Flex Viewer v2.5): IBaseWidget.as
BaseWidget.as
WidgetManager.mxml
HeaderControllerWidget.mxml extended methods: /*IBaseWidget.as*/
/* custom attributes */
function set widgetAttributes(value:Object):void;
function get widgetAttributes():Object;
***********----------------------------------*******************
/*BaseWidget.as*/
[Bindable]
private var _widgetAttributes:Object;
//----------------------------------
// widget attributes
//----------------------------------
public function get widgetAttributes():Object
{
return _widgetAttributes;
}
/**
* Set widget additional attributes.
*
* @param value the object.
*/
public function set widgetAttributes(value:Object):void
{
_widgetAttributes = value;
}
/*WidgetManager.mxml*/
private function runWidget(attributes:Object):void
{
var widgetId:Number = attributes.id as Number;
var widget:IBaseWidget = createWidget(widgetId);
widget.widgetAttributes = attributes;
openWidget(widget);
}
private function onRunWidget(event:AppEvent):void
{
var attributes:Object = event.data as Object;
var id:Number = attributes.id as Number;
var idx:Object = configData.widgetIndex[id];
var wgtContainer:IWidgetContainer = configData.widgetContainers[idx.container].container.obj;
var wgt:Object = configData.widgetContainers[idx.container].widgets[idx.widget];
if (!widgetAdded)
{
widgetAdded = true;
}
//widget loaded
var widget:IBaseWidget;
if (widgetTable.containsKey(id))
{
widget = widgetTable.find(id) as IBaseWidget;
widget.widgetAttributes = attributes;
//add back the container if exists
widget.setState(WidgetStates.WIDGET_OPENED);
wgtContainer.addWidget(widget);
}
else
{
//module loaded
if (moduleTable.containsKey(wgt.url))
{
runWidget(attributes);
}
else
{
loadWidget(attributes);
}
}
}
private function loadWidget(attributes:Object):void
{
var id:Number = 0;
if (attributes != null && attributes.hasOwnProperty("id"))
{
id = attributes.id as Number;
}
else if (attributes is Number)
{
id = Number(attributes);
}
var idx:Object = configData.widgetIndex[id];
var wgt:Object = configData.widgetContainers[idx.container].widgets[idx.widget];
var preload:String = wgt.preload;
var url:String = wgt.url;
wgtInfo = ModuleManager.getModule(url);
wgtInfo.data =
{
id: id,
preload: preload,
attributes: attributes
};
wgtInfo.addEventListener(ModuleEvent.READY, widgetReadyHandler);
wgtInfo.addEventListener(ModuleEvent.ERROR, moduleErrorHandler);
wgtInfo.load(null, null, null, moduleFactory);
this.cursorManager.setBusyCursor();
}
private function preloadNextWidget():void
{
if (preloadArray.length > 0)
{
var id:Number = preloadArray[0].id;
preloadArray.splice(0, 1);
var attr:Object = new Object();
attr.id = id;
AppEvent.dispatch(AppEvent.WIDGET_RUN, attr);
}
}
private function widgetReadyHandler(event:ModuleEvent):void
{
this.cursorManager.removeBusyCursor();
var moduleInfo:IModuleInfo = event.module;
moduleTable.add(moduleInfo.url, moduleInfo);
var attr:Object = info.data as Object;
runWidget(attr);
}
/* HeaderControllerWidget.mxml */
private function widgetItemDG_widgetItemClickHandler(event:Event):void
{
var widgetItem:WidgetItem = ItemRenderer(event.target).data as WidgetItem;
if (widgetItem.isGroup)
{
groupWidgetArrCol = new ArrayCollection();
// check the array of widgets if they are open before hand
for each (var widgetObj:Object in widgetItem.widgets)
{
var widgetItem1:WidgetItem = new WidgetItem;
widgetItem1.id = widgetObj.widget.id;
widgetItem1.label = widgetObj.widget.label;
widgetItem1.icon = widgetObj.widget.icon;
widgetItem1.url = widgetObj.widget.url;
widgetItem1.open = widgetObj.open;
groupWidgetArrCol.addItem(widgetItem1);
}
menuToolTip.visible = false;
widgetList.visible = true;
}
else
{
var attr:Object = new Object();
attr.id = widgetItem.id;
AppEvent.dispatch(AppEvent.WIDGET_RUN, attr);
}
}
private function widgetList_widgetItemClickHandler(event:Event):void
{
var widgetItem:WidgetItem = ItemRenderer(event.target).data as WidgetItem;
var attr:Object = new Object();
attr.id = widgetItem.id;
AppEvent.dispatch(AppEvent.WIDGET_RUN, attr);
} Sample here (2 widgets - 1-st send data = opens widget with additional attributes - 2-nd listen open handler and read attributes) with sources
... View more
05-28-2012
01:37 PM
|
0
|
0
|
981
|
|
POST
|
Amanda, what is your debugger shows? Debugging Flex 4 applications (Adobe) historic is smthing like FeatureLayer? listen it's update events. When the layer has finished updating its content - get graphicProvider and "play" with features. ...
historic.addEventListener(LayerEvent.UPDATE_END, onHistoricUpdateEnd);
...
protected function onHistoricUpdateEnd(event:LayerEvent):void
{
if (event.updateSuccess)
{
trace("layer 'historic' update success");
var historicGraphicProvider:ArrayCollection = historic.graphicProvider as ArrayCollection;
if (historicGraphicProvider && historicGraphicProvider.length > 0)
{
trace(historicGraphicProvider.length + " features found");
featureset = new FeatureSet(historicGraphicProvider.toArray());
...
}
}
else
{
trace("layer 'historic' update not success");
}
}
... here is working sample - using defenitionExpression here is working sample with sources - using query (all conditions you can put as where clause string "address like ...")
... View more
05-24-2012
11:44 PM
|
0
|
0
|
663
|
|
POST
|
:rolleyes: All you're doing right. As I told: some sublayers are empty(no any features or very few count of them) in this sample - that is the reason why you can not see anything in the NY. But it does not matter. To display the legend you must know information about layer properties but not its contents. Forget about this sample. Do not zoom in/to ... What about your base question - Did you find answer for "How to remove an entire object from an array collection"? Yes? - very good.
... View more
05-24-2012
06:04 AM
|
0
|
0
|
1053
|
| Title | Kudos | Posted |
|---|---|---|
| 1 | 12-03-2017 11:25 PM | |
| 1 | 10-06-2016 11:49 PM | |
| 2 | 06-07-2012 01:38 AM | |
| 1 | 06-03-2012 09:42 PM |
| Online Status |
Offline
|
| Date Last Visited |
11-11-2020
02:23 AM
|