ThinkGeo.com    |     Documentation    |     Premium Support

Question About Drawing Shapes And Save it

Dear Sir,


I am trying to draw different shapes on the map which i can do using:


Map1.EditOverlay.TrackMode = TrackMode.Circle;


now, i have to problems:


First of all, i use CustomOverlays, which mean that i cant use some code like this:


 


//InMemoryFeatureLayer shapeLayer = (InMemoryFeatureLayer)Map1.DynamicOverlay.Layers["shapeLayer"];

//foreach (Feature feature in Map1.EditOverlay.Features)

//{

// shapeLayer.InternalFeatures.Add(feature.Id, feature);

//}

//Map1.EditOverlay.Features.Clear();

//Map1.DynamicOverlay.Redraw();


this is my first question, how can i apply the same code using CustomOverlays not dynamic.


second question is how can i read the actual center point of circle and the readius of it to store it to database, and how can i draw it again in the form_load if i have x,y and radius.

the same question with Polygon also.


Thanks,



Ahmed, 
  
 StaticOverlay and DynamicOverlay is a shortcut of LayerOverlay; the advantage is that you can write code line Map1.StaticOverlay.Layers.Add… 
  
 But it has some limits when you want to add more Overlays on the map. 
  
 StaticOverlay is LayerOverlay with its IsBaseOverlay property ture as default; also its TileType is Multiple Tile. 
 DynamicOverlya is LayerOverlay as well with its IsBaseOverlay property false as default; its TileType is SingleTile. 
  
 What you need to do is newing a LayerOverlay set its property as I mentioned above; then add into the Map.CustomOverlay collection. 
  
 One thing I want to point out is that the StaticOverlay and DynamicOverlay which I called DefaultOverlay cannot work with CustomOverlay; otherwise we’ll throw exception to you. 
  
 After drawing circle, we actually return a multi-polygon to you on the server side for there is no circle shape in the real GIS world. You can easily get the center by “GetCenterPoint” method directly. On the other hand, readius of the circle is half width or height of its bounding box; so you can get it by “shape.GetBoundingBox().Width/2”. 
  
 Please have a try and let me know if you have any questions. 
  
 Thanks, 
 Howard 


ok it is clear now, but again this is my code to add:


LayerOverlay layerOverlay33 = new LayerOverlay("ShapeOverlay");


InMemoryFeatureLayer shapeLayer = new InMemoryFeatureLayer();


shapeLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.FromArgb(180, 102, 255, 102), 10, GeoColor.StandardColors.DarkGreen, 1);


shapeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Green, 4, true);


shapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(180, 102, 255, 102), GeoColor.StandardColors.DarkGreen, 1);


shapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


shapeLayer.DrawingQuality = DrawingQuality.HighQuality;


layerOverlay33.Layers.Add("shapeLayer", shapeLayer);


layerOverlay33.TileType = TileType.MultipleTile;


layerOverlay33.IsBaseOverlay = true;




Map1.CustomOverlays.Add(layerOverlay33);




when i try to access using static or whatever using for example this line of code:


InMemoryFeatureLayer shapeLayer = (InMemoryFeatureLayer)Map1.StaticOverlay.Layers["shapeLayer"];


it still give me this errror:


The given key was not present in the dictionary.


 


 



Ahmed,



As I mentioned before, if you use custom overlays, you cannot use custom overlays anymore. Here you added the overlay into custom overlays; that means you need to get the overlay back from the custom overlays.



So here is the code:

LayerOverlay layerOverlay = (LayerOverlay)Map1.CustomOverlays["ShapeOverlay"];
InMemoryFeatureLayer shapeLayer = (InMemoryFeatureLayer)layerOverlay.Layers["shapeLayer"];

Please let me know if you have more queries.



Thanks,

Howard



yes, it is working now, 
 thanks so much.

Ahmed, 
  
 Great; please let us know if you have more queries. 
  
 Thanks, 
 Howard