ThinkGeo.com    |     Documentation    |     Premium Support

Yet another Google Overlay related problem?

Hi,


I'm trying to display a MapInfo TAB file on top of either of two Google layers: normal and satellite. Both are of course added to CustomOverlays collection.


I'm able to add the TAB as either a CustomOverlay or in the StaticOverlay collection, but not in the DynamicOverlay collection.


If I try the latter, the solution errs with this JS error: "px is null" on line 780 in opl_GeoResource.axd.


Please advise.


--


Lars I.



Hi again, 
  
 Same error occurs if I include the MapInfo TAB in a LayerOverlay, and set its "IsBaseOverlay" property to False. Leaving it True works. 
  


 


Hi, Lars
I tried to recreate your issue in the following steps:
1.       Add GoogleOverlay to Map.CustomOverlays
2.       Instantiate TabFileFeatureLayer, add it to Map.DynamicOverlay.Layers
3.       Run the sample.
The result seemed to be correct, both the GoogleOverlay and the DynamicOverlay is displayed on the Map control. Since GoogleOverlay has to be the BaseOverlay that set IsBaseOverlay to true, otherwise it won’t be displayed on the Map, and there can be only one BaseOverlay in a Map control, we may not get the correct result if any other Overlay is set as the BaseOverlay besides GoogleOverlay in this case. It makes me confused when you said that “Leaving it True works.” because what happens in my sample is to the contrary, if I set the DynamicOverlay as the BaseOverlay, it won’t be drawn on the Map. You can have a try of the code segment I attached at the end of this post.
Another issue is, you’ve mentioned the JavaScript error, but I couldn’t get it with the TAB file I got in hand, so, could you please provide us one of your samples that have this kind of error? It will be very helpful for us to resolve this issue.
Thanks.
James
Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
Map1.MapUnit = GeographyUnit.Meter;
 
GoogleOverlay google = new GoogleOverlay("Google Map");
google.JavaScriptLibraryUri = new Uri(ConfigurationManager.AppSettings["GoogleUri"]);
google.GoogleMapType = GoogleMapType.Normal;
Map1.CustomOverlays.Add(google);
 
ManagedProj4Projection managedProjection = new ManagedProj4Projection();
managedProjection.InternalProjectionParameters = ManagedProj4Projection.GetEpsgParameters(4326);
managedProjection.ExternalProjectionParameters = ManagedProj4Projection.GetGoogleMapParameters();
TabFileFeatureLayer tabFileFeatureLayer = new TabFileFeatureLayer(MapPath("~/SampleData/world/HoustonMuniBdySamp_Boundary.TAB"), "FID", "OGRSchema", "HoustonMuniBdySamp_Boundary", "GEOMETRY");
tabFileFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = tabFileFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(100, GeoColor.SimpleColors.Green), GeoColor.SimpleColors.Green);
tabFileFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
tabFileFeatureLayer.FeatureSource.Projection = managedProjection;
tabFileFeatureLayer.Open();
Map1.CurrentExtent = tabFileFeatureLayer.GetBoundingBox();
tabFileFeatureLayer.Close();
Map1.DynamicOverlay.IsBaseOverlay = false;
Map1.DynamicOverlay.Layers.Add(tabFileFeatureLayer);
 

 Posted By James on 01-12-2011 03:23 AM 

Since GoogleOverlay has to be the BaseOverlay that set IsBaseOverlay to true, otherwise it won’t be displayed on the Map, and there can be only one BaseOverlay in a Map control, we may not get the correct result if any other Overlay is set as the BaseOverlay besides GoogleOverlay in this case. It makes me confused when you said that “Leaving it True works.” because what happens in my sample is to the contrary, if I set the DynamicOverlay as the BaseOverlay, it won’t be drawn on the Map.




Hi James,


Correct me if I’m wrong in this assumption : There can be multiple base overlays in a map, but only one is shown at any one time.


As for the problem I experienced Tuesday, it seems to have evaporated !???


