ThinkGeo.com    |     Documentation    |     Premium Support

Rotate map canvas - problem in zoom and panning

 


Hello


I followed  you example from the following link:


wiki.thinkgeo.com/wiki/Map_Suite_Wpf_Desktop_Edition_All_Samples#Map_Rotation_and_Multi_Touch.28WPF.29


In my project my map contains only raster layers (not
vectors)


I rotated the Wpfmap canvas and it worked well.


The problem is that when the user performs panning or
zoom in, the behavior of the control seams not good. It seems that when panning
or zooming the image is been cropped. Meaning there are areas where the image
should be displayed by there are in fact “empty”.


I am not sure if this strange behavior is happening due to
same faulty configuration in my part.


It seems that the view is been “cut” or restricted in same
way. Maybe it is a problem of the CurrentExtent configuration, or the dimensions
of the canvas.


I succeeded to replicate the problematic behavior in a
small demo project


The attached zip file contains:


1.The source code of the demo project


2.The image I used


3.Word file with screen shots of the problematic situations


I will appreciate your advice




Thank you very much



001_Rotate_canvas.zip (52.1 KB)
002_001_image.zip (1.41 MB)
rotate_canvas_zoom_and_pan_problem.docx (1.58 MB)

Hi Miri, 
  
 I am sorry, I do some research today.  
  
 The sample for rotate is not really rotate, it still render our map correct but only rotate the element of WPF, which is the feature support by WPF. If you render another layer background you can see whenever you pan or zoom the map, the valid area should be diamond but not rectangleshape. 
  
 I found that after I tried to implement a custom layer for you as below, which just work like default. So I am sorry I think I hadn’t a workaround for that also. 
  
  
 public class MyGdiPlusRasterLayer : GdiPlusRasterLayer
    {
        string pathFilename;        
        WorldFile worldFile;
        RectangleShape bitmapExtent;
        GeoImage geoImage;

        public MyGdiPlusRasterLayer(string pathFilename, string worldFilename)
            : base(pathFilename, worldFilename)
        {
            this.pathFilename = pathFilename;

            using (StreamReader fs = new StreamReader(worldFilename))
            {
                worldFile = new WorldFile(fs.ReadToEnd());
            }
            geoImage = new GeoImage(pathFilename);

            bitmapExtent = worldFile.GetBoundingBox(geoImage.GetWidth(), geoImage.GetHeight());

        }

        protected override void DrawCore(GeoCanvas canvas, Collection<SimpleCandidate> labelsInAllLayers)
        {   
            PointShape centerPointShape = canvas.CurrentWorldExtent.GetCenterPoint();

            RectangleShape mapExtentInCurrentScale = ExtentHelper.ZoomToScale(canvas.CurrentScale, bitmapExtent, canvas.MapUnit, canvas.Width, canvas.Height);

            float drawingWidth = (float)(bitmapExtent.Width / mapExtentInCurrentScale.Width * geoImage.GetWidth());
            float drawingHeight = (float)(bitmapExtent.Height / mapExtentInCurrentScale.Height * geoImage.GetHeight());

            canvas.DrawWorldImage(geoImage, bitmapExtent.GetCenterPoint().X, bitmapExtent.GetCenterPoint().Y, drawingWidth, drawingHeight, DrawingLevel.LevelOne);         
        }
    }
 
  
 Regards, 
  
 Don

Hallo



Due to my client’s request this feature becomes vary critical for us.

I need to enable the user to rotate the map, the map contains  a raster layer (not vector)

Can you please advice my for a solution?



You can see the attached demo project from the previous question, it shows that there is a major problem when panning or zooming if the tactic for rotation is as described in your 

“Map Rotation and Multi Touch(WPF)” exmple


Thank you 

Hi Miri, 
  
 Our developer is working for enhancement the rotation, but we cannot provide a plan about when they can complete that. 
  
 For raster layer, have you tried to use projection to rotate the map? 
  
 Regards, 
  
 Don

Thank you



Yes I tried to use Rotation projection like so:



RotationProjection rotateProjection = new RotationProjection();
rotateProjection.Open();
rotateProjection.SourceUnit = GeographyUnit.Meter;
rotateProjection.Angle = 270;



rasterLayer.Open();
rotateProjection.PivotCenter = rasterLayer.GetBoundingBox().GetCenterPoint();          
rasterLayer.ImageSource.Projection = rotateProjection;
rasterLayer.Close();



but I got the following exception:

"Convert Raster to Exsternal Projection by default is not implemented, please override this method if needed"



what am I doing wrong?


Hi Miri, 
  
 I am not sure which layer you are using, I tested that follow the code as below, and it works well. Please update your dlls to the latest and have another test: 
  
  
private void LoadAGeoTiffImage_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            GeoTiffRasterLayer worldImageLayer = new GeoTiffRasterLayer(@"…\SampleData\Data\world.tif");


            worldImageLayer.UpperThreshold = double.MaxValue;
            worldImageLayer.LowerThreshold = 0;
           worldImageLayer.IsGrayscale = false;

            RotationProjection rotateProjection = new RotationProjection();
            rotateProjection.Open();
            rotateProjection.SourceUnit = GeographyUnit.DecimalDegree;
            rotateProjection.Angle = 133;

            worldImageLayer.Open();
            rotateProjection.PivotCenter = worldImageLayer.GetBoundingBox().GetCenterPoint();
            worldImageLayer.ImageSource.Projection = rotateProjection;
            worldImageLayer.Close();

            LayerOverlay ImageOverlay = new LayerOverlay();
            ImageOverlay.Layers.Add("WorldImageLayer", worldImageLayer);
            winformsMap1.Overlays.Add(ImageOverlay);

            winformsMap1.CurrentExtent = new RectangleShape(-118.098, 84.3, 118.098, -84.3);
            winformsMap1.Refresh();
        }

 
  
 If I missed anything please let me know. 
  
 Regards, 
  
 Don