ThinkGeo.com    |     Documentation    |     Premium Support

Resize map to fit a screen with wrapping turned on

Hello,


Is it possible to resize a map to fit entire screen and do not repeat itself number of times?

I tried to play with custom zoom levels, but it does not work with WrapDateline feature.


My map is in meters and I am using countries02.shp file to display a map with wrapping mode turned on.


Thank you for your help,

Inna



Inna,


 I think that what you need to do is get the current extent of your map before you resize it and then after resizing it you set the extent of the map to that current extent. See the little explanation in code below:


 



//Get the current extent of yout map before resizing it
RectangleShape currentExtent = new RectangleShape(wpfMap1.CurrentExtent.UpperLeftPoint, wpfMap1.CurrentExtent.LowerRightPoint);

//Do your resizing of your map.
//...

//Then, you can set the current extent of your map to the extent before resizing the map.
wpfMap1.CurrentExtent = currentExtent;


Val,


Thank you for your answer. I still cannot make it work.

Please advise about a proper code for resizing a map to 1720 width and 950 height, for example.


Thank you,

Inna



Inna,


 I think that what you are experiencing with the map that appears not working with setting the extent when resizing the map is due to the automatic zoom level snapping happening in the Wpf ediiton. Actually, this was discussed in another post gis.thinkgeo.com/Support/Discussion...fault.aspx


I think this is related to this issue. If you think there is something else going on, please, send us a little sample and we will work on the solution for you. Thank you.



 Hi Val,


 


Please see attached example.

In this example, custom levels only work without cache. As soon as I turning cache on, world looks disordered.


 


Please advise,

Inna


 


 



Inna,


 Thank you for the attached sample. Now the problem has been clearly identified as you can see in the screen shots below. I passed this issue to the Development Team  to fix the bug. I will let you know as soon as I have their response.


Without Cache:



 


 


With Cache:




 Val,


 
Found another problem - When clicking on globe button on PanZoomBar, it does not centers to the whole world.
Is it another bug?

 

 

Inna,


  Thank you for pointing that out. I also noticed the problem. This will be discussed with the Development Team as well. Thank you.



Inna,


  The Development Team told me that you should use GoogleMapZoomLevelSet since you are using the Google Map projection (Spherical Mercator). So replace the code that you have in SetCustomZoomLevels by the code below and you should be fine.


 



private void SetCustomZoomLevels()
{
    wpfMap1.ZoomLevelSet = new GoogleMapZoomLevelSet();

    wpfMap1.CurrentExtent = new RectangleShape(-15000000, 15000000, 15000000, -15000000);
}


Inna,


  Regarding the issue where clicking on the globe button of the PanZoomBar, it does not center on the whole world. I think that actually this is doing it correctly considering that the Google Map (Spherical Mercator) projection disforms grossly the Antartica. To have control on how you want that button the center exactely, you can customize the GlobeButton by implementing the following event and in it set the extent as you wish. See the code below:


 


 



    wpfMap1.MapTools.PanZoomBar.GlobeButtonClick +=new EventHandler<GlobeButtonClickPanZoomBarMapToolEventArgs>(PanZoomBar_GlobeButtonClick);
}

