In this session we will demonstrate the Flex Mapping API For ArcGIS Server, where we will deconstruct live real-world mapping applications and algorithms such as dense clustering, auto labeling of features, collaborative editing, real-time asset tracking and client/server collaborative Geo-Processing. In addition, we will demonstrate how to create your own layer, geometry and symbol extensions for superior rendering performance taking advantage of the FP10 drawing API.
48. Feature
• Serializable server side object
• Properties
• featureID:int;
• geometry:IGeometry;
• attributes:ASObject;
49. public class Feature
implements Serializable
{
private int m_featureId;
private IGeometry m_geometry;
private ASObject m_attributes;
public Feature()
{
}
public int getFeatureId()
{
return m_featureId;
}
public void setFeatureId(final int featureId)
{
m_featureId = featureId;
}
...
50. public class MapPoint
implements IGeometry
{
private double m_x;
private double m_y;
private SpatialReference m_spatialReference;
public MapPoint(){
}
public MapPoint(final double x, final double y){
m_x = x;
m_y = y;
}
public double getX(){
return m_x;
}
public void setX(final double x){
m_x = x;
}
...
61. package com.esri.cats
{
import com.esri.ags.SpatialReference;
import com.esri.ags.geometry.MapPoint;
import flash.net.registerClassAlias;
import mx.core.IMXMLObject;
public class ClassAliasRegistry implements IMXMLObject
{
public function initialized(document:Object, id:String):void
{
registerClassAlias(quot;com.esri.cats.MapPointquot;, MapPoint);
registerClassAlias(quot;com.esri.cats.SpatialReferencequot;, SpatialReference);
}
}
}
62. package com.esri.cats
{
import com.esri.ags.SpatialReference;
import com.esri.ags.geometry.MapPoint;
import flash.net.registerClassAlias;
import mx.core.IMXMLObject;
public class ClassAliasRegistry implements IMXMLObject
{
public function initialized(document:Object, id:String):void
{
registerClassAlias(quot;com.esri.cats.MapPointquot;, MapPoint);
registerClassAlias(quot;com.esri.cats.SpatialReferencequot;, SpatialReference);
}
}
}
63. 1.package com.esri.cats
2.{
3. import com.esri.ags.geometry.Geometry;
5. [Managed]
6. [RemoteClass(alias=quot;com.esri.cats.Featurequot;)]
7. public class Feature
8. {
9. public var featureId:int;
10. public var geometry:Geometry;
11. public var attributes:Object;
12.
13. public function Feature()
14. {
15. }
16.
17. }
18.}
64. 1.package com.esri.cats
2.{
3. import com.esri.ags.geometry.Geometry;
5. [Managed]
6. [RemoteClass(alias=quot;com.esri.cats.Featurequot;)]
7. public class Feature
8. {
9. public var featureId:int;
10. public var geometry:Geometry;
11. public var attributes:Object;
12.
13. public function Feature()
14. {
15. }
16.
17. }
18.}
71. private function doReset(event:CollectionEvent):void
{
graphicsLayer.clear();
m_graphicsDict = new Dictionary();
for each (var feature:Feature in features)
{
var graphic:Graphic = new Graphic(feature.geometry, null, feature);
graphic.buttonMode = true;
graphic.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
graphic.toolTip = String(feature.attributes.coords).replace(quot; quot;, quot;nquot;);
graphicsLayer.add(graphic);
m_graphicsDict[feature.featureId] = graphic;
}
}
72. private function doReset(event:CollectionEvent):void
{
graphicsLayer.clear();
m_graphicsDict = new Dictionary();
for each (var feature:Feature in features)
{
var graphic:Graphic = new Graphic(feature.geometry, null, feature);
graphic.buttonMode = true;
graphic.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
graphic.toolTip = String(feature.attributes.coords).replace(quot; quot;, quot;nquot;);
graphicsLayer.add(graphic);
m_graphicsDict[feature.featureId] = graphic;
}
}
73. private function doReset(event:CollectionEvent):void
{
graphicsLayer.clear();
m_graphicsDict = new Dictionary();
for each (var feature:Feature in features)
{
var graphic:Graphic = new Graphic(feature.geometry, null, feature);
graphic.buttonMode = true;
graphic.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
graphic.toolTip = String(feature.attributes.coords).replace(quot; quot;, quot;nquot;);
graphicsLayer.add(graphic);
m_graphicsDict[feature.featureId] = graphic;
}
}
74. private function doUpdate(event:CollectionEvent):void
{
for each (var propertyChangeEvent:PropertyChangeEvent in event.items)
{
var feature:Feature = propertyChangeEvent.target as Feature;
if (propertyChangeEvent.property === quot;geometryquot;)
{
var graphic:Graphic = m_graphicsDict[feature.featureId];
if (graphic)
{
graphic.geometry = feature.geometry;
}
}
}
}
75. private function doUpdate(event:CollectionEvent):void
{
for each (var propertyChangeEvent:PropertyChangeEvent in event.items)
{
var feature:Feature = propertyChangeEvent.target as Feature;
if (propertyChangeEvent.property === quot;geometryquot;)
{
var graphic:Graphic = m_graphicsDict[feature.featureId];
if (graphic)
{
graphic.geometry = feature.geometry;
}
}
}
}
76. private function doUpdate(event:CollectionEvent):void
{
for each (var propertyChangeEvent:PropertyChangeEvent in event.items)
{
var feature:Feature = propertyChangeEvent.target as Feature;
if (propertyChangeEvent.property === quot;geometryquot;)
{
var graphic:Graphic = m_graphicsDict[feature.featureId];
if (graphic)
{
graphic.geometry = feature.geometry;
}
}
}
}
77. 1.private function mouseDownHandler(event:MouseEvent):void
2.{
3. const graphic:Graphic = event.target as Graphic;
4. if (graphic)
5. {
6. m_feature = graphic.attributes as Feature;
7. m_graphic.geometry = map.toMapFromStage(event.stageX, event.stageY);
8. pointLayer.add(m_graphic);
9. map.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
10. map.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
11. }
12.}
14.private function mouseMoveHandler(event:MouseEvent):void
15.{
16. m_graphic.geometry = map.toMapFromStage(event.stageX, event.stageY);
17. event.updateAfterEvent();
18.}
20.private function mouseUpHandler(event:MouseEvent):void
21.{
22. m_feature.geometry = m_graphic.geometry; // ALL DS FM is Here :-)
23. m_feature = null;
24. pointLayer.clear();
25. map.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
26. map.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
27.}
78. 1.private function mouseDownHandler(event:MouseEvent):void
2.{
3. const graphic:Graphic = event.target as Graphic;
4. if (graphic)
5. {
6. m_feature = graphic.attributes as Feature;
7. m_graphic.geometry = map.toMapFromStage(event.stageX, event.stageY);
8. pointLayer.add(m_graphic);
9. map.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
10. map.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
11. }
12.}
14.private function mouseMoveHandler(event:MouseEvent):void
15.{
16. m_graphic.geometry = map.toMapFromStage(event.stageX, event.stageY);
17. event.updateAfterEvent();
18.}
20.private function mouseUpHandler(event:MouseEvent):void
21.{
22. m_feature.geometry = m_graphic.geometry; // ALL DS FM is Here :-)
23. m_feature = null;
24. pointLayer.clear();
25. map.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
26. map.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
27.}
79. 1.private function mouseDownHandler(event:MouseEvent):void
2.{
3. const graphic:Graphic = event.target as Graphic;
4. if (graphic)
5. {
6. m_feature = graphic.attributes as Feature;
7. m_graphic.geometry = map.toMapFromStage(event.stageX, event.stageY);
8. pointLayer.add(m_graphic);
9. map.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
10. map.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
11. }
12.}
14.private function mouseMoveHandler(event:MouseEvent):void
15.{
16. m_graphic.geometry = map.toMapFromStage(event.stageX, event.stageY);
17. event.updateAfterEvent();
18.}
20.private function mouseUpHandler(event:MouseEvent):void
21.{
22. m_feature.geometry = m_graphic.geometry; // ALL DS FM is Here :-)
23. m_feature = null;
24. pointLayer.clear();
25. map.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
26. map.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
27.}
98. ClusterSymbol : Symbol
• Draws a Cluster geometry instance
• Flash drawing API
• beginFill - based on cluster count
• drawRoundedRect - based on Cx,Cy
105. Given set of map points
Assign map point to cluster set
106. Given set of map points
Assign map point to cluster set
do
107. Given set of map points
Assign map point to cluster set
do
spatial index clusters
108. Given set of map points
Assign map point to cluster set
do
spatial index clusters
for each cluster Ci
109. Given set of map points
Assign map point to cluster set
do
spatial index clusters
for each cluster Ci
find adjacent clusters Cj
110. Given set of map points
Assign map point to cluster set
do
spatial index clusters
for each cluster Ci
find adjacent clusters Cj
if Cj is close enough to Ci
111. Given set of map points
Assign map point to cluster set
do
spatial index clusters
for each cluster Ci
find adjacent clusters Cj
if Cj is close enough to Ci
assign Cj map points to Ci
112. Given set of map points
Assign map point to cluster set
do
spatial index clusters
for each cluster Ci
find adjacent clusters Cj
if Cj is close enough to Ci
assign Cj map points to Ci
remove Cj from cluster set
113. Given set of map points
Assign map point to cluster set
do
spatial index clusters
for each cluster Ci
find adjacent clusters Cj
if Cj is close enough to Ci
assign Cj map points to Ci
remove Cj from cluster set
adjust Ci location
114. Given set of map points
Assign map point to cluster set
do
spatial index clusters
for each cluster Ci
find adjacent clusters Cj
if Cj is close enough to Ci
assign Cj map points to Ci
remove Cj from cluster set
adjust Ci location
repeat while overlapping clusters exist