ThinkGeo.com    |     Documentation    |     Premium Support

Google Maps Hybrid mode without Satellite layer

When setting the Google Maps overlay to GoogleMapType.Hybrid, it is really just requesting an extra layer of tiles to put on top of GoogleMapType.Satellite. Is there a way to only display the street and label tiles?


Here is the scenario:

We have access to local Aerrial photography that is higher quality and more up to date than Google Maps Satellite layer. We want to display our imagery with Googles streets and labels on top.


 



Rob, 
  
 It seems that there is a type “G_AERIAL_HYBRID_MAP”, but there is something wrong with that server some time. Details can be available at code.google.com/apis/maps/documentation/reference.html#GMapType.G_MAPMAKER_HYBRID_MAP. Anyway, this is the only way that we can try. Below is the client method: 
 Map1.SetCurrentBackgroundMapType(G_AERIAL_HYBRID_MAP) 
  
 Thanks,  
 Johnny 


G_AERIAL_HYBRID_MAP type is not what I am looking for. It is bringing in both Google’s new Aerial layer AND streets and labels for it on top. I am looking to use G_HYBRID_MAP, but only display the streets and labels. I have my own imagery to display, so I don’t want to see Google’s Satellite imagery. If you check out the tile files in your cache, you will see that the streets and labels come in as separate images.

hi,



I'm sure you just want to require the google streets and labels that will lay on your own imagery. G_HYBRID_MAP is an combination of G_SATELLITE_MAP and G_AERIAL_HYBRID_MAP.  The attach is my test with  G_AERIAL_HYBRID_MAP, whose requst just returns an image including street lines and lables.



 










All the Google Map types can be available from code.google.com/apis/maps/do...HYBRID_MAP .



thanks,


Johnny,



G_HYBRID_MAP is NOT a combo of G_SATELLITE_MAP and G_AERIAL_HYBRID_MAP. 
  
 G_HYBRID_MAP is a combo of G_SATELLITE_MAP and streets/labels 
 G_AERIAL_HYBRID_MAP is a combo of G_AERIAL_MAP and streets/labels 
 G_AERIAL_MAP is a new layer with imagery only in certain cities (San Diego, CA is one) 
  
 You are seeing only street/labels layer since you are zoomed out so far. Zoom into an area with imagery, and you will see both layers. (San Diego = 32.7153292, -117.1572551). Try out all the different map types at this location to see the difference in them. 
  
 Also, the streets/labels are different between G_HYBRID_MAP and G_AERIAL_HYBRID_MAP. The AERIAL ones are projected differently or something to account for viewing angle. I want the ones that G_HYBRID_MAP uses.

 


Rob,
 
Sorry I didn’t notice there is an area with imagery in San Diego. The Google Map JavaScript library is used in the WebEdtion to require the Google map images. It just can require kinds of map types supported in the library only, but there is no type for street/labels only. I also post the question to Google Map Help Forum, but the answer is unlucky.
 
I noticed there is one street/label layer on the Google’s Satellite imagery for “G_HYBRID_MAP” type, and the request Uri is like mt1.google.com/vt/lyrs=h@119&hl=en&src=api&x={x}&y={y}&z={z}&s=Gali . Maybe we can assemble the Uri for each tile like that, but it will be a copyright problem, so we can’t do it in that way.
 
Any question please let us know, thanks.
 
Johnny

Shouldn’t need to construct any URLs. Both the Satellite and streets/labels are already being retrieved once I set G_HYBRID_MAP. Just need to hide the satellite tiles.

Rob,


Thanks for giving so good idea. please have a look at the attached sample, i think that's what you want.


Thanks again.


Johnny



1860-Google_Overlay.zip (1.78 KB)

Perfect! Thanks. How were you able to track that down?

Rob, 
  
 Firebug is a good choice to track the THML Dom tree, which will show us which DIV contains the imagery accurately. 
  
 Thanks, 
  
 Johnny