I can now add my TAB to a LayerOverlay with IsBase=False, and have the overlay switcher display it as an optional checkboxed layer, just as I wanted. Is anything maliciously cached in MapSuite between solution uploads (and if so, how to avoid it) ?


I still have a problem with alternate TAB files throwing an exception, but I’ll follow up on that in the appropriate thread.


However, I do have one other issue with the Google layers, that I’d like to hear your opinion on.


It seems the requested Google Map layer doesn’t display when the solution loads, even though its property IsVisible=True. Only when I switch to Google Sat and back does it render. Must I do something else to make it render initially ?


TIA


 



 


Hi Lars I.
I think James meant to express the same meaning to yours that there is only one shown at any one time, but he missed thing that it allows multiple base overlays which can be set to map control. In WebEdition, there are two kinds of Overlay, one is base overlay which can be seen in OverlaySwitcher with RadioButton before each item, it just display when you select it.  Others are non-base overlay, which normally are the ones which can be changes frequently, such as removing a feature from it, changing the drawing style etc. and show in OverlaySwitcher as a checkbox before it. You can select multiple ones to display.
Sorry that I’m unable to understand the question that “Is anything maliciously cached in MapSuite bettwen solution uploads” clearly, as far as I guessed, do you means there is any cached mechanics in the MapSuite? Yes, the map suit allows us to set server cache to save the tile images on disk or client cache on client side browser, both two are disabled and can be available from the properties of LayerOverlay. Besides these, there isn’t any other cached thing. If I didn’t get you, is it possible to clarify your scenario, so that we can provide better support to you?
Regarding the problem that alternate TAB file throwing an exception, is it possible to send a demo data to us forumsupport@thinkgeo.com ?
For the last issue, a question shows you before the answer, are you using GoogleOverlay or GoogleMapsLayer class? They are different between each other, the first one is created and works on the client, but the later works on server side. Please check whether the loaded overlay is ActiveBaseOverlay of map? Or can you post some demo code about the map setting here? I’m sure it’s caused by some special setting in your application, we haven’t encountered before.
 
Looking forward to your further information. Thanks,
 
Johnny

Hi Johnny,


As I wrote, the TAB problem has apparently disappeared !? That ends my query about caching.


As for the mysterious missing initial Google Maps rendering, I've included the relevant code below.


Curoiusly enough, if I set the satellite imagery to be default, i.e. "...ActiveBaseLayer = ...Last", it does render initially.


And just to avoid misunderstandings: Google Maps does render, but only after switching base maps.


 




Dim g1 As New GoogleOverlay("Google Map")
g1.IsBaseOverlay = True
g1.IsVisible = False
g1.GoogleMapType = GoogleMapType.Normal
g1.JavaScriptLibraryUri = New Uri("maps.google.com/maps/api/js?sensor=false&key=" + GoogleMapsApiKey)
g1.IsVisibleInOverlaySwitcher = True
Map1.CustomOverlays.Add(g1)

Dim g2 As New GoogleOverlay("Google Sat")
g2.IsBaseOverlay = True
g2.IsVisible = False
g2.GoogleMapType = GoogleMapType.Satellite
g2.JavaScriptLibraryUri = New Uri("maps.google.com/maps/api/js?sensor=false&key=" + GoogleMapsApiKey)
g2.IsVisibleInOverlaySwitcher = True
Map1.CustomOverlays.Add(g2)

Map1.ActiveBaseOverlay = Map1.CustomOverlays.First
Map1.ActiveBaseOverlay.IsVisible = True



Hi, Lars


   I’m sorry I can’t reproduce your issue of render initially, I always render initially no matter I set  the first or the last. But I must figure out there was something wrong about the code, we are not recommends you use the ActiveBaseOverlay like this way, you can find out in How Do I Sample, and please check the code below, I made some changes:


 Dim g1 As New GoogleOverlay("Google Map")
' this property default as true
g1.IsBaseOverlay = True
' you don’t need to set this 
'g1.IsVisible = False
g1.GoogleMapType = GoogleMapType.Normal
g1.JavaScriptLibraryUri = New Uri("maps.google.com/maps/api/js?sensor=false&key=" + GoogleMapsApiKey)
g1.IsVisibleInOverlaySwitcher = True
Map1.CustomOverlays.Add(g1)

