leaflet WMS and TMS—如何与专业 GIS 软件的 WMS 和 TMS 服务集成。

leaflet WMS and TMS—如何与专业 GIS 软件的 WMS 和 TMS 服务集成。

WMS 是网络地图服务的简称,是一种由专业 GIS 软件发布地图的流行方式(非 GIS 人员很少使用)。这种格式类似于地图图块,但更通用,并且没有很好地优化用于 web 地图。 WMS 图像由其角的坐标定义——Leaflet 在后台进行的计算。 TMS 代表平铺地图服务,是一种地图平铺标准,更侧重于 web 地图,非常类似于 Leaflet 在 L.TileLayer 中期望的地图平铺。 WMTS,用于 web 地图切片服务,是地图切片的标准协议,并提供可在 L.TileLayer 中直接使用的地图切片。

WMS in Leaflet

当有人发布 WMS 服务时,他们很可能会链接到称为 GetCapabilities 文档的内容。对于本教程,我们将使用 Mundialis 提供的 WMS,网址为 http://ows.mundialis.de/services/service? .服务功能在以下 URL 中进行了描述:

http://ows.mundialis.de/services/service?request=GetCapabilities

Leaflet 不理解 WMS GetCapabilities 文档。相反,您必须创建一个 L.TileLayer.WMS 图层,提供基本 WMS URL,并指定您需要的任何 WMS 选项。 基本 WMS URL 只是 GetCapabilities URL,没有任何参数,如下所示:

http://ows.mundialis.de/services/service?

在leaflet地图中使用它的方法很简单:

var map = L.map(mapDiv, mapOptions);

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', wmsOptions).addTo(map);

L.TileLayer.WMS 的一个实例至少需要一个选项:图层。请注意,Leaflet 中的“层”概念与 WMS 中的“层”概念不同! WMS 服务器在服务中定义了一组图层。这些是在 GetCapabilities XML 文档中定义的,这在大多数情况下是乏味且难以理解的。通常最好使用 QGIS 等软件来查看 WMS 服务器中可用的图层以查看可用的图层名称:

我们可以看到 Mundialis WMS 有一个名为 TOPO-OSM-WMS 的 WMS 图层和底图。让我们看看它的外观:

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
    layers: 'TOPO-OSM-WMS'
}).addTo(map);

或者我们可以试试 SRTM30-Colored-Hillshade WMS 层:

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
    layers: 'SRTM30-Colored-Hillshade'
}).addTo(map);

图层选项是以逗号分隔的图层列表。如果 WMS 服务定义了多个图层,则对地图图像的请求可以引用多个图层。 对于我们使用的示例 WMS 服务器,有一个显示世界地形的 TOPO-WMS WMS 图层,以及一个显示地名的 OSM-Overlay-WMS WMS 图层。如果我们同时请求两个图层,WMS 服务器会将两个图层组合在一个图像中,并用逗号分隔:

var topographyAndPlaces = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
    layers: 'TOPO-WMS,OSM-Overlay-WMS'
}).addTo(map);

请注意,这将向 WMS 服务器请求一个图像。这不同于为地形创建 L.TileLayer.WMS,为地点创建另一个 L.TileLayer.WMS,然后将它们都添加到地图中。在第一种情况下,有一个图像请求,由 WMS 服务器决定如何组合(相互叠加)图像。在第二种情况下,会有两个图像请求,由运行在 Web 浏览器中的 Leaflet 代码决定如何组合它们。 如果我们将它与图层控件结合起来,那么我们可以构建一个简单的地图来查看差异:

var basemaps = {
    Topography: L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
        layers: 'TOPO-WMS'
    }),

    Places: L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
        layers: 'OSM-Overlay-WMS'
    }),

    'Topography, then places': L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
        layers: 'TOPO-WMS,OSM-Overlay-WMS'
    }),

    'Places, then topography': L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
        layers: 'OSM-Overlay-WMS,TOPO-WMS'
    })
};

L.control.layers(basemaps).addTo(map);

basemaps.Topography.addTo(map);

更改为“地形,然后是地点”选项,这样您就可以看到地形“顶部”的地点,但 WMS 服务器足够聪明,可以在上面显示建筑标签。当要求很多时,如何组合图层取决于 WMS 服务器。

WMS服务GIS用户注意事项 从 GIS 的角度来看,Leaflet 中的 WMS 处理非常基础。没有 GetCapabilities 支持,没有图例支持,也没有 GetFeatureInfo 支持。 L.TileLayer.WMS 有额外的选项,可以在 Leaflet 的 API 文档中找到。此处未描述的任何选项都将在 getImage URL 中传递给 WMS 服务器。 另请注意,Leaflet 支持的坐标系很少:CRS:3857、CRS:3395 和 CRS:4326(请参阅 L.CRS 的文档)。如果您的 WMS 服务不提供这些坐标系中的图像,您可能需要使用 Proj4Leaflet 在 Leaflet 中使用不同的坐标系。除此之外,只需在初始化地图时使用正确的 CRS,添加的任何 WMS 图层都会使用它:

var map = L.map('map', {
    crs: L.CRS.EPSG4326
});

var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', {
    layers: 'TOPO-OSM-WMS'
}).addTo(map);

TMS in Leaflet

Leaflet 没有明确支持 TMS 服务,但 tile 命名结构与常见的 L.TileLayer 命名方案非常相似,因此显示 TMS 服务几乎是微不足道的。 让我们考虑一个具有以下端点的 TMS 服务器:

http://base_url/tms/1.0.0

查看有关 TMS 和 TMS 规范的 MapCache 帮助,您可以看到 TMS 中地图图块的 URL 如下所示:

http://base_url/tms/1.0.0/{example_layer}@png/{z}/{x}/{y}.png

并在实例化层时使用 tms:true 选项,如下所示:

var tms_example = L.tileLayer('http://base_url/tms/1.0.0/example_layer@png/{z}/{x}/{y}.png', {
    tms: true
}).addTo(map);

Leaflet 1.0 中的一个新特性是能够在 URL 中使用 {-y} 而不是 tms: true 选项,例如:

var layer = L.tileLayer('http://base_url/tms/1.0.0/tileset/{z}/{x}/{-y}.png');

需要 tms: true 选项(在 Leaflet 0.7 中)或 {-y}(在 Leaflet 1.0 中),因为原版 L.TileLayers 的坐标原点位于左上角,因此 Y 坐标向下。在 TMS 中,坐标原点是左下角,因此 Y 坐标向上。 除了 y 坐标的差异和瓦片集的发现之外,TMS 服务完全按照 L.TileLayer 期望的方式提供瓦片。

0 0 投票数
文章评分
订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x