ThinkGeo.com    |     Documentation    |     Premium Support

Converting decimal degrees to meters for use with GoogleMapOverlay

I'm using the trial WPF desktop version of map suite and am evaluating using Google Maps data. GoogleMapOverlay requires the Geograpy Units to be in meters so my questions are:


1) What projection is GoogleMapOverlay displaying? UTM?


2) I've looked for a conversion library for this but have found none, however I've read in other post where there is a MapSuiteProjection library that helps with conversions, where can I get this? Do I need to write my own conversion?



Ben,


See my answers:


1) The projection used for Google Map is Spherical Mercator as you can see in the Spatial Reference web site spatial-reference.org/ref/sr-org/6627/


In Map Suite, this is ManagedProj4Projection.GetGoogleMapParametersString(). But, if you are only displaying a GoogleMapsOverlay, you need to set the MapUnit of the map to meters because this is the unit used for that projection.


2) To convert from Decimal Degrees (Lat/Long or WGS84), you need to use ConvertToExternalProjection function of ManagedProj4Projection.


To recap everything, please, look at the code below where I do something very simple. I have a GoogleMapsOverlay and I display a point after converting it from decimal degrees to Spherical Mercator (Google Map projection).


I also suggest you look at some Code Community samples that deals with projection issues and Background Maps (Google, Bing etc)


wiki.thinkgeo.com/wiki/Map_Suite_Wp...c)_Samples


wiki.thinkgeo.com/wiki/Map_Suite_Wp...on_Samples


 


 



    wpfMap1.MapUnit = GeographyUnit.Meter;
    wpfMap1.CurrentExtent = new RectangleShape(-14180662, 5547256, -7832569, 1777465);

    GoogleMapsOverlay googleMapsOverlay = new GoogleMapsOverlay();
    wpfMap1.Overlays.Add(googleMapsOverlay);

    ManagedProj4Projection proj4 = new ManagedProj4Projection();
    proj4.InternalProjectionParameters = ManagedProj4Projection.GetWgs84ParametersString();
    proj4.ExternalProjectionParameters = ManagedProj4Projection.GetGoogleMapParametersString();

    double Longitude = -96.80;
    double Latitude = 33.50;

    proj4.Open();
    Vertex googleMapVertex = proj4.ConvertToExternalProjection(Longitude, Latitude);
    proj4.Close();

    InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();
    inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.StandardColors.Red, 12);
    inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

    inMemoryFeatureLayer.InternalFeatures.Add(new Feature(googleMapVertex));

    LayerOverlay dynamicOverlay = new LayerOverlay();
    dynamicOverlay.Layers.Add("PointsLayer",inMemoryFeatureLayer);
    wpfMap1.Overlays.Add("DynamicOverlay", dynamicOverlay);
    

    wpfMap1.Refresh();


And this is the result of running that code:




Thanks! That's exactly what I was looking for! Also is there a way when using the Google Map data to make the image information and Google logo appear just once at the bottom instead of on the bottom of each row of images?



Ben, 



I am not sure about having the Google logo only on the bottom of the map. I passed this post to the development team, I think they should know more exactely about this. And we should hear from them tomorrow. 



I am glad we have your projection issue resolved.



Ben, 
  
 GoogleMapsOverlay will send multi requests to get multi tiles and combine them together and show on our map. 
  
 Right now, you are at free-user mode so that each tile includes Google logo. If you are premier user of Google Maps, you can set Client Id and Private Key to GoogleMapsOverlay, the tile will not include logo any more. And then you can create a LogoAdornmentLayer to show only one Google logo image at the bottom of map. 
  
 Hope it will help you. 
  
 Thanks, 
 James 


Thanks for the explanation James, 
  
 I’m also seeing the behavior where not all tiles will load when using the GoogleMapOverlay. Is this because of my user priority level? 
  
 Ben

Ben, 
  
 I don’t think it’s because of your user priority level. Could you provide a simple sample to show this problem? 
  
 Thanks, 
 James

 Sorry it took so long to reply.  Attached is an image of my issue.  I'm just trying to load the google map data and it appears to never finish loading. Seems to happen mainly when moving between zoom levels.


Thanks


Ben



mapTileIssue.JPG (68.6 KB)

Ok, so it seems the source of this problem is I'm receiving 403 forbidden exceptions up from your library.  We are evaluating this for use with Google Map data so if this is a problem that could be quickly fixed we would still be interested in possibly using map suite.



 so after thinking about this for a bit I've got some ideas... just throwing ideas out there so these may be incorrect.  It seems that this data load problem is happening after fast zoom or pan, and then it seems we are denied service to the Google map data servers for a period of time.  Could this be the result of too many/simultaneous request to the server and ending up with our IP getting flagged. Maybe this is caused by the multi-threading which could be the cause of too many request? Again, I'm just throwing out ideas. If we could solve this problem it would definately make Map Suite our favorite mapping API we've evaluated. If you would like to see the sample code i'm using let me know and I'll be glad to upload it.



Ben, 
  
 I think your conjecture is probably right, I know GoogleMaps Static API have some usage limits, it is subject to a query limit of 1000 unique (different) image requests per viewer per day. For detail information please look at: 
 code.google.com/apis/maps/documentation/staticmaps/#Limits 
  
 To reduce this problem, you may use SingleTile mode to test, so you can apply to premier user of Google Maps. 
  
 Thanks, 
 James