ThinkGeo.com    |     Documentation    |     Premium Support

OpenStreetMapLayer and WrapDateLine

Hello,



When I’m using OpenStreetMapLayer with WrapDateLine option, there is a gap around 180.







Here is my code. Am I missing something?


private void Window_Loaded(object sender, RoutedEventArgs e)
       {
           wpfMap1.MapUnit = ThinkGeo.MapSuite.Core.GeographyUnit.Meter;
           wpfMap1.ZoomLevelSet =new  OpenStreetMapsZoomLevelSet();
 
           LayerOverlay worldOverlay = new LayerOverlay();
           worldOverlay.WrappingMode = WrappingMode.WrapDateline;
           wpfMap1.Overlays.Add(worldOverlay);
 
           OpenStreetMapLayer layer = new OpenStreetMapLayer();
           worldOverlay.Layers.Add(layer);
 
           wpfMap1.Refresh();
 
       }



Thanks,

Inna




Hi Inna, 
  
 Adding the MaxExtent should fix it, please try the codes: 
  
 worldOverlay.MaxExtent = new RectangleShape(-20037508, 20037508, 20037508, -20037508); 
  
 Please let us know if it helps. 
 Thanks, 
 Troy

Hi Troy, 
  
 Unfortunately it does not help me. I need wrapping option, but setting MaxExtent disables it. 
  
 I can set worldOverlay.MaxExtent = new RectangleShape(-20037508*5, 20037508, 20037508*5, -20037508), but then I cannot pan indefinitely. 
  
  
  
 Inna

Hi Inna,



Please try the code shown as following:




        private void WpfMap_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = ThinkGeo.MapSuite.Core.GeographyUnit.Meter;
            Map1.ZoomLevelSet = new OpenStreetMapsZoomLevelSet();



            LayerOverlay worldOverlay = new LayerOverlay();
            worldOverlay.WrappingMode = WrappingMode.WrapDateline;
            worldOverlay.WrappingExtent = new RectangleShape(-20037508, 20037508, 20037508, -20037508);
            worldOverlay.MaxExtent = new RectangleShape(-20037508 * 5, 20037508, 20037508 * 5, -20037508);
            Map1.Overlays.Add(worldOverlay);



            OpenStreetMapLayer layer = new OpenStreetMapLayer();
            worldOverlay.Layers.Add(layer);



            Map1.CurrentExtent = new RectangleShape(-20037508, 20037508, 20037508, -20037508);



            Map1.Refresh();
        }



Thanks,



Johnny

Hi Johnny,



It works as a workaround, but is it possible to incorporate the fix in the next release? I believe that other people would be interested in the same fix…



Anyway, there is a same issue when I’m trying to pre-generate map tiles using CacheGenerator example for OSM. 



Please see attached.






Inna

CacheGenerator.zip (22.9 KB)

Hi Inna, 
  
 Thanks for your suggestion, but I will enter it to our internal issue tracking system to see if there will be a better and smooth solution for it, hope it can be fixed in next release. 
   
 For pre-generate map tiles using CacheGenerator of OSM, I guess this should be caused by WrapDateline, because the OpenStreetMapLayer doesn’t support WrapDateLine, I guess this should be a miss in Map Suite, to cache the tiles across the WrapDateLine, please use the TileCache of LayerOverlay instead. 
  
 Thanks, 
 Johnny 


Hi Johnny, 
  
 What do you mean by “please use the TileCache of LayerOverlay instead”. Could you please give me an example? 
  
  
 Inna

Hi Inna, 
  
 I think it means we enable the TileCache property on the LayerOverlay in your application and then generate the tiles on the fly. Like Johnny mentioned above, we will try to fix the white line around the dateline issue. 
  
 Sorry for the inconveniences. 
 Troy

Hi Troy, 
  
  
 In my project I need an option to pre-generate tiles based on OpenStreetMap, simply generating tiles on the fly does not help me.   
 Is there any workaround I can make until you fix the issue on your side? 
  
  
 Inna

Hi Inna,



Just as I mentioned earlier,  I guess we are unable to use the TileCacheGenerator to create the tile cache around the WrapDateLine, the workaround is using the code as following to create the tile caches around WrapDateLine:


LayerOverlay worldOverlay = new LayerOverlay();
worldOverlay.WrappingMode = WrappingMode.WrapDateline;
worldOverlay.WrappingExtent = new RectangleShape(-20037508, 20037508, 20037508, -20037508);
worldOverlay.MaxExtent = new RectangleShape(-20037508 * 5, 20037508, 20037508 * 5, -20037508);
Map1.Overlays.Add(worldOverlay);
 
OpenStreetMapLayer layer = new OpenStreetMapLayer();
worldOverlay.Layers.Add(layer);
 
worldOverlay.TileCache = new FileBitmapTileCache(@"E:\Cache""tileCache");
RectangleShape cacheExtent = new RectangleShape(); // give a cache extent
Collection<BitmapTile> tiles = worldOverlay.TileCache.GetTiles(cacheExtent);
foreach (var tile in tiles)
{
    worldOverlay.TileCache.SaveTile(tile);
}

 Thanks,

Johnny