Dim g2 As New GoogleOverlay("Google Sat")
' this property default as true
g2.IsBaseOverlay = True
' you don’t need to set this 
'g2.IsVisible = False
g2.GoogleMapType = GoogleMapType.Satellite
g2.JavaScriptLibraryUri = New Uri("maps.google.com/maps/api/js?sensor=false&key=" + GoogleMapsApiKey)
g2.IsVisibleInOverlaySwitcher = True
Map1.CustomOverlays.Add(g2)

'you don’t need this, programs will automatically set ActiveBaseOverlay with the last CustomOverlays
'and the Map1.ActiveBaseOverlay.IsVisible didn’t affect the g1 or g2 to Visible
'Map1.ActiveBaseOverlay = Map1.CustomOverlays.First
'Map1.ActiveBaseOverlay.IsVisible = True


Any more questions please feel free to let me know.


Thanks,


James



Hi James,


Ok, your response reveals at least two "gotcha"s.


1.


ActiveBaseLayer defaults to the last added. 


A somewhat curious default value, imho, but taken ad notam.


But how can I make the first added base layer be the default ? Just by setting its IsVisible = true ?


2.


ActiveBaseLayer's IsVisible property doesn't relate to the "active" base layer's IsVisible. 


This is very odd, imho, since the reason for having a Map property named ActiveBaseLayer ought to be to function as a link/shortcut to whatever base layer is currently active and displayed.


What's the point of having a writable ActiveBaseLayer.IsVisible property if it doesn't affect the base layer's IsVisible property ?


And what's the point of having a Map.ActiveBaseLayer property at all, if one cannot use it much the same way I did ?


 


TIA


 



Hi again James, 
  
 Ok, it now displays initially, so my fiddling around with IsVisible was indeed what caused the missing rendering. Thanks. 
  
 And it defaults to first base layer just as I wanted :-) Which seems odd, though, as you said it would default to the last added layer ? 
  


Hi, Lars


    I’m glad it’s working now. But I’m sorry I can’t reproduce the issue of render initially, maybe you can check your browser or your network to Google server?


I checked the source code again, It’s shame that I made a mistake, it added the first layer not the last.


And if you need using the last one be the default, you can set Map1.ActiveBaseOverlay = ap1.CustomOverlays.Last, it will work, but don’t set the IsVisible property.


Any more questions please feel free to let me know.


Thanks,


James



Hi James,


As mentioned in another thread, upgrading the DLL assemblies to version 4.5.101.0 reintroduced this error, so I'm reopening this thread.


After re-reading the thread above, it occurred to me, that you might have changed the functionality after our discussion.


So I tried to re-introduce a previous offending statement in my code:



Map1.ActiveBaseOverlay.IsVisible = True

And it works ! My first Google layer now appears as it should.


Can you confirm that you've changed the functionality around the ActiveBaseOverlay property, so setting it sets the referenced base overlay ?


 



 


Lars,
 
I am glad it works. But we didn’t change the functionality around the ActiveBaseOverlay property. I am curious about this problem. The weird thing is that we never recreate your problem. So could you provide us with a specific sample that can recreate this problem? And which WebEdition version are you using?
 
Thanks,
James

configuration manager does not exist in current context, when I try google overlays

John,


Welcome to join MapSuite forum.


To use ConfigurationManager object, you need to add related namespace like below code:


using System.Configuration;

Thanks,


James



