ThinkGeo.com    |     Documentation    |     Premium Support

Overlay of Bing Maps doesn't seem to work

I am trying to get a Bing Maps overlay working.  Below is my code.  When it runs I see it creates BingMapsMetadata.xml in my C:\Temp folder but the code throws an error of "Parameter is not valid".  The example out there are very lacking when it comes to the overlays.   What am I missing here?




mapCtrl.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
mapCtrl.MapResizeMode = MapResizeMode.PreserveScaleAndCenter
 
mapCtrl.MapUnit = GeographyUnit.DecimalDegree
mapCtrl.BackgroundOverlay.BackgroundBrush = New GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)
mapCtrl.CurrentExtent = New RectangleShape(-75.412903, 41.409776, -73.979187, 38.826871)
 
Dim applicationID As String "123456789"
Dim cacheDirectory As String "C:\Temp"
Dim bingMapsLayer As New BingMapsLayer(applicationID, BingMapsMapType.Road, cacheDirectory)
 
Dim staticOverlay As New LayerOverlay()
staticOverlay.Layers.Add("WorldLayer", bingMapsLayer)
mapCtrl.Overlays.Add(staticOverlay)
 
simpleMarkerOverlay = New SimpleMarkerOverlay()
simpleMarkerOverlay.MapControl = mapCtrl
 
simpleMarkerOverlay.DragMode = MarkerDragMode.Drag
 
mapCtrl.Overlays.Add("SimpleMarker", simpleMarkerOverlay)
 
mapCtrl.Refresh()


Hi Dave, 
  
 The reason is BingMap is based on meter but you set that under decimal degree. 
  
 I modified your code, please try that as below: 
  
  winformsMap1.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            winformsMap1.MapResizeMode = MapResizeMode.PreserveScaleAndCenter;

            winformsMap1.MapUnit = GeographyUnit.Meter;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            RectangleShape rect = new RectangleShape(-75.412903, 41.409776, -73.979187, 38.826871);

            ManagedProj4Projection proj4 = new ManagedProj4Projection();
            proj4.InternalProjectionParametersString = ManagedProj4Projection.GetDecimalDegreesParametersString();
            proj4.ExternalProjectionParametersString = ManagedProj4Projection.GetBingMapParametersString();
            proj4.Open();

            winformsMap1.CurrentExtent = proj4.ConvertToExternalProjection(rect) as RectangleShape;

            String applicationID = "123456789";
            String cacheDirectory = @"D:\Temp";
            BingMapsLayer bingMapsLayer = new BingMapsLayer(applicationID, BingMapsMapType.Road, cacheDirectory);

            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add("WorldLayer", bingMapsLayer);
            winformsMap1.Overlays.Add(staticOverlay);

            SimpleMarkerOverlay simpleMarkerOverlay = new SimpleMarkerOverlay();
            simpleMarkerOverlay.MapControl = winformsMap1;

            simpleMarkerOverlay.DragMode = MarkerDragMode.Drag;

            winformsMap1.Overlays.Add("SimpleMarker", simpleMarkerOverlay);

            winformsMap1.Refresh(); 
 
  
 Regards, 
  
 Don

So, I’ve been able to get BingMaps, GoogleMaps, and OpenStreetMaps overlays working.  Below is in my Form_Load. I am having a problem though…


mapCtrl.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
mapCtrl.MapResizeMode = MapResizeMode.PreserveScaleAndCenter
 
mapCtrl.MapUnit = GeographyUnit.Meter
mapCtrl.BackgroundOverlay.BackgroundBrush = New GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)
Dim extent As RectangleShape = New RectangleShape(-75.412903, 41.409776, -73.979187, 38.826871)
 
projection = New ManagedProj4Projection()
projection.InternalProjectionParametersString = ManagedProj4Projection.GetDecimalDegreesParametersString
projection.ExternalProjectionParametersString = ManagedProj4Projection.GetGoogleMapParametersString
projection.Open()
 
staticOverlay = New LayerOverlay()
 
mapCtrl.CurrentExtent = TryCast(projection.ConvertToExternalProjection(extent), RectangleShape)
 