void PanZoomBar_GlobeButtonClick(object sender, GlobeButtonClickPanZoomBarMapToolEventArgs e)
{

    e.NewExtent = new RectangleShape(-15000000, 15000000, 15000000, -15000000);



Hi Val,


Now I have another problem.


I am pre-generating tiles using following code. 

Following code does work with regular ZoomLevelSet but when I’m switching to GoogleMapZoomLevelSet it generates tiles with wrong row number.


 


Thanks,

Inna




 public static readonly RectangleShape MaxExtentForWrappingDateline = new RectangleShape(-400767557376, 20026376, 400767557376, -20026376);
      

        public static void Generate(ZoomLevelSet zoomLevelSet, FeatureLayer shapeFileFeatureLayer, GeographyUnit mapUnit, int tileWidth, int tileHeight, string cacheDirectory, string cacheId)
        {
            Collection<ZoomLevel> zoomLevels = GetAllZoomLevels(zoomLevelSet);
          
            foreach (ZoomLevel zoomLevel in zoomLevels)
            {
                
                MapSuiteTileMatrix matrix = new MapSuiteTileMatrix(zoomLevel.Scale, tileWidth, tileHeight, mapUnit, MaxExtentForWrappingDateline);
                
                // we need sync the max extent as the sample code we set.
                matrix.BoundingBox = MaxExtentForWrappingDateline;
         
                shapeFileFeatureLayer.Open();

                Collection<TileMatrixCell> cells = matrix.GetIntersectingCells(shapeFileFeatureLayer.GetBoundingBox());
              
                // create a tile cache object with the cache directory and cache id.
                FileBitmapTileCache tileCache = new FileBitmapTileCache(cacheDirectory, cacheId, TileImageFormat.Png, matrix);
           
                foreach (TileMatrixCell cell in cells)
                {
                    // create a bitmap whoes size equals to the tile size.
                    using (Bitmap bitmap = new Bitmap(tileWidth, tileHeight))
                    {
                        // create a GeoCanvas which for drawing the passed layers.

                     
                        GdiPlusGeoCanvas geoCanvas = new GdiPlusGeoCanvas();
                        geoCanvas.BeginDrawing(bitmap, cell.BoundingBox, mapUnit);

                        GeoCollection<SimpleCandidate> candidates = new GeoCollection<SimpleCandidate>();


                        lock (shapeFileFeatureLayer)
                        {
                            if (!shapeFileFeatureLayer.IsOpen) { shapeFileFeatureLayer.Open(); }
                            shapeFileFeatureLayer.Draw(geoCanvas, candidates);
                        }
                       

                        // you can commend this line out because it's just for mark a cache label in order to see if it works with our samples.
                        geoCanvas.DrawText("Cache", new GeoFont("Arial", 12), new GeoSolidBrush(GeoColor.SimpleColors.Black), new Collection<ScreenPointF>() { new ScreenPointF(128f, 128f) }, DrawingLevel.LabelLevel);
                        geoCanvas.EndDrawing();

                        // create tile object to maintain current tile information.
                        BitmapTile tile = new BitmapTile(bitmap, cell.BoundingBox, zoomLevel.Scale);


                        tileCache.SaveTile(tile);
                    }
                }

            }
          
           

        
          
        }


        private static Collection<ZoomLevel> GetAllZoomLevels(ZoomLevelSet zoomLevelSet)
        {

            zoomLevelSet = new GoogleMapZoomLevelSet();
            Collection<ZoomLevel> resultZoomLevels = new Collection<ZoomLevel>();
            resultZoomLevels.Add(zoomLevelSet.ZoomLevel01);
            resultZoomLevels.Add(zoomLevelSet.ZoomLevel02);
            resultZoomLevels.Add(zoomLevelSet.ZoomLevel03);
            //resultZoomLevels.Add(zoomLevelSet.ZoomLevel04);
        
            return resultZoomLevels;
        }


Inna,


 Thank you for your sample code and description of the problem. I will discuss this with the Development Team. In the meantime, can you give us some screen shots of what you are seeing with the tiles with wrong row number? Thank you.



 I think screen shots would not help in this case.  


Code that generates tiles is adding a “Cache” word to each tile, but when I am opening a map I don’t see any tiles with “Cache” word.
In addition, tiles are saved to the wrong directory:
For example, tile should be saved to Tiles\Mercator\147647947.5\98\98.png, but instead of, it was saved to Tiles\Mercator\147647947.5\1\40072.png
 
Please see attached folder structure with both types of tiles.

147647947.5.ZIP (297 KB)

Inna,


 Thank you for your additional information. We are looking into this. I will reply to you as soon as we have something concrete.


Thank you.



Inna,


 We tried with the latest build and the caching is happening as expected. Can you get the version 5.5.116.0 or above, please? Thank you.



Val,


 
I installed latest version and same problem occurs.
Meantime, I have another problem with WrapDateLine and offset. 
 
Point on the real world:

 
Same Point on n times of the real world:

 

Please see attached sample code for more details.
 
 
Thanks for your help,
Inna


005_004_003_002_001_TestShapeFile.zip (13.5 KB)

Inna,


 I clearly identified the problem with the point being wrongly offset. I created an issue for the Development Team and I will discuss that with them tomorrow to see when they can get a fix.


 For the cache problem, see attached the structure I have. This seems right to me. Let me know what is wrong and I will pass the problem to the Development Team. Thank you.



Tiles.zip (200 KB)

Val,


Cache problem only happens when I am generating tiles manually using my own  GenerateTiles.Generate function.

Please execute attached sample code from my previous post to see the exact problem.


Inna



Inna,


  I apologize for the delay in responding to this issue. We have been swamped in support issues lately. I am going to need the help of the guys from the Developing team on that one. I have a meeting this afternoon with them. I will let you how it goes.



Inna,


 After reviewing in more depth this post, it shows that there are two issues at stake here:


1) The offset problem with the points in the InMemoryFeatureLayer.


2) The cache issue.


 Please, allow us to work on one issue at a time. We will work on the issue 1 first and then move to the second one. Thank you.