ThinkGeo.com    |     Documentation    |     Premium Support

Drawing shapes in trakshape layer when changing the projection of it

Hi All


When the projection of TrackShapeLayer change to some other projection (Ex: to use with Google Map) all previously drew shapes appear on the correct position of the map. But when adding new shapes those shapes are still using old projection. (Not appear the place I drew on the map).  I’m using TrackOverlay.TrackMode to draw shapes


To overcome this I use TrackEnded event and converted just drew shape into new coordinates using projection. I believe this is not a very good option. And when drawing lines those are only appear on correct position of the map just after changed the coordinates using above said event. The track of the line with mouse doesn’t appear on the map. 


What guess is, there should be another layer which hold current drawings before they add into TrackShapeLayer.  If there is such layer, how to change the projection of that layer in order to change the projection of current drawings. Do thinkgeo expose such layer? If not, how to deal with this situation? I need to change the projection of my map frequently to use different backgrounds such as Google map, Wms, tif.  


Thanks


Amila



Dear Amila, 



Could you please try this sample? I think it works fine. 




        private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.Meter;

            GoogleMapsOverlay test = new GoogleMapsOverlay();
            winformsMap1.Overlays.Add(test);
           
            winformsMap1.TrackOverlay.TrackMode = TrackMode.Line;
            
            Collection<Vertex> vertexs = new Collection<Vertex>();
            vertexs.Add(new Vertex(-120, 70));
            vertexs.Add(new Vertex(-120, 60));
            vertexs.Add(new Vertex(-120, 50));
            vertexs.Add(new Vertex(-110, 50));
            vertexs.Add(new Vertex(-100, 50));
            vertexs.Add(new Vertex(-90, 50));
            vertexs.Add(new Vertex(-90, 40));
            vertexs.Add(new Vertex(-90, 30));
            vertexs.Add(new Vertex(-90, 20));
            
            Proj4Projection proj = new Proj4Projection();
            proj.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
            proj.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();
           
            winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Add(new Feature(new LineShape(vertexs)));
            winformsMap1.TrackOverlay.TrackShapeLayer.FeatureSource.Projection = proj;
           
            winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.SimpleColors.Red, 4));
            winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            

            winformsMap1.TrackOverlay.TrackMode = TrackMode.None;
            winformsMap1.CurrentExtent = new LineShape(vertexs).GetBoundingBox();
            winformsMap1.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962);

            winformsMap1.Refresh();
        }
private void button1_Click(object sender, EventArgs e)
        {
            winformsMap1.TrackOverlay.TrackMode = TrackMode.Point;
            winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Add(new Feature(new PointShape(-120, 40)));
            winformsMap1.TrackOverlay.TrackMode = TrackMode.None;
            winformsMap1.Refresh();
        }
 

If I misunderstanding something, please feel free to tell me. 



Thanks, 



Gary



Dear Gray,



I think you have understood it into some extend. Look into the code I past here. When the line is drawing it will not appear on the map until change the coordinates. I'm looking for a solution to that issue. Please add winformsMap1.TrackOverlay.TrackEnded += _TrackOverlay_TrackEnded; line into form_Load event and add another button as buttonDrawLine into the code you sent to me



Thank you
Amila

 


 






private void _TrackOverlay_TrackEnded(object sender, TrackEndedTrackInteractiveOverlayEventArgs e)
        {
            Projection proj = winformsMap1.TrackOverlay.TrackShapeLayer.FeatureSource.Projection;

            Feature feature = e.TrackShape.GetFeature();
            winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Remove(feature);
            feature = proj.ConvertToInternalProjection(feature);
            winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Add(feature);
        }

private void buttonDrawLine_Click(object sender, EventArgs e)
        {
            winformsMap1.TrackOverlay.TrackMode = TrackMode.Line;
            winformsMap1.Cursor = Cursors.Cross;
        }


Dear Amila, 



Please try this code: 




        private void _TrackOverlay_TrackEnded(object sender, TrackEndedTrackInteractiveOverlayEventArgs e)
        {
            Feature feature = e.TrackShape.GetFeature();
            LayerOverlay worldOverlay = new LayerOverlay();
            InMemoryFeatureLayer imlayer = new InMemoryFeatureLayer();
            imlayer.InternalFeatures.Add(feature);
            imlayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.SimpleColors.Red, 4));
            imlayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            worldOverlay.Layers.Add("TrackResultlayer", imlayer);
            winformsMap1.Overlays.Add(worldOverlay);
            winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Remove(feature);
            winformsMap1.Refresh();
        }

        
        private void _TrackOverlay_TrackStarted(object sender, TrackStartedTrackInteractiveOverlayEventArgs e)
        {
            Proj4Projection proj = new Proj4Projection();
            proj.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
            proj.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
            winformsMap1.TrackOverlay.TrackShapeLayer.FeatureSource.Projection = proj;
        }



And also I suggestion you to put the new tracked features to a new overlay not track overlay. 



Any questions please feel free to let me know. 



Gary



Dear Gray, 
  
 I think best option is to listen mouse events and change the coordinates using current projection. If I change projection of track shape layer when  _TrackOverlay_TrackStarted, then existing features moved away from the map. In my situation I can only keep features in build in track shape layer. 
  
 Thanks 
 Amila

Dear Amila, 
  
 That’s why I suggest you to put the tracked result to another overlay not track overlay, so that, you can change the projection for the track overlay freely. So if you have existed features in the track overlay, try to put them in other overlay in _TrackOverlay_TrackStarted. 
  
 Regards, 
  
 Gary

Dear Gray, 
  
 I need to keep my old features in track shape layer as this is a bit a complex app and lots of other class refer to this layer for shapes. I think best work around is to use mouse events and change the coordinates according to the projection. 
  
 Thanks and Regards 
 Gray

Dear Amila, 
  
 Is your old features have large number? if not, at the start event, you can copy all of them to a temporary layer, then change the projection of track shape layer, at the end event, change the projection back and copy the old features back, also you can keep the new features in the track shape layer. 
  
 Regards, 
  
 Gary