ThinkGeo.com    |     Documentation    |     Premium Support

Object Reference not set to an instance of an object when adding layers

Hi there,


I urgently need help to try and get the mapping up and running here!  I am trying to use code converted from the desktop version of the Mapsuite product and incorporate it into the web version.


I have a problem with any code that I seem to use to try to dynamically add layers to a map control.  All I seem to get is a grid of pink bordered tiles with a message stating "Object Reference not set to an instance of an object " below it.  Using either the code I am using in my app or the one from your example application fail to load with the same result.  I am using VS2008 here.



Also, I am having issues displaying markers on a map populated from a database in a way that won't cause a severe performance hit (using java to update the map currently but coupled to a windows standard timer is causing issues).  Different issue which may require another post, but I would really appreciate if anyone has any sample code that could actually work and get me up and running on any map, whether the base map is a web based one (google),  Mr. Sid, other raster type map.\


Best regards,

Bob


Example Code:


 


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If (Not Page.IsPostBack) Then

            Map1.MapBackground.BackgroundBrush = New GeoSolidBrush(GeoColor.StandardColors.White)

            Map1.CurrentExtent = New RectangleShape(-80.5, 68.9, 80, -60.43)

            Map1.MapUnit = GeographyUnit.DecimalDegree



            Dim gdiPlusImageLayer As New GdiPlusRasterLayer(MapPath("~\Maps\Map1.jpg"))

            gdiPlusImageLayer.UpperThreshold = Double.MaxValue

            gdiPlusImageLayer.LowerThreshold = 0

            Map1.StaticOverlay.Layers.Add(gdiPlusImageLayer)



            ' The following two lines of code enable the client and server caching.   

            ' If you enable these features it will greatly increase the scalability of your   

            ' mapping application however there some side effects that may be counter intuitive.   

            ' Please read the white paper on web caching or the documentation regarding these methods.   



            ' Map1.StaticOverlay.ClientCache.CacheId = "WorldOverlay"  

            ' Map1.StaticOverlay.ServerCache.CacheDirectory = MapPath("~/ImageCache/" + Request.Path)   

        End If



    End Sub

End Class


 


Code I am using:




    Private Sub Open_Raster_Map(ByVal MpPath As String)



            If mapOverlay.Layers.Contains(MapPath(MpPath)) Then

                mapOverlay.Layers.Remove(MapPath(MpPath))

            End If



            tgMap.MapUnit = GeographyUnit.DecimalDegree



            Dim mapLayer As New GdiPlusRasterLayer(MapPath(MpPath))

            mapLayer.UpperThreshold = Double.MaxValue

            mapLayer.LowerThreshold = 0



            'tgMap.BackgroundOverlay.IsVisible = False



            mapLayer.Name = MapPath(MpPath)

            mapLayer.Open()



            mapOverlay.Layers.Add(MapPath(MpPath), mapLayer)



            tgMap.CurrentExtent = GetFullExtent()

            tgMap.CustomOverlays.Add(mapOverlay)




            'tgMap.Refresh()



    End Sub





Bob, 
  
 Thanks for your description.  The pink tile may cause by the configuration of your map such as styles, shape file path or data. If possible, please provide us a simple sample with you data. If the sample is too big to paste here; please send to support@ThinkGeo.com and forward to me. 
  
 On the other hand, markers are all client stuff so that the more markers on the client side the more DOM tree maintains  the lower the performance you gain. I’m not sure which marker overlay do you use. If you have many markers display at the same time, we recommend setting SuppressGridSize property on InMemoryMarkerOverlay or FeatureSourceMarkerOverlay which suppress markers which are too close together. 
  
 Currently we are planning to add cluster marker which will be better. 
  
 Hope it makes sense. Looking forward your sample. 
  
 Thanks, 
 Howard

Hi Howard,


Thanks for your response!  I have attached the map I was trying to use here.  Also the code I am using is below.

As you can see, I've tried code from a few different places to make the maps I am using work but to no avail.


With regards to the markers, I would like to be able to load all markers from a database, populate them on a layer

and then apply that to the map.  Whatever way is the most efficient (and fastest) method to populate a map with

several hundred objects.  Keep in mind I need to be able to populate them from a database and also allow for

text entries describing each object to be displayed when the user hovers over them with the mouse cursor.


I just need a concrete example that works because I am getting myself all confused.  The idiosyncrasies of the 

control, some of which I've been able to work around haven't helped either.


Bob


Private Sub Open_sid_map(ByVal MpPath As String)


  Try


   If mapOverlay.Layers.Contains(Server.MapPath(MpPath)) Then

    mapOverlay.Layers.Remove(MpPath)

   End If


   'tgMap.MapBackground.BackgroundBrush = New GeoSolidBrush(GeoColor.StandardColors.White)

   'tgMap.CurrentExtent = New RectangleShape(-80.5, 68.9, 80, -60.43)

   'tgMap.MapUnit = GeographyUnit.DecimalDegree


   'Dim mapLayer As New MrSidRasterLayer(Server.MapPath(MpPath))

   'mapLayer.UpperThreshold = Double.MaxValue

   'mapLayer.LowerThreshold = 0


   ''tgMap.BackgroundOverlay.IsVisible = False


   ''mapLayer.Name = Server.MapPath(MpPath)

   ''mapLayer.Open()


   ''mapOverlay.Layers.Add(Server.MapPath(MpPath), mapLayer)


   ''tgMap.CurrentExtent = GetFullExtent()

   'tgMap.StaticOverlay.Layers.Add(mapLayer)


   'Dim mapLayer As New MrSidRasterLayer(Server.MapPath(MpPath))

   'mapLayer.UpperThreshold = Double.MaxValue

   'mapLayer.LowerThreshold = 0


   ''tgMap.BackgroundOverlay.IsVisible = False


   'mapLayer.Name = Server.MapPath(MpPath)

   'mapLayer.Open()


   'mapOverlay.Layers.Add(Server.MapPath(MpPath), mapLayer)


   ''tgMap.CurrentExtent = GetFullExtent()

   'tgMap.CustomOverlays.Add(mapOverlay)


 


   tgMap0.MapBackground.BackgroundBrush = New GeoSolidBrush(GeoColor.StandardColors.White)

   tgMap0.CurrentExtent = New RectangleShape(-80.5, 68.9, 80, -60.43)

   tgMap0.MapUnit = GeographyUnit.DecimalDegree


   Dim sidImageLayer As MrSidRasterLayer = New MrSidRasterLayer(MpPath)

   sidImageLayer.UpperThreshold = Double.MaxValue

   sidImageLayer.LowerThreshold = 0

   tgMap0.StaticOverlay.Layers.Add(sidImageLayer)


  ''Dim markerOverlay As New InMemoryMarkerOverlay("MarkerOverlay")

   ''tgMap.CustomOverlays.Add(markerOverlay)


 Catch ex As Exception

   Stop

  End Try

  'tgMap.refresh()


 End Sub


 Private Sub Open_jp2_map(ByVal MpPath As String)


  If mapOverlay.Layers.Contains(MpPath) Then

   mapOverlay.Layers.Remove(MpPath)

  End If


  tgMap0.MapUnit = GeographyUnit.DecimalDegree


  Dim mapLayer As New Jpeg2000RasterLayer(MpPath)

  mapLayer.UpperThreshold = Double.MaxValue

  mapLayer.LowerThreshold = 0


  'tgMap0.BackgroundOverlay.IsVisible = False


  mapLayer.Name = MpPath

  mapLayer.Open()


  mapOverlay.Layers.Add(MpPath, mapLayer)

  tgMap0.CustomOverlays.Add(mapOverlay)


  'tgMap.CurrentExtent = GetFullExtent()


  'tgMap.Refresh()


 End Sub



1288-Map.zip (163 KB)

Bob, 



We used your data to implement a simple sample and it works fine. Please try our code in a new project. If there is any misunderstanding, please provide a project which we can recreate your issue easily; because your attached code cannot work on our end.


tgMap.MapBackground.BackgroundBrush = New GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)
tgMap.MapUnit = GeographyUnit.DecimalDegree
tgMap.CurrentExtent = New RectangleShape(-80.5, 68.9, 80, -60.43)

Dim gdiPlusImageLayer As GdiPlusRasterLayer = New GdiPlusRasterLayer(MapPath("~\SampleData\Erin.jpg"))
gdiPlusImageLayer.UpperThreshold = Double.MaxValue
gdiPlusImageLayer.LowerThreshold = 0
tgMap.StaticOverlay.Layers.Add(gdiPlusImageLayer)

Thanks,

Howard



Howard, 
  
 I was somehow able to get it to work using the following code with one problem.  It now displays grid lines which become more numerous as I 
 zoom in.  How do I get rid of these?  I think the code you gave in the post above with static overlay might be working as well but I cannot  
 seem to zoom in and center on the tiny map I attached in a previous post in this thread (which the GetFullExtent function takes care of for  
 me when I use the customoverlays object). 
  
 Any ideas on getting rid of the grid? 
  
 Also, Is there a reason you showed the example using the staticoverlay object for the load maps example instead of the customoverlays object 
 that I am using? 
  
  
 Bob 
  
  
 Private Sub Open_Raster_Map(ByVal MpPath As String) 
  
  If mapOverlay.Layers.Contains(MapPath(MpPath)) Then 
  mapOverlay.Layers.Remove(MapPath(MpPath)) 
  End If 
  
  tgMap.MapUnit = GeographyUnit.DecimalDegree 
  
  tgMap.MapBackground.BackgroundBrush = New GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean) 
  Dim mapLayer As New GdiPlusRasterLayer(MapPath(MpPath)) 
  mapLayer.UpperThreshold = Double.MaxValue 
  mapLayer.LowerThreshold = 0 
  
  mapLayer.Name = MapPath(MpPath) 
  mapLayer.Open() 
  
  mapOverlay.Layers.Add(MapPath(MpPath), mapLayer) 
  
  tgMap.CustomOverlays.Add(mapOverlay) 
  
  tgMap.CurrentExtent = GetFullExtent() 
  
  End Sub 
 Private Function GetFullExtent() As RectangleShape 
  Try 
  Dim boundingBox As RectangleShape = Nothing 
  
  For Each myOverlay As Overlay In tgMap.CustomOverlays '.Overlays 
  
  If TypeOf (myOverlay) Is LayerOverlay Then 
  
  Dim layerOverlay As LayerOverlay = DirectCast(myOverlay, LayerOverlay) 
  
  For Each myLayer As Layer In layerOverlay.Layers 
  
  If myLayer.HasBoundingBox Then 
  If Not myLayer.IsOpen Then 
  myLayer.Open() 
  End If 
  
  If boundingBox Is Nothing Then 
  boundingBox = myLayer.GetBoundingBox() 
  Else 
  boundingBox.ExpandToInclude(myLayer.GetBoundingBox()) 
  End If 
  End If 
  Next 
  End If 
  Next 
  
  GetFullExtent = boundingBox 
  Catch ex As Exception 
  Stop 
  
  End Try 
  
  End Function 
 Bob 


Bob, 



Do you mean the grid is the joints between the tiles? We have an installed sample which use the RasterLayer; but it works fine without the grid you mentioned. 

websamples.thinkgeo.com/webe...Image.aspx



If there is any misunderstanding, please provide us a screenshot and upgrade our product to the latest version.



On the other hand, the only reason I use StaticOverlay is that the sample is simple which only maintains a layer. It simplifies the code in the sample. Please try to think how much code will we use in CustomOverlay.



Please let me know if you have any questions.



Thanks,

Howard



Hi Howard,


Thanks for the quick reply!  I have attached a jpg file to illustrate what I mean.  Where can I download an update of the controls from?  Can I just download the trial versions or do I have to login to download another one?



Bob


 



Hi Bob,


We didn’t see and receive your screenshot file. Please check it or send the screenshot to support@thinkgeo.com and ask him forward to Howard or Sun. And you can just download the trial version then install it to have a try, and the trial version is here:
gis.thinkgeo.com/Products/Ma...fault.aspx
Any more questions please let us know.
Thanks,
Sun

K.  I'll try attaching here once more and if it doesn't work, will email to support.


Bob


 



OK.  This should work.  




Bob


 


 



 



Hi Bob,


Are you using the latest public release version (3.1.273) of WebEdition in your application? We have done a simple sample which uses the code and data file (“Erin 1.jpg”) you supplied in this post, and it works fine in our machine. Please get this sample from the attachment to take a look.
Any more questions please let us know.
Thanks,
Sun 

1379-Post6394.zip (180 KB)