‘*** FOR BING MAPS OVERLAY ***
Dim applicationID As [String] = "ApybeJoyFOof1tKRVLmjxrsp3V093oNpfFXdoqrTfQvYWlAERNCHtfr40Qf_l0W3"
Dim cacheDirectory As [String] = TEMP_PATH
Dim bingMapsLayer As New BingMapsLayer(applicationID, BingMapsMapType.Road, cacheDirectory)
 
staticOverlay.Layers.Add(“WorldLayer”, bingMapsLayer)
’*** END BING MAPS OVERLAY ***



mapCtrl.Overlays.Add(staticOverlay)

 
simpleMarkerOverlay = New SimpleMarkerOverlay()
simpleMarkerOverlay.MapControl = mapCtrl
simpleMarkerOverlay.DragMode = MarkerDragMode.Drag
mapCtrl.Overlays.Add(“SimpleMarker”, simpleMarkerOverlay)
 
mapCtrl.Refresh()

Where I am running into the issue is how to convert my code that sets the marker point. Previously I was set for DecimalDegrees and was using WorldMapKitWmsDesktopOverlay. I’ve switched to Meters so we can use the overlays.  However we store everything in Decimal Degrees.



How can I convert the CentroidPoint to Meters and render the marker in the correct location?


Private Sub AddSearchResultMarkerWithToolTip(matchItem As GeocoderMatch, multiPointShape As MultipointShape)
    Dim point As New PointShape(matchItem.NameValuePairs(“CentroidPoint”))
    Dim marker As New Marker(point)
    marker.Image = My.Resources.marker
    marker.ToolTipText = GetToolTip(matchItem)
    multiPointShape.Points.Add(point)
    simpleMarkerOverlay.Markers.Add(marker)
End Sub


Hi Dave, 
  
 You can use the ManagedProj4Projection class to convert between any two projections. 
  
  ManagedProj4Projection proj4 = new ManagedProj4Projection(); 
             proj4.InternalProjectionParametersString = ManagedProj4Projection.GetDecimalDegreesParametersString(); 
             proj4.ExternalProjectionParametersString = ManagedProj4Projection.GetBingMapParametersString(); 
             proj4.Open(); 
  
  
 You should want to convert your location based on decimal degree to meter when you create it to a marker. 
  
 Regards, 
  
 Don

I tried this several times yesterday with no luck.  My point shows in South America instead of New Jersey and the Extent call breaks and the map is now off the screen.


Private Sub AddSearchResultMarkerWithToolTip(matchItem As GeocoderMatch, multiPointShape As MultipointShape)
    Dim point As New PointShape(matchItem.NameValuePairs("CentroidPoint"))
 
    Dim proj4 As New ManagedProj4Projection()
    proj4.InternalProjectionParametersString = ManagedProj4Projection.GetDecimalDegreesParametersString
    proj4.ExternalProjectionParametersString = ManagedProj4Projection.GetBingMapParametersString
    proj4.Open()
 
    Dim correctedPoint As PointShape = TryCast(proj4.ConvertToExternalProjection(point), PointShape)
 
    Dim marker As New Marker(correctedPoint)
    marker.Image = My.Resources.marker
    marker.ToolTipText = GetToolTip(matchItem)
    multiPointShape.Points.Add(correctedPoint)
    simpleMarkerOverlay.Markers.Add(marker)
 
    proj4.Close()
 
End Sub


Hi Dave, 
  
 Please paste one of your point location for decimal degree and the extent for decimal degree and meter, I will have a look at what’s make it won’t shows. 
  
 Regards, 
  
 Don

Hey Don, I think I figured it out.



After My marker is plotted in the AddSearchResultMarkerWithToolTip method, I return back to my main call with the multiPointShape and here is where I set the new extent.  Only problem is that I was reconverting again. (See below)


If multiPointShape.Points.Count > 0 Then
    mapCtrl.CurrentExtent = TryCast(projection.ConvertToExternalProjection(multiPointShape.GetBoundingBox()), RectangleShape)
End If

After I changed it to the code below it works fine.  It was mainly a conversion mistake when I converted my app from using Decimal to Metric so I could use overlays.


If multiPointShape.Points.Count > 0 Then
    mapCtrl.CurrentExtent = multiPointShape.GetBoundingBox()
End If


Hi Dave, 
  
 Thanks for your update. I am glad to hear that works for you. 
  
 Any question please let us know. 
  
 Regards, 
  
 Don