Select to view content in your preferred language

Retaining graphic attributes after query, cut and relation

2185
1
04-12-2013 05:35 AM
by Anonymous User
Not applicable
I use a graphical query to select polygons, cut the polygons with a border polyline and then remove "cut" polgyons outside the border polyline. Now, I need the attributes on the final result.  Any simple ways to do this?  Or, do I need another relation?

   private function showSoils(event:MouseEvent):void
   { 
    var cutPolyInside:Polygon = new Polygon;
    var cutPline:Polyline = new Polyline; 
    geomArr = [];
    geomArr2 = [];
    geomArr.push(hostComponent.graphic.geometry);
    var iPoly:Polygon = hostComponent.graphic.geometry as Polygon;
    // convert the polygon into polyline for cutting
    cutPline = polygonToPolyline(iPoly);
    cutPline.spatialReference = new SpatialReference(102003);
    try
    {
     queryFeaturesGraphical(hostComponent.graphic.geometry);
    }
    catch (error:Error)
    {
     msgVisible = false;
     Alert.show(error.message);
    }  
   
    
    function queryFeaturesGraphical(geom:Geometry):void
    {
     var queryParams:Query = new Query();
     queryParams.returnGeometry = true;
     var queryFields:String = "*";
     queryParams.outFields = queryFields.split(","); 
     queryParams.outSpatialReference = hostComponent.map.spatialReference;
     queryParams.geometry = geom;  
     queryParams.spatialRelationship = "esriSpatialRelIntersects";
     var url:String = "http://gis.macombgov.org/ArcGIS/rest/services/FLEX2/Feature_Natural/MapServer/9";
     var queryTask:QueryTask = new QueryTask(url);  
     queryTask.execute(queryParams, new AsyncResponder(onResult, onFault));      
    }
    
    function onResult(featureSet:FeatureSet, token:XMLList = null):void
    {         
     try
     {      
      
      for each (var graphic:Graphic in featureSet.features)
      {   
       geomArr2.push(graphic.geometry);
      } 
      beginCutting();
     }
     catch (error:Error)
     {
      msgVisible = false;
      Alert.show(error.message);
     }
    }
    
    function onFault(info:Object, token:Object = null):void
    {
     msgVisible = false;
     Alert.show(info.toString());
    } 
    
    function beginCutting():void
    {
     myGeometryService2.addEventListener(GeometryServiceEvent.CUT_COMPLETE, cutCompleteHandler);
     myGeometryService2.cut(geomArr2,cutPline);
    }
    
    function cutCompleteHandler(event:GeometryServiceEvent):void
    {   
     myGeometryService2.removeEventListener(GeometryServiceEvent.CUT_COMPLETE, cutCompleteHandler);
     msgVisible = false;
     var relationParameters:RelationParameters = new RelationParameters();
     relationParameters.geometries1 = myGeometryService2.cutLastResult.geometries;
     relationParameters.geometries2 = geomArr;     
     relationParameters.spatialRelationship = RelationParameters.SPATIAL_REL_WITHIN;
     myGeometryService2.addEventListener(GeometryServiceEvent.RELATION_COMPLETE, relationCompleteHandler);
     myGeometryService2.relation(relationParameters);
    }    
    
    function relationCompleteHandler(event:GeometryServiceEvent):void
    {
     myGeometryService2.removeEventListener(GeometryServiceEvent.RELATION_COMPLETE, relationCompleteHandler);
     var result:Array = event.result as Array;
     // highlight the geometries within the polygon.
     for each (var obj:Object in result)
     {
      var resultGraphic:Graphic = new Graphic(obj.geometry1);
      resultGraphic.symbol = graphicSymbol2;
      myGraphicsLayer.add(resultGraphic);       
     }
    } 
Tags (2)
0 Kudos
1 Reply
RobertBorchert
Honored Contributor
You  may need to use arc catalog and for each feature  set the default value for each attribute to nothing.  Essentially you are creating a new feature when you cut and it is making those values the default value.



I use a graphical query to select polygons, cut the polygons with a border polyline and then remove "cut" polgyons outside the border polyline. Now, I need the attributes on the final result.  Any simple ways to do this?  Or, do I need another relation?

   private function showSoils(event:MouseEvent):void
   { 
    var cutPolyInside:Polygon = new Polygon;
    var cutPline:Polyline = new Polyline; 
    geomArr = [];
    geomArr2 = [];
    geomArr.push(hostComponent.graphic.geometry);
    var iPoly:Polygon = hostComponent.graphic.geometry as Polygon;
    // convert the polygon into polyline for cutting
    cutPline = polygonToPolyline(iPoly);
    cutPline.spatialReference = new SpatialReference(102003);
    try
    {
     queryFeaturesGraphical(hostComponent.graphic.geometry);
    }
    catch (error:Error)
    {
     msgVisible = false;
     Alert.show(error.message);
    }  
   
    
    function queryFeaturesGraphical(geom:Geometry):void
    {
     var queryParams:Query = new Query();
     queryParams.returnGeometry = true;
     var queryFields:String = "*";
     queryParams.outFields = queryFields.split(","); 
     queryParams.outSpatialReference = hostComponent.map.spatialReference;
     queryParams.geometry = geom;  
     queryParams.spatialRelationship = "esriSpatialRelIntersects";
     var url:String = "http://gis.macombgov.org/ArcGIS/rest/services/FLEX2/Feature_Natural/MapServer/9";
     var queryTask:QueryTask = new QueryTask(url);  
     queryTask.execute(queryParams, new AsyncResponder(onResult, onFault));      
    }
    
    function onResult(featureSet:FeatureSet, token:XMLList = null):void
    {         
     try
     {      
      
      for each (var graphic:Graphic in featureSet.features)
      {   
       geomArr2.push(graphic.geometry);
      } 
      beginCutting();
     }
     catch (error:Error)
     {
      msgVisible = false;
      Alert.show(error.message);
     }
    }
    
    function onFault(info:Object, token:Object = null):void
    {
     msgVisible = false;
     Alert.show(info.toString());
    } 
    
    function beginCutting():void
    {
     myGeometryService2.addEventListener(GeometryServiceEvent.CUT_COMPLETE, cutCompleteHandler);
     myGeometryService2.cut(geomArr2,cutPline);
    }
    
    function cutCompleteHandler(event:GeometryServiceEvent):void
    {   
     myGeometryService2.removeEventListener(GeometryServiceEvent.CUT_COMPLETE, cutCompleteHandler);
     msgVisible = false;
     var relationParameters:RelationParameters = new RelationParameters();
     relationParameters.geometries1 = myGeometryService2.cutLastResult.geometries;
     relationParameters.geometries2 = geomArr;     
     relationParameters.spatialRelationship = RelationParameters.SPATIAL_REL_WITHIN;
     myGeometryService2.addEventListener(GeometryServiceEvent.RELATION_COMPLETE, relationCompleteHandler);
     myGeometryService2.relation(relationParameters);
    }    
    
    function relationCompleteHandler(event:GeometryServiceEvent):void
    {
     myGeometryService2.removeEventListener(GeometryServiceEvent.RELATION_COMPLETE, relationCompleteHandler);
     var result:Array = event.result as Array;
     // highlight the geometries within the polygon.
     for each (var obj:Object in result)
     {
      var resultGraphic:Graphic = new Graphic(obj.geometry1);
      resultGraphic.symbol = graphicSymbol2;
      myGraphicsLayer.add(resultGraphic);       
     }
    } 
0 Kudos