Is it possible to put a LayerOverlay underneath a GoogleOverlay? I can’t seem to get it working.

Rob,


Please have a look at the attached sample.


Thanks,


Johnny



1871-GoogleMap.zip (119 KB)

By setting both overlays IsBaseOverlay to false, this creates a bug in Map1.SetCurrentBackgroundMapType(). Internally, it calls this.GetCurrentBaseLayer() to find the GoogleOverlay, but that is returning the LayerOverlay. You can see what I’m talking about by adding a button that calls Map1.SetCurrentBackgroundMapType(G_SATELLITE_MAP) and stepping through the code. 



I can work around this by calling the following code instead. I am still worried that there are other functions affected by having no base layer, or by having something under the GoogleOverlay. 


var layer = olMap.getLayersByName(‘Google Map’)[0];
layer.type = gMapType;  // G_SATELLITE_MAP
layer.setMapType();

UPDATE:
I also found that calls to Map1.ResetLayerZIndex() [SetDrawMode()] conflicts with the zIndex of 330 in the sample. It puts the LayerOverlay on top. Add a button that calls Map1.SetDrawMode(‘Normal’) to see the problem. I’m sure there are more problem areas.

Rob, 
  
 We can set the Overlay like in the sample “LayerOverlay” to the base ovelay and let it lay under the Google Street/label layer. I did a test and proved it works fine.  
  
 I think there is no problem with your workaround, because the implementation of SetCurrentBackgroundMapType is similar to yours.  
  
 I did a simple test with “DrawEditShape.aspx” and the sample I have attached, but all works fine. Please make the LayerOverlay as the base overlay if it still run into error. 
  
 Thanks, 
  
 Johnny 


On your DrawEditShape.aspx modified sample, make sure you are using a version that includes the call to this.ResetLayerZIndex() from Map1.SetDrawMode(). That is what causes problems. It was a fix to marker events getting lost (coincidentally, a fix for me). I don't know when it got introduced, but I am on 3.1.406


UPDATE: I also found that InMemoryMarkerOverlays show up underneath GoogleOverlay, even though it is the last item in the CustomOverlays collection. This of course keeps the mouseover event from working



Have you been able to duplicate the problem in 3.1.406 or newer? It should occur in ResetLayerZIndex()… and put the overlays in the wrong order. Same for markers. 
  


Rob, 
  
 Sorry for the delay. I think we still need to update the Z-index again after ResetLayerZIndex(), also just as you said, there are some issues with ResetLayerZIndex. I will track the issue down, then give you the solution as soon as possible. 
  
 thanks, 
  
 Johnny

 


Rob,
 
I checked the ResetZIndex method, I think it has some issues under your requirements, but is correct in normal. I also tried to overwrite the ResetZIndex to meet your requirement, but failed. Here is the reason:
 
In Openlayers, the layers are rendered by group. In other word, all the wms layers like the wmsOverlay, InMemoryFeatureLayer etc are included in a wms container, which has the same Dom level to google layer. Here is the Dom tree screenshot:
 
 
In the screenshot, the “Map1_OpenLayers_Container” and Google are at the same level, but all the wms layers described above are included in the “Map1_Openlayers_Container”, we can change the z-index of each layer in it, but unable to make one is above the Google layer, others are bottom of the google layer.

Thanks,


Johnny



I think I can live without having Google sandwiched between LayerOverlays, but I would really like to be able to have Google between Markers and LayerOverlays. Is there a way to hack the markers out of the Map1_OpenLayers_Container?

Rob, 
  
 It’s hard to do that, which requires a very big changes of OpenLayers logic, for instance, we need to overwrite the moveTo function of OpenLayer.Map, enable OpenLayers.Marker class inherited from OpenLayers.EventPanel etc etc. Also we will be not sure whether there is some other issues exist if we overwrite lots of functions. Sorry that we unable to give you the solution. 
  
 Thanks, 
  
 Johnny