ThinkGeo.com    |     Documentation    |     Premium Support

OpenStreetMap overlay

Hello,


I'm new to the WPF Edition of MapSuite. For now, I'm just trying to create a simple Map with OpenStreetMap as Background.


When I run the application, I get an empty map and it seems that no request are send to OpenStreetMap.


I tried to disable my Windows Firewall, but the map is still empty.


I tried to set a CaccheDirectory, but the map is still empty even if some folders are created by MapSuite in the directory.


I tried with Google in place of OpenStreetMap, and I got the same result.


I tried with the ThinkGeo WorldMapKit (setting degrees as unit and a full world extent), and... it works.


Do I miss something with OpenStreetMap?


My configuration: Windows 7 Pro x64 French, VisualStudio 2010 Ultimate with .NET4, MapSuite WPF Full 4.5.121.


My source code (in the Loaded event handler) :


 


wpfMap1.MapUnit = ThinkGeo.MapSuite.Core.GeographyUnit.Meter;
wpfMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 156, 187, 216));
OpenStreetMapOverlay openStreetMapOverlay = new OpenStreetMapOverlay();
openStreetMapOverlay.CacheDirectory = @"E:\Temp\MapSuiteTemp";
wpfMap1.Overlays.Add("OpenStreetMap", openStreetMapOverlay);
wpfMap1.CurrentExtent = new RectangleShape(-620000, 6720000, 870000, 5120000);
wpfMap1.Refresh();



Hi Nicolas,


 


We couldn't reproduce your issue using your code. The image below is a screenshot for the map. 


 


Could you please follow the list below to check your web connection.


1. Whether you can connect to "openstreetmap.org/"


2. Are there any pictures generated in your cache folder


We'll keep an eye on your feedback.


 


Thanks,


Ivan


 



Hi Ivan,

thanks for your reply.

1. I can access openstreetmap.org successfully

2. There was no images generated in the cache folder. Only subsfolders were created.


But, I restarted my computer yesterday evening, I tried again few minutes ago and now..... everything seems to work fine.


Thank you again


Nicolas


 



Hi Nicolas, 
  
 You’re welcome. Please feel free to ask us any questions while using MapSuite products, we will do our best to assist you. 
  
 Regards, 
 Ivan

Hi Ivan:



Does the CacheDirectory available in the ASP .Net MVC version?



I am trying to add an OpenstreetMapLayer to my map application.  I have two issues:


        
  1. One is the projection, since our feature layer comes from SQL server and it needs a decimal and openstreet map using meters.  I can resolve this by apply the Proj4Projection which can be apply on OpenStreetMap Layer.  But I don’t know how to add the OpenStreetMapLayer to OpenStreetMapOverlay.  Can you give me a few lines of sample code for that?

  2.     
  3. The second issue us cache.  I am not sure if the CacheDirectory is available in the ASP .Net MVC version.  If it does, it seems to me that the CacheDirectory property is only available on the OpenStreetMapOverlay. How do I used in the OpenStreetMapLayer?


Thanks,

Adrian  


Hi Adrian,





It's available in Asp.Net MvcEdition as well, but it shows in another way. But I have a question here that "what's the projection you would like to have for your application? Decimal Degree or Meter?", If the "Decimal Degree" is fine for your application, I suggest you use "Decimal Degree" instead, as projecting the vector data has a much better performance than projecting raster/images. anyway, here are my replies, please check it out:



1. Actually, the OpenStreetMapOverlay is very different from the OpenStreetMapLayer, the OpenStreetMapOverlay is just a wrapper of client JavaScript layer, in other words, all the requests are submitted on client side. while the OpenStreetMapLayer is for server side use, in other words, all the requests occurs on the server side. Here are the codes for using OpenStreetMapOverlay:


OpenStreetMapOverlay osm = new OpenStreetMapOverlay();
map1.CustomOverlays.Add(osm);

and here are the codes for using OpenStreetMapLayer:


LayerOverlay layerOverlay = new LayerOverlay();
map1.CustomOverlays.add(layerOverlay);
 
OpenStreetMapLayer osmLayer = new OpenStreetMapLayer();
layerOverlay.Layers.add(osmLayer);

2. As the OpenStreetMapOverlay is created based on the client side codes, in other others, we are unable to do the projection or cache to this overlay. To take the advantage of cache, we still need to use OpenStreetMapLayer, here is the code:




LayerOverlay layerOverlay = new LayerOverlay();
map1.CustomOverlays.add(layerOverlay);
  
OpenStreetMapLayer osmLayer = new OpenStreetMapLayer();
osmLayer. TileCache = ???
osmLayer.ProjectedTileCache = ???
layerOverlay.Layers.add(osmLayer);



Thanks,

Johnny




Hi Jonny:



Thank you very much for your detailed and to the point reply.  It was very well done.

We do use Decimal Degree since our data in SQL Server is in decimal degree.



Just a follow up question, could you give me some typical values for the TileCache and ProjectedTileCache?



You said that CacheDirectory is available for Asp .Net MVC Edition.  Is this the right way to do it:

LayerOverlay layerOverlay = new LayerOverlay();


map1.CustomOverlays.add(layerOverlay);


layerOverlay.ServerCache.CacheDirectory = @"C:\temp";



Thanks,

Adrian







Hi Adrian,


I think you pointed another option to take use of server cache saved locally, but I would like you to use the cache public on OpenStreetMapLayer instead of LayerOverlay, here are the reasons:


1. The ServerCache of LayerOverlay is a generic property, for OpenStreetMapLayer added to the LayerOverlay, it means the cache of tile images requested from Open Street Map Server, it's not projected.


2.  As mentioned in #1, the ServerCache of LayerOVerlay is not optimized for OpenStreetMapLayer, seems like it's just optimized for FeatureLayer, while the ProjectedTileCache property of OpenStreetMapLayer is optimized for projection. 


Thus, I think a better option is using the code as following:



LayerOverlay layerOverlay = new LayerOverlay();
map1.CustomOverlays.add(layerOverlay);  
 
OpenStreetMapLayer osmLayer = new OpenStreetMapLayer();
osmLayer.ProjectedTileCache = ???
layerOverlay.Layers.add(osmLayer);

 


Thanks,

Johnny