ThinkGeo.com    |     Documentation    |     Premium Support

Incorrect display of Google Maps Layer

Hi guys,



I am using MapSuite Desktop 8.0.0.23.



In our application we have a ‘Main’ map in which we display layers and perform edits. In a separate window we have a ‘Page Layout’ view that uses MapSuite’s PrinterLayers to prepare maps for printing. We maintain a link between the ‘Main’ map and the ‘Page Layout’ view so that scale is the same in both views. This works fine for our Shapefiles and SQL Server layers.



Where we have a problem is under the following conditions:


        
  1. We are using a GoogleMapsLayer in the map.

  2.     
  3. We reproject the GoogleMapsLayer into something other than its native coordinate system.

  4.     
  5. We use a larger paper size in the ‘Page Layout’ view (ANSI C, for example).


Under these conditions the extent of the GoogleMapsLayer does not fill the extent of the ‘Page Layout’ MapPrinterLayer. It’s as if the layer is drawing into the extent of the ‘Main’ map instead of the ‘Page Layout’ map.



In addition, when projecting a GoogleMapsLayer into a projection other than SRID (the native one for Google maps) performance is very slow, almost unusable.



I have attached a sample for your amusement. Keep in mind that you will have to supply an API key before the sample can display the GoogleMapsLayer. The key should be added to line 11 of the class ‘CustomGoogleLayer’. I would appreciate any suggestions you have for improving performance.



Thanks!



Steve




 

Hi Steven,



Thanks for the details, but unfortunately, the samples are not attached successfully. would you mind to attach them again so that we can recreate it easily?



Thanks,

Troy

Hi Steven, 
  
 Thanks for the details, but unfortunately, the samples are not attached successfully. would you mind to attach them again so that we can recreate it easily? 
  
 Thanks, 
 Troy

Sorry about that, maybe the filename was too long. Please get the attachment from this post.



Thanks!



Steve

PageLayoutSample_(Google_Map).zip (52.5 KB)

Hi Steven,



We get the attachment now and it’s easy to recreate the issues with it :).

I think I might have some insights on the issue that the print extent is not filled by the layer under NAD83 Zone 16N projection. When I set the breakpoint at checkbox changed event to watch the MapExtent, I got the below result:


Dim r1 As New RectangleShape(501055.518971362, 3584379.37625905, 528802.090839638, 3566072.75377295)
Dim r2 As New RectangleShape(-9681010.71462715, 3813721.28363265, -9653264.14275888, 3795414.66114655)
Dim proj4 As New ManagedProj4Projection()
proj4.InternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(3857)
proj4.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(26916)
proj4.Open()
Dim r3 As RectangleShape = proj4.ConvertToExternalProjection(r2)
’ r3 = 503198.155139915,3582953.55156174,527859.775129161,3566738.70182578

The r1 is printer overlay mapExtent value when we use the NAD83 Zone 16N projection and the r2 is the value under Spherical Mercator.

The r3 is the result after the projection between them. Once we give a correct extent for the maxExtent let’s say r3 for the printer overlay, then the print overlay can be filled fully. So, I think the issue should be located around the line 468 and I think you might be more similar with this part, but I will keep working on it also :

      mGetPageLayoutMap.MapExtent = PageLayoutExtentFromMainMapExtent()

Currently, seems the issue is related with map current extent around line 286:

      Dim oMapExtent As RectangleShape = moMainMap.CurrentExtent



 As for the performance issue which happens on the GoogleLayer projection, I have a feeling that this issue is not easy to fix, so this might need more days I am afraid. Any way, we will keep digging on it.



Thanks,

Troy


Troy,



Thanks for your response.



I’m not really following your logic very well. I can understand where your r1 and r2 are coming from but I don’t see how that fits into a solution.



The way the code sample is supposed to work is that the ‘Main’ map is the ‘master’ map. The scale of the Main map should be independent and the scale of the page layout should be the scale of the Main map. However, the extents should never be the same because of the differences in the sizes of the maps. So my code is attempting to set the extent of the layout map by creating one that has the same center point as the Main map, but extends to the edge of the page layout map. The extent gets bigger without changing the scale. Coordinate differences between the Main map and the layout map should be taken care of by the Projections of each of the layers, which have a common External projection.



For shapefiles this works perfectly, regardless of the coordinate system. It is only the GoogleMaps layer that is causing a problem and I don’t understand why that is.



If your previous post was suggesting a workaround I didn’t quite get it. Could you provide a bit more detail?



Thanks!



Steve

Hi Steve, 
  
 I just want to let you know that we are still working on the issues and I will update here if any news. 
 Thanks for your waiting. 
  
 Troy

Hi Steve,



Thanks for your waiting.
This proved a bug and we have fixed it in the latest version(8.0.44.0 or 8.0.0.44, they might be building now). Please get it and have a try.
One more thing we need to do in the latest dll package is we need to set the "ProjectedTileCache" property of the GoogleMapsLayer layer as Nothing in its constructor. Some codes like:


Public Sub New(oMap As CustomWinFormsMap)
   MyBase.New()
     moMap = oMap
     ProjectedTileCache = Nothing
End Sub

As for the performance of the image projection, I am afraid it is hard to speed up. But an good option is we can enable the tile cache on layerOverlay which only includes the google layer. For instance

        oMainMapOverlay.Layers.Add("google", moGoogleMapsLayer)
        oMainMapOverlay.TileCache = New FileBitmapTileCache("D:\cache", "googleoverlay")



Please let me know if the issues persists.

Thanks,

Troy


Hi Troy, 
  
 Thanks for the fix, the GoogleMapsLayer displays correctly now. 
  
 Please continue your efforts to improve performance when re-projecting the GoogleMapsLayer. 
  
 Thanks! 
  
 Steve

Hi Steve, 
  
 Glad to hear it works and we will continue to improve the performance. 
  
 Thanks, 
 Troy