I would like to have google base maps shown when I zoom in. I have a button for zooming in the my area of interest. I get configuration manager does not exist in current context error message. Note that I am not good at VB. So I guess it some thing not well defined.Pleas help. . 
   
 using ThinkGeo.MapSuite.WebEdition; 
 using ThinkGeo.MapSuite.Core; 
 using System; 
 using System.Collections.Generic; 
 using System.Linq; 
 using System.Web; 
 using System.Web.UI; 
 using System.Web.UI.WebControls; 
  
 namespace WebmAP 
 { 
     public partial class _Default : System.Web.UI.Page 
     { 
         protected void Page_Load(object sender, EventArgs e) 
         { 
              if (!IsPostBack) 
              { 
                  // Set the Map Unit. The reason for setting it to DecimalDegrees is that is what the shapefile’s unit of measure is inherently in. 
                  Map1.MapUnit = GeographyUnit.DecimalDegree; 
  
                  // We create a new Layer and pass the path to a Shapefile into its constructor. 
                  ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@“C:\Program Files\ThinkGeo\Map Suite Web Evaluation Edition 4.5\Samples\CSharp Samples\SampleData\World\cntry02.shp”); 
  
                  // Set the worldLayer with a preset Style, as AreaStyles.Country1 has YellowGreen background and black border, our worldLayer will have the same render style.  
                  worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1; 
  
                  // This setting will apply from ZoonLevel01 to ZoomLevel20, that means we can see the world the same style with ZoomLevel01 all the time no matter how far we zoom out/in. 
                  worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level17; 
  
                  ShapeFileFeatureLayer roadLayer = new ShapeFileFeatureLayer(@“C:\Pers_2010\IT_Lessons\MSWeb_ED\shp_files\Roads\Road_arc.shp”); 
                  ShapeFileFeatureLayer.BuildIndexFile(@“C:\Pers_2010\IT_Lessons\MSWeb_ED\shp_files\Roads\Road_arc.shp”); 
  
                  // We can customize our own Style. Here we passed in a color and a size. 
                  roadLayer.ZoomLevelSet.ZoomLevel05.DefaultLineStyle = LineStyles.LocalRoad4; 
                  // The Style we set here is available from ZoomLevel10 to ZoomLevel20. That means if we zoom in a bit out, the appearance we set here will not be visible anymore. 
                  roadLayer.ZoomLevelSet.ZoomLevel05.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level14; 
                  roadLayer.ZoomLevelSet.ZoomLevel15.DefaultLineStyle = LineStyles.LocalRoad3; 
                  // The Style we set here is available from ZoomLevel10 to ZoomLevel20. That means if we zoom in a bit out, the appearance we set here will not be visible anymore. 
                  roadLayer.ZoomLevelSet.ZoomLevel15.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
                   
                  ShapeFileFeatureLayer capitalLayer = new ShapeFileFeatureLayer(@“C:\Program Files\ThinkGeo\Map Suite Web Evaluation Edition 4.5\Samples\CSharp Samples\SampleData\World\capital.shp”); 
                  // We can customize our own Style. Here we passed in a color and a size. 
                  capitalLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.StandardColors.White, 7, GeoColor.StandardColors.Brown); 
                  // The Style we set here is available from ZoomLevel01 to ZoomLevel05. That means if we zoom in a bit more, the appearance we set here will not be visible anymore. 
                  capitalLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level04; 
  
                   
                  capitalLayer.ZoomLevelSet.ZoomLevel05.DefaultPointStyle = PointStyles.Capital3; 
                  capitalLayer.ZoomLevelSet.ZoomLevel05.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level07; 
  
                  ShapeFileFeatureLayer bizLayer = new ShapeFileFeatureLayer(@“C:\Pers_2010\IT_Lessons\MSWeb_ED\shp_files\BIZ\Biz_pts.shp”); 
                  ShapeFileFeatureLayer.BuildIndexFile(@“C:\Pers_2010\IT_Lessons\MSWeb_ED\shp_files\BIZ\Biz_pts.shp”); 
  
                  bizLayer.ZoomLevelSet.ZoomLevel10.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.StandardColors.White, 4, GeoColor.StandardColors.Brown); 
                  bizLayer.ZoomLevelSet.ZoomLevel10.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
                  // We create a new Layer for labeling the capitals. 
                  ShapeFileFeatureLayer capitalLabelLayer = new ShapeFileFeatureLayer(@“C:\Program Files\ThinkGeo\Map Suite Web Evaluation Edition 4.5\Samples\CSharp Samples\SampleData\World\capital.shp”); 
                  ShapeFileFeatureLayer bizLabelLayer = new ShapeFileFeatureLayer(@“C:\Pers_2010\IT_Lessons\MSWeb_ED\shp_files\BIZ\Biz_pts.shp”); 
  
                  // We can customize our own TextStyle. Here we passed in the font, the size, the style and the color. 
                  capitalLabelLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle(“CITY_NAME”, “Arial”, 8, DrawingFontStyles.Italic, GeoColor.StandardColors.Black, 3, 3); 
                  // The TextStyle we set here is available from ZoomLevel01 to ZoomLevel05.  
                  capitalLabelLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level04; 
                   
                  capitalLabelLayer.ZoomLevelSet.ZoomLevel05.DefaultTextStyle = TextStyles.Capital3(“CITY_NAME”); 
                  capitalLabelLayer.ZoomLevelSet.ZoomLevel05.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level10; 
  
                  bizLabelLayer.ZoomLevelSet.ZoomLevel13.DefaultTextStyle = TextStyles.Capital2(“PNMAE”); 
                  bizLabelLayer.ZoomLevelSet.ZoomLevel13.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
                  // As the map is drawn by tiles, it needs to draw on the margin to make sure the text is complete after we joining the tiles together. 
                  // Change the number to another one (for example 0) and you can see the difference. 
                  capitalLabelLayer.DrawingMarginPercentage = 50; 
                  bizLabelLayer.DrawingMarginPercentage = 100; 
  
                  Map1.StaticOverlay.Layers.Add(worldLayer); 
                  Map1.StaticOverlay.Layers.Add(capitalLayer); 
                  // Add the label layer to Map. 
                  Map1.StaticOverlay.Layers.Add(capitalLabelLayer); 
                  Map1.StaticOverlay.Layers.Add(roadLayer); 
                  Map1.StaticOverlay.Layers.Add(bizLayer); 
                  Map1.StaticOverlay.Layers.Add(bizLabelLayer); 
  
  
                  // Set a proper extent for the map, that’s the place you want it to display. 
                  Map1.CurrentExtent = new RectangleShape(5, 40, 40, -26); 
                  // Set the background color to make the map beautiful. 
                  Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean); 
  
              } 
  
         } 
  
         protected void Button1_Click(object sender, EventArgs e) 
         { 
             Map1.CurrentExtent = new RectangleShape(30, 4, 36, -1); 
             if (!Map1.MarkerOverlay.Features.Contains(“Marker”)) 
             { 
                 // Add a new feature as a marker 
                 Map1.MarkerOverlay.Features.Add(“Marker”, new Feature(32.6, 0.4)); 
  
                 // Set the marker style, and make it available all over the zoomlevels. 
                 Map1.MarkerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage = new WebImage("…/…/theme/default/img/marker_blue.gif", 21, 25); 
                 Map1.MarkerOverlay.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level10; 
             } 
  
         } 
  
         protected void Button2_Click(object sender, EventArgs e) 
         { 
             Map1.CurrentExtent = new RectangleShape(32.45, 0.5, 32.7, 0.25); 
             Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean); 
             Map1.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962); 
             Map1.MapUnit = GeographyUnit.Meter; 
  
             GoogleOverlay google = new GoogleOverlay(“Google Map”); 
             google.JavaScriptLibraryUri = new Uri(ConfigurationManager.AppSettings[“GoogleUri”]); 
             google.IsBaseOverlay = false; 
             google.GoogleMapType = GoogleMapType.Hybrid; 
  
             Map1.CustomOverlays.Add(overlay); 
             Map1.CustomOverlays.Add(google); 
  
             Map1.OnClientExtentChanged = “updateZindex”; 
         } 
     } 
 } 


Thanks. I added using System.Configuration and it worked but another issue came up. with overlay not in current context. Where do I have this defined? 
 Map1.CustomOverlays.Add(overlay); 
 Thanks, John

John, 
  
 Where is your sample code from? Maybe you just need to simply remove this line of code. 
  
 Thanks, 
  
 James