Openlayers加载GeoServer的Vector Tiles

本文介绍如何在GeoServer中安装配置VectorTiles扩展并利用OpenLayers加载矢量切片。VectorTiles允许客户端进行复杂渲染并减少带宽使用。文章提供了一个具体的OpenLayers示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: Openlayers加载GeoServer的Vector Tiles
date: 2021-05-08
author: ac
tags:

  • GeoServer
  • Vector Tiles
  • Openlayers

categories:

  • GIS

Vector Tiles 是一种输出格式,而不是数据源

1. 安装Vector Tiles扩展

GeoServer除了支持标准的image tiles输出格式外,还支持vector tiles的输出格式。

标准WMS将生成具有地理参考的地图图像作为输出,而vector tiles矢量瓦片是输出包含地理参考的矢量数据,这些数据被裁剪成图块以便于检索。

GeoServer默认不支持Vector Tiles输出格式,需要添加Vector Tiles扩展。

安装配置步骤:

  1. 下载与GeoServer版本一致的Vector Tiles扩展

    image-20210508151921602
  2. 解压后将jar拷贝到GeoServer的WEB-INF/lib目录中

  3. 启动或重启GeoServer

  4. 配置矢量图层,导航到主页–>图层–>点击需要支持Vector Tiles输出格式的矢量图层–>Tile Cahing,如果扩展正确安装就可以看到以下选项:

    image-20210426175433007

2. 矢量瓦片的优势

矢量瓦片(Vector Tiles)的优点是;

  • 渲染是由客户端(例如OpenLayers)完成的,而不是由服务器完成的。这允许不同的地图/应用程序以不同的方式设置地图样式,而不必重新配置GeoServer
  • 向量瓦片的大小通常小于图像瓦片,从而导致更快的数据传输和更低的带宽使用率。
  • GeoServer内嵌的GeoWebCache有效地存储了矢量切片数据。由于样式是由客户端而不是服务器完成的,因此GeoWebCache仅需要为所有不同的样式存储一个图块
  • 由于矢量数据在客户端上可用,因此可以绘制非常高分辨率的地图,而不会相应增加带宽
  • 客户端可以本地访问实际的特征信息(属性和几何形状),从而可以进行非常复杂的渲染。

它主要缺点是,可能需要对地理数据进行预处理,以使客户可以进行所需的绘图(类似于对图像地图进行预处理的数据)。考虑到这一点,矢量 tiles更适用于渲染

GeoServer还可以生成三种格式的矢量切片:GeoJSON,TopoJSON和MapBox Vector(MVT)

3. Openlayers加载Vector Tiles

<!DOCTYPE html -->
<html>
<head>
  <title>Vector tiles</title>
  <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/build/ol.js"></script>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/css/ol.css">
  <style>
    html, body {
      font-family: sans-serif;
      width: 100%;
    }
    .map {
      height: 500px;
      width: 100%;
    }
  </style>
</head>
<body>
  <h3>Mapbox Protobuf - vector tiles</h3>
  <div id="map" class="map"></div>
  <script>

  var style_simple = new ol.style.Style({
    fill: new ol.style.Fill({
      color: '#ADD8E6'
    }),
    stroke: new ol.style.Stroke({
      color: '#880000',
      width: 1
    })
  });

  function simpleStyle(feature) {
    return style_simple;
  }

  var layer = 'nyc:ne_110m_countries';
  var projection_epsg_no = '900913';
  var map = new ol.Map({
    target: 'map',
    view: new ol.View({
      center: [0, 0],
      zoom: 2
    }),
    layers: [
      new ol.layer.VectorTile({
      style:simpleStyle,
      source: new ol.source.VectorTile({
        tilePixelRatio: 1, // oversampling when > 1
        tileGrid: ol.tilegrid.createXYZ({maxZoom: 19}),
        format: new ol.format.MVT(),
        url: 'http://localhost:8080/geoserver/gwc/service/tms/1.0.0/' + layer +
            '@EPSG%3A'+projection_epsg_no+'@pbf/{z}/{x}/{-y}.pbf'
      })
    })]
  });
  </script>
</body>
</html>

加载矢量切片时,建议使用最新的ol。较旧的ol不支持所有矢量切片功能,并且可能导致渲染错误。

image-20210426180051627

image-20210508160648011

Tips:

image-20210512095156970

加载 GeoServer 发布的矢量切片,需要使用相应的客户端工具或 API。以下是两种可能的方法: 1. 使用 OpenLayers 客户端库进行加载: ```javascript var layer = new ol.layer.VectorTile({ source: new ol.source.VectorTile({ format: new ol.format.MVT(), url: 'http://your-geoserver-url.com/geoserver/gwc/service/tms/1.0.0/your-workspace:your-layer@EPSG%3A3857@pbf/{z}/{x}/{-y}.pbf' }) }); map.addLayer(layer); ``` 在这个示例中,我们创建了一个名为 `layer` 的新矢量切片图层,并使用 `ol.source.VectorTile` 指定了 GeoServer 发布的矢量切片的 URL。请注意,我们在 URL 中使用了 `@EPSG%3A3857@pbf` 来指定投影和数据格式。你需要将这些值替换为你自己的投影和数据格式。 2. 使用 Mapbox GL JS 客户端库进行加载: ```javascript map.addLayer({ "id": "your-layer", "type": "vector", "source": { "type": "vector", "tiles": [ "http://your-geoserver-url.com/geoserver/gwc/service/tms/1.0.0/your-workspace:your-layer@EPSG%3A3857@pbf/{z}/{x}/{-y}.pbf" ] }, "source-layer": "your-source-layer" }); ``` 在这个示例中,我们使用 Mapbox GL JS 客户端库创建了一个新图层,并使用 `source` 属性指定了 GeoServer 发布的矢量切片的 URL。请注意,我们在 URL 中使用了 `@EPSG%3A3857@pbf` 来指定投影和数据格式。你需要将这些值替换为你自己的投影和数据格式,并且需要指定你的源图层名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值