ThinkGeo.com    |     Documentation    |     Premium Support

Rotating MapShapeLayers

I've been making great use of MapShapeLayers for some items which are highly dynamic in styling.  Now I'm moving on to working with the map rotation, and I've discovered, much to my dismay, that it appears that MapShapeLayers don't seem to support rotation.  This is a considerable problem.  I suspect most of what I'm doing with MapShapeLayers could be done with InMemoryLayers and lots of dynamic ValueStyles, but that sounds really nasty.  In the MapShapeLayer documentation there is a suggestion that it might be improved to the level of functionality of other layers:


"Ideally I would want to make this inherit from the FeatureLayer so you could do spatial queries. In the interests of time I inherited from the Layer to make things simple and show the point of how easy it is to extend Map Suite. When we roll this into the main product we may create a FeatureSource and FeatureLayer. "


Is there any chance of getting a FeatureSource added to MapShapeLayer so it supports rotation?  (I realize it may not be that simple.)  Any other suggestions of how to do this so that the features can be rotated and have some styling flexibility?


Thanks!


Allen Huber


 



Allen, 
  
 I think there is no best way to rotate features, hope I can assist you to accomplish. First I want to answer your questions. 
  
 FeatureSource has a method called GetAllFeatures that will return all features belongs to it, and then you can create MapShape by feature and a zoomllevelset with styles. Each feature can convert to a Shape by using GetShape method, and each shape is inherit from BaseShape which has Rotate method. 
  
 Let you know when you have more questions. 
  
 James 


Hi again James, 
  
 Let me clarify my situation: I am NOT trying to rotate the features in a MapShapeLayer (although I may have wanted to do this some day).  I have a map with a number of static layers from SQL Server and a number of layers (both MapShapeLayers and InMemoryFeatureLayers) that contain temporary items.  Our product has an option where the map rotates in the direction of a vehicle’s travel, so I am rotating the ENTIRE MAP.  I do this, of course, by assigning a RotationProjection to the FeatureSource of the layers.  However, MapShapeLayer doesn’t have a FeatureSource to apply the RotationProjection to, so my background map layers (SQL Server and InMemory layers) rotate but all the features I put in the MapShapeLayer obviously don’t, which is essentially makes MapShapeLayer of no value to us. 
  
 Let me ask my question again: is there any chance the MapShapeLayer can be enhanced to the point of being compatible with the other layer types when rotating the map?  If not, I will have to find another way with InMemoryLayers.  (I apologize for any confusion I may have caused by stating just “rotation”…I should have been clearer between individual feature rotation and overall map rotation.) 
  
 Thanks, 
 Allen

Allen,


Thanks for your post and questions.
 
I think James’ idea is possible, I did a simple test against the rotation of MapShapeLayer, following is the code snippet showing a 40 degree rotation on every map click, hope it helps.
 

private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 
            // Add the mapShapeLayer to the MapEngine
            MapShapeLayer mapShapeLayer = new MapShapeLayer();
 
            MapShape mapShape1 = new MapShape(new Feature(-104, 42));
            mapShape1.ZoomLevels.ZoomLevel01.DefaultPointStyle = new PointStyle(new GeoImage(@"..\..\SampleData\Data\China.png"));
            mapShape1.ZoomLevels.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            mapShapeLayer.MapShapes.Add("1", mapShape1);
 
            MapShape mapShape2 = new MapShape(new Feature(104, 39));
            mapShape2.ZoomLevels.ZoomLevel01.DefaultPointStyle = new PointStyle(new GeoImage(@"..\..\SampleData\Data\China.png"));
            mapShape2.ZoomLevels.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            mapShapeLayer.MapShapes.Add("2", mapShape2);
 
            Feature feature3 = new Feature(new RectangleShape(40, 60, 60, 40));
            MapShape mapShape3 = new MapShape(feature3);
            mapShape3.ZoomLevels.ZoomLevel01.DefaultAreaStyle = AreaStyles.Forest1;
            mapShape3.ZoomLevels.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            mapShapeLayer.MapShapes.Add("3", mapShape3);
 
            BaseShape shape = new PointShape(-71, -52).GetShortestLineTo(new PointShape(38, 8), GeographyUnit.DecimalDegree);
            MapShape mapShape4 = new MapShape(new Feature(shape));
            mapShape4.ZoomLevels.ZoomLevel01.DefaultLineStyle = LineStyles.ContestedBorder2;
            mapShape4.ZoomLevels.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            mapShapeLayer.MapShapes.Add("4", mapShape4);
            
            LayerOverlay layerOVerlay = new LayerOverlay();
            layerOVerlay.Layers.Add("mapShapeLayer", mapShapeLayer);
            winformsMap1.Overlays.Add("layerOVerlay", layerOVerlay);
 
            winformsMap1.CurrentExtent = new RectangleShape(65, 30, 95, 15);
 
            winformsMap1.MapClick += new EventHandler<MapClickWinformsMapEventArgs>(winformsMap1_MapClick);
            winformsMap1.Refresh();
        }
 
        void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)
        {
            RotationProjection rotationProjection = new RotationProjection(40);
            rotationProjection.Open();
 
            LayerOverlay layerOverlay = (LayerOverlay)winformsMap1.Overlays["layerOVerlay"];
            MapShapeLayer mapShapeLayer = (MapShapeLayer) layerOverlay.Layers[0];
            foreach (MapShape mapShape in mapShapeLayer.MapShapes.Values)
            {
               mapShape.Feature = rotationProjection.ConvertToExternalProjection(mapShape.Feature);
            }
 
            winformsMap1.Refresh(layerOverlay);
        }

 
Any more questions or concerns please do not hesitate to let me know.
 
Thanks.
 
Yale