ThinkGeo.com    |     Documentation    |     Premium Support

Union Zips

 Hi,


I'm trying to union the two zips.  But only one of them is being highlight.  Not sure if I'm missing something.


 


               Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));


                Map1.CurrentExtent = new RectangleShape(-125, 72, 50, -46);


                Map1.MapUnit = GeographyUnit.DecimalDegree;


 


                WorldMapKitWmsWebOverlay worldMapKitOverlay = new WorldMapKitWmsWebOverlay();


                Map1.CustomOverlays.Add(worldMapKitOverlay);


 


                ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(ConfigurationSettings.AppSettings["Default2"] + "\\tl_2010_26_zcta510.shp");


                worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));


                worldLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = new TextStyle("ZCTA5CE10", new GeoFont("Verdana", 7, DrawingFontStyles.Regular), new GeoSolidBrush(GeoColor.StandardColors.LightSlateGray));//TextStyles.County1("NAME");


                worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


                


                


                InMemoryFeatureLayer mapShapeLayer = new InMemoryFeatureLayer();


                mapShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoSolidBrush(new GeoColor(50, 100, 100, 200)));


                mapShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.RoyalBlue;


                mapShapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


 


                worldLayer.Open();


                //Collection<feature> features = worldLayer.QueryTools.GetFeaturesByIds(featureIds, new string[] { "CNTRY_NAME" });  </feature>


                Feature features = worldLayer.QueryTools.GetFeaturesByColumnValue("ZCTA5CE10", "49508")[0];


                Feature features2 = worldLayer.QueryTools.GetFeaturesByColumnValue("ZCTA5CE10", "49512")[0];


                worldLayer.Close();


                mapShapeLayer.InternalFeatures.Add("AreaShape1", features);


                mapShapeLayer.InternalFeatures.Add("AreaShape2", features2);


                LayerOverlay dynamicOverlay = new LayerOverlay();


                dynamicOverlay.TileType = TileType.SingleTile;


                dynamicOverlay.Layers.Add("InMemoryFeatureLayer", mapShapeLayer);


                dynamicOverlay.Layers.Add("worldLayer", worldLayer);


                dynamicOverlay.IsBaseOverlay = false;


                Map1.CustomOverlays.Add(dynamicOverlay);


                if (mapShapeLayer.InternalFeatures.Count > 1)


                {


                    AreaBaseShape targetShape = (AreaBaseShape)mapShapeLayer.InternalFeatures["AreaShape1"].GetShape();


                    mapShapeLayer.Open();


                    mapShapeLayer.EditTools.BeginTransaction();


                    mapShapeLayer.EditTools.Union("AreaShape2", targetShape);


                    mapShapeLayer.EditTools.Delete("AreaShape1");                   


                    mapShapeLayer.EditTools.CommitTransaction();


                    mapShapeLayer.Close();


                    mapShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush.Color = GeoColor.FromArgb(100, GeoColor.StandardColors.Blue);


                }


                ((LayerOverlay)Map1.CustomOverlays[1]).Redraw();  


 



001_union.png (45.7 KB)

Hello Vinh,


Thanks for your post, sorry I can't run your code because I didn't have the shape file.


Just reviewed the code, everything is ok, could you please debug


mapShapeLayer.EditTools.Union("AreaShape2", targetShape);


When the union finished, what's the WKT of new feature, save it and draw it to see if the union get the right result.


Regards,


Gary



 Hi Gary,


I'm using tl_2010_26_zcta510 from Cencus.gov for the state of MI.


VV



Hello Vinh, 
  
 Could you please do the debug as above? 
  
 If you meet any problem, please let me know. 
  
 Regards, 
  
 Gary

 Hi Gary,


The WKT before and after the Union is the same, even with after the delete.


mapShapeLayer.EditTools.BeginTransaction();

mapShapeLayer.EditTools.Union("AreaShape2", targetShape);

mapShapeLayer.EditTools.Delete("AreaShape1");

string wkt2 = targetShape.GetWellKnownText();

bool isequal = wkt1.Equals(wkt2);



Hi Vinh, 



I think you are checking the WellKnownText of the 'targetShape' which is not modified during the union. In your test 'AreaShape2' is the feature whose WellKnownText should change: 



The Union Method has two parameters: EditTools.Union(featureId, targetAreaFeature) 



featureID: This parameter is the Feature you want to add the new area to. This is the feature whose WellKnown text should change. 

targetAreaFeature: The feature you are trying to find the union with. 



Compare the WellKnownText of "AreaShape2" before and after you run the Union and Commit commands and I think you will see the difference.

 




 Hi Ryan,


I modified my code to check for the WKT for both and they appear to be the same.  I'm attaching my screen shot.


VV



Hi Vinh,  
  
 Is AreaShape2 in your sample above the original non-unioned shape? 
  
 In my test you will see that the WKT for AreaShape2 starts out with POLYGON. 
 In your test your AreaShape2 starts with MULTIPOLYGON as shown as wk1 and ends with MULTIPOLYGON with wk2. This makes me believe that you are AreaShape2 actually starts out with a polygon of the original shape unioned with targetshape (it is already a multipolygoN) and you are just unioning targetshape again.  
  
 To verify this can you supply the complete WKT strings for wk1 and wk2 from your sample?

Hi, 



Is AreaShape2 in your sample above the original non-unioned shape? Yes, the AreaShape1 and AreaShap2 were defined as follow



worldLayer.Open();
Feature features = worldLayer.QueryTools.GetFeaturesByColumnValue("ZCTA5CE10", "49508")[0];
Feature features2 = worldLayer.QueryTools.GetFeaturesByColumnValue("ZCTA5CE10", "49512")[0];
Feature features3 = worldLayer.QueryTools.GetFeaturesByColumnValue("ZCTA5CE10", "49323")[0];
worldLayer.Close();



mapShapeLayer.InternalFeatures.Add("AreaShape1", features);
mapShapeLayer.InternalFeatures.Add("AreaShape2", features2);
LayerOverlay dynamicOverlay = new LayerOverlay();
dynamicOverlay.TileType = TileType.SingleTile;
dynamicOverlay.Layers.Add("InMemoryFeatureLayer", mapShapeLayer);
dynamicOverlay.Layers.Add("worldLayer", worldLayer);
dynamicOverlay.IsBaseOverlay = false;
Map1.CustomOverlays.Add(dynamicOverlay);

Since the text for both wkt1 and wkt2 are too long to paste in this thread so I will save in the text file and attach in this thread.  And the SHP file I'm using the ZIP from cencus for MI.

 



wkt1.txt (9.78 KB)
wkt2.txt (9.79 KB)

Hi Vinh,


Here is the code you originally provided for the Union Button Click:


mapShapeLayer.Open();
mapShapeLayer.EditTools.BeginTransaction();
mapShapeLayer.EditTools.Union("AreaShape2", targetShape);
mapShapeLayer.EditTools.Delete("AreaShape1");
mapShapeLayer.EditTools.CommitTransaction();
mapShapeLayer.Close();

Your original concern was that only one of the shapes was highlighted. By performing the Union you joined AreaShape2 and 'targetShape' together and removed/deleted 'AreaShape1'. Thus only one shape exists to be highlighted; the combined AreaShape2-targetShape.


One element you may not be aware of is the TransactionResult that is returned by the CommitTransaction method. With the TransactionResult you can get FailureReasons, TotalFailureCount, TotalSuccessCount, and TransactionResultStatus.


TransactionResult testresult =  mapShapeLayer.EditTools.CommitTransaction();
Dictionary <String,String> failureReasons = testresult.FailureReasons;
int totalFailureCount = testresult.TotalFailureCount;
int totalSuccessCount = testresult.TotalSuccessCount;
TransactionResultStatus transactionResultStatus = testresult.TransactionResultStatus;

These properties can prove very helpful in diagnosing any issue you might be having with the EditTools methods.



Finally I wanted to point out that you are using the InternalFeatures.Add to create the Features for your mapShapeLayer. Although this works, this method does not provide you the same information that the EditTools can. The EditTools has Add method that would work very well for adding new features to your Layer and with the TransactionResult you can verify that the add was successful or find out why it may not have been successful. I highly recommend using the EditTools.Add whenever possible rather than the InternalFeatures.Add so that you can take advantage of these tools.