ThinkGeo.com    |     Documentation    |     Premium Support

Problem displaying shape on InMemoryFeatureLayer

Hello,


I have a problem on my application using MapSuite WebEdition.I have a prototype that deals with many CustomOverlay (BaseOverlay = true) in order to display background maps (Google Maps, Bing, Picture with workfile...). I can switch between these kind of maps.I also created another CustomOverlay (type LayerOverlay with BaseOverlay = false) that include an InMemoryFeatureLayer that will display shapes over the maps.


I wanted to create a shape and to transfer that polygon from EditOverlay to my InMemoryFeatureLayer. When I try to do the transfer using the following code, the shape doesn't appear on the screen (but the shape exists in the InMemoryFeatureLayer).


InMemoryFeatureLayer shapeLayer = (InMemoryFeatureLayer)((LayerOverlay)Session["ShapeOverlay"]).Layers[0];

foreach (Feature feature in Map1.EditOverlay.Features)

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

Map1.EditOverlay.Features.Clear();

((LayerOverlay)Session["ShapeOverlay"]).Redraw();


I want to know if it's possible to add shape to a InMemoryFeatureLayer inside a CustomOverlay. I try to use Background/DynamicOverlay to do my prototype but I did'nt find how to change backgroundOverlay easily.



Alexandre,


You can add features to a layer in a custom overlay with no problems. Here is the sample codes for that, please have a look. I think you have this problem probably because the LayerOverlay's IsBackOverlay property is not set to false.



   public partial class DrawEditShapes : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4"));
                Map1.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962);
                Map1.MapUnit = GeographyUnit.Meter;
                Map1.MapTools.OverlaySwitcher.Enabled = true;
             
                GoogleOverlay google = new GoogleOverlay("Google Map");
                google.JavaScriptLibraryUri = new Uri(ConfigurationManager.AppSettings["GoogleUri"]);
                google.GoogleMapType = GoogleMapType.Normal;
                Map1.CustomOverlays.Add(google);

                InMemoryFeatureLayer shapeLayer = new InMemoryFeatureLayer();
                shapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Green);
                shapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

                LayerOverlay layerOverlay = new LayerOverlay("DynamicOverlay");
                layerOverlay.Layers.Add("shapeLayer", shapeLayer);
                layerOverlay.IsBaseOverlay = false;

                Map1.CustomOverlays.Add(layerOverlay);
            }
        }

        protected void buttonSubmit_Click(object sender, ImageClickEventArgs e)
        {
            LayerOverlay DynamicOverlay = (LayerOverlay)Map1.CustomOverlays["DynamicOverlay"];
            InMemoryFeatureLayer shapeLayer = (InMemoryFeatureLayer)DynamicOverlay.Layers["shapeLayer"];
            foreach (Feature feature in Map1.EditOverlay.Features)
            {
                if (!shapeLayer.InternalFeatures.Contains(feature.Id))
                {
                    shapeLayer.InternalFeatures.Add(feature.Id, feature);
                }
            }

            Map1.EditOverlay.Features.Clear();
            Map1.EditOverlay.TrackMode = TrackMode.None;
            DynamicOverlay.Redraw();
        }
    }

Here is the result snapshot.



Thanks,


Ben



Thanks for your answer. 
  
 I manage to solve the problem by myself (it was only a projection bug in my code). Anyway, i can confirm that adding shape on custom overlays is working with your code. 
  


You are welcome! let us know if you have any issues. 
  
 Ben

Shape cannot display if I used  Map1.MapUnit = GeographyUnit.DecimalDegree   instead of  Map1.MapUnit = GeographyUnit.Meter
  
 Please help me!!!  



 Duong, 
  
 I guess you use GoogleOverlay which is not in decimal degree projection, it uses meter as geography unit, could you tell me the reason that you want to used Map1.MapUnit = GeographyUnit.DecimalDegree, and we can figure out a workaround to you. 
  
 Thanks 
 James 


Dear James,  
 I have an AIS system, which receive position infor from vessels and the Longitude, latitude value is DecimalDegree. 
  
 Have u got any Solution for this problem? 
  
 Thanks alot!!! 


Duong,


Please look at the following link, it may helps you:


gis.thinkgeo.com/Support/Dis...fault.aspx


Let me know if you have questions.


Thanks,


James