ThinkGeo.com    |     Documentation    |     Premium Support

Draw WMS overlay to PDF canvas?

Hi,


My solution needs to be able to generate a PDF with the map image, which is composed by a WmsOverlay and one or more LayerOverlay. I'm using the PdfSharp extension for this.


My code for the LayerOverlay part works, but I'm having difficulties on drawing the WmsOverlay layer onto the GeoCanvas using a similar setup. 


I'm getting the error: Data on root level is invalid. Line 1, position 1.


Here's how the code looks:



For Each ovl As Overlay In Map1.CustomOverlays
    '(checking if overlay should be output ...)
    
    If TypeOf ovl Is WmsOverlay Then
        Dim wmsovl = CType(ovl, WmsOverlay)
        Dim wmslyr = New WmsRasterLayer(wmsovl.ServerUris(0))
        wmslyr.Name = wmsovl.Name
        For Each x In wmsovl.Parameters
            wmslyr.Parameters.Add(x.Key, x.Value)
            If x.Key.ToUpper = "LAYERS" Then 'necessary?
                For Each lyrnam In x.Value.Split(",")
                    wmslyr.ActiveLayerNames.Add(lyrnam)
                Next
            End If
        Next
        'This errs !
        wmslyr.Open()
        wmslyr.Draw(pdfGeoCanvas, LabelsInLayer)
        wmslyr.Close()
    End If
    
    If TypeOf ovl Is LayerOverlay Then
        Dim layovl As LayerOverlay = ovl
        For Each lyr As Layer In layovl.Layers
            If lyr.IsVisible Then
                'This works
                lyr.Open()
                lyr.Draw(pdfGeoCanvas, LabelsInLayer)
                lyr.Close()
            End If
        Next 'lyr
    End If
    
Next 'ovl
 

What am I missing ?


TIA


 



I forgot to mention, that the WmsOverlay in question works perfectly used within the map. 


Hello Lars I, 



Sorry to delay, thanks for your sample, but I can't run it directly,so I made some change, and I can get the right result, please have a look at the sample code below: 


For Each ovl As Overlay In winformsMap1.Overlays
Dim pdfGeoCanvas As New PdfGeoCanvas()
Dim labelsInLayers As New Collection(Of SimpleCandidate)()
Dim document As New PdfDocument()
Dim page As PdfPage = document.AddPage()
Dim wmsovl As LayerOverlay = DirectCast(ovl, LayerOverlay)
Dim wmslyr As New WmsRasterLayer(New Uri("wmssamples.thinkgeo.com/WmsServer.aspx"))
wmslyr.Name = wmsovl.Name
wmslyr.Open()
For Each layerName As String In wmslyr.GetServerLayerNames()
wmslyr.ActiveLayerNames.Add(layerName)
Next
pdfGeoCanvas.BeginDrawing(page, winformsMap1.CurrentExtent, GeographyUnit.Meter)
wmslyr.Draw(pdfGeoCanvas, labelsInLayers)
wmslyr.Close()
pdfGeoCanvas.EndDrawing()
Dim filename As String = "MapSuite PDF Map.pdf"
document.Save(filename)
Process.Start(filename)
Next



And there are some points I want to mentioned: 



1) Please open the WmsRasterLayer before you make any change to it. 

2) Use BeginDrawing and EndDrawing to the Canvas, especially notice the EndDrawing. 



Regards, 



Gary



Hi Gary,


Ok, moving the WmsLayer.Open() call to before assignments brought me a little further. But only a little.


My default WMS layer now doesn't err, when printed to the PDF canvas, but it also doesn't draw anything, i.e. it's blank. And my other two WMS layers still err, with this cryptic error message:


A first chance exception of type 'System.ArgumentException' occurred in MapSuiteCore.DLL


This CRS is not supported in the Wms server


Cryptic because I know that the services all accept my srs (epsg:25832). And all three WMS layers work perfectly on screen.


I did notice that your example doesn't transfer any parameters from the WmsOverlay to the WmsLayer. Is this correct or an omission ?


I'm setting the service "srs" via a parameter with a value of "epsg:25832". This wouldn't get transferred if parameters weren't transferred.


I've tried to set the Crs property to "epsg:25832" instead, but to no avail. That makes my previously "working-but-invisible" layer err like the others.


Please advise.


 


Ps. I am calling BeginDrawing and EndDrawing appropriately, so that's not where the problem lies. My LayerOverlay displays nicely on the PDF, and always have.


Pps. The solution is online here: hvmgo01.hvenegaard.dk/SkulpturDb/   I can send you a login with access to printing by email ?


 



Hello Large I, 
  
 Thanks, please mail to guoyuchen@thinkgeo.com, I will try to find the root cause. 
  
 Regards, 
  
 Gary

Sent (using my alter-ego )



Hello Lars I, 
  
 Thanks for your mail, now I have accessed your project and tested. 
  
 Follow your instruction, I can recreate the problem, but something strange, the marker looks like different with the one in the screen, I think there may be some other reason, could you please provide a simple sample like your first post but can run directly? 
  
 I appreciate your help. 
  
 Regards, 
  
 Gary