通过 brutile/sharpmap 向 geoserver 发送 wms 请求以加载平铺地图 (tiled=true)

Posted

技术标签:

【中文标题】通过 brutile/sharpmap 向 geoserver 发送 wms 请求以加载平铺地图 (tiled=true)【英文标题】:sending wms request to geoserver via brutile/sharpmap to load tiled map (tiled=true) 【发布时间】:2016-11-08 11:56:42 【问题描述】:

我想在 SharpMap 的地图框中加载平铺地图。我有 GeoServer 并向其发送 WMS 请求,但我只收到单个瓦片地图。 如何接收多瓦地图? 这是我的代码:

    Dim wmsUrl As String = "http://192.168.21.202:8080/geoserver/threem/gwc/service/wms?tiled=true&version=1.1.0"
    Dim layWms As New SharpMap.Layers.WmsLayer("threem_zoom", wmsUrl)
    layWms.AddLayer("threem_zoom")
    layWms.SetImageFormat("image/png")
    layWms.TimeOut = 5000
    layWms.SRID = 4326
    layWms.Version = "1.1.0"
    MapBox1.Map.Layers.Add(layWms)
    MapBox1.PanOnClick = True
    MapBox1.Map.ZoomToExtents()
    MapBox1.Refresh()

【问题讨论】:

【参考方案1】:

这可以使用 SharpMap 的 TileLayerAsync 来实现。请参阅 TileLayerAsync here 的示例。您需要指定合适的磁贴来源。

使用 GeoServer 的 tile=true it looks 您仍然可以将其作为普通 WMS 发布,但要考虑标签放置。在这种情况下,您需要像这样here

也许更好的是使用 GeoServer 将其发布为使用 TMS、WMTS 或 WMS-C 的适当切片图层。在这种情况下,您需要通过 BruTile 的 HttpTileSource 访问它。

【讨论】:

在 gis stackexchange 上也可以看到这个答案:gis.stackexchange.com/questions/183904/… 谢谢@pauldendulk。你是对的。我使用 TileLayerAsync 和 WmscTileSource.CreateFromWmscCapabilties 做到了这一点。我会为其他人发布我的代码。关于 GeoServer 的 tile=true 的优点。【参考方案2】:

从documentation 看来,似乎支持简单的 WMS 图层 - 因此您需要自己处理拼贴边界的构建并发出多个 WMS 请求以获取平铺图像。

WMS 层支持目前非常基础。您必须自己解读服务器功能,并在资源属性中指定必要的层和其他属性。

【讨论】:

【参考方案3】:

我用这段代码解决了这个问题:

Try
        form1.Mapbox1.Map.Layers.Clear()
        Dim Map As Map = New Map()
        Dim xmlDoc As New XmlDocument()
        If My.Settings.Cache Then
            xmlDoc.Load("http://" & My.Settings.ServerIP & ":" & My.Settings.ServerPort & "/" & My.Settings.ServerName & "/gwc/service/wms?SERVICE=WMS&VERSION=" & My.Settings.WMSVer & "&REQUEST=getcapabilities&TRANSPARENT=TRUE&TILED=true")
        Else
            xmlDoc.Load("http://" & My.Settings.ServerIP & ":" & My.Settings.ServerPort & "/" & My.Settings.ServerName & "/wms?SERVICE=WMS&VERSION=" & My.Settings.WMSVer & "&REQUEST=getcapabilities&TRANSPARENT=TRUE&TILED=true")
        End If
        Dim xDoc = Program.ConvertToXDocument(xmlDoc)
        Dim source As List(Of ITileSource)
        source = WmscTileSource.CreateFromWmscCapabilties((xDoc))
        Dim tileSource = source.FirstOrDefault(Function(x) x.Schema.Name = My.Settings.WorkSapce & ":" & My.Settings.LayerName)
        Dim tileLayer = New TileAsyncLayer(tileSource, My.Settings.WorkSapce & ":" & My.Settings.LayerName) With .SRID = My.Settings.SRIDNum
        tileLayer.OnlyRedrawWhenComplete = True
        form1.Mapbox1.Map.Layers.Add(tileLayer)
        form1.Mapbox1.PanOnClick = True
        Dim env = New Envelope(44.0509701, 25.0652748, 63.3556599, 39.796795)
        form1.Mapbox1.Map.ZoomToBox(env)
        form1.Mapbox1.Map.ZoomToExtents()
        form1.Mapbox1.Map.Center = New Coordinate(53.682362, 32.420654)
        form1.Mapbox1.Refresh()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

【讨论】:

以上是关于通过 brutile/sharpmap 向 geoserver 发送 wms 请求以加载平铺地图 (tiled=true)的主要内容,如果未能解决你的问题,请参考以下文章

Geo Fix 命令未通过高度

如何在geo数据库找想要的数据库

angular-google-maps 通过鼠标点击获取 GEO 位置

Elasticsearch 通过几个不同权重的 geo_points 过滤

Mongodb Geo2d索引原理

Google Geo Charts 未通过 ajax 调用加载