Cesium+Vue3学习系列(16)---Cesium加载Geoserver发布的矢量(.shp)WMS数据服务

67 阅读3分钟

本学习系列将以Cesium + Vue3 + Vite +Typescript+elementplus作为主要技术栈展开,后续会循序渐进,持续探索Cesium的高级功能,详情请参阅原文 Cesium+Vue3学习系列(16)---Cesium加载Geoserver发布的矢量(.shp)WMS数据服务

之前在 Cesium+Vue3学习系列(4)---图层管理功能封装里初步封装了图层管理功能,本篇在其基础上扩展如何实现在Cesium中加载Geoserver发布的矢量(shp、shapefile)WMS数据服务。

1、新建工作区

图片

2、新建数据存储,选择Shapefile - ESRI(tm) Shapefiles (*.shp)。

图片

3、选择步骤(1)的工作区,设置连接参数(路径最好不要有中文),注意矢量数据最好是WGS84坐标系。设置字符集为UTF-8(有时需要设置为GB2312或GBK),防止汉字属性乱码

图片

4、点击“发布”

图片

5、然后进入编辑页面

图片

在数据tab页里需要点击“从数据中计算”以及“Compute from native bounds”,自动获取shp范围。然后点击“保存”

图片

6、在图层预览(LayerPreview)中找到刚刚保存的数据。这是Polygon默认的样式。如果用户想要自定义数据样式。需要使用uDig或者QGIS软件进行处理,导出sld即可。具体操作过程可自行百度,网上有很多教程。

图片

7、新建样式(如果不需要自定义样式,请忽略步骤7-9)。设置样式名称,工作空间,上传步骤6里导出的sld样式文件,并点击“upload”。然后点击“验证”按钮看样式是否有问题。没问题的话,点击保存。

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1.0" xmlns:se="http://www.opengis.net/se" xmlns:ogc="http://www.opengis.net/ogc">
  <NamedLayer>
    <se:Name>beijing</se:Name>
    <UserStyle>
      <se:Name>beijing</se:Name>
      <se:FeatureTypeStyle>
        <se:Rule>
          <se:Name>Single symbol</se:Name>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#94d180</se:SvgParameter>
            </se:Fill>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:TextSymbolizer>
            <se:Label>
              <ogc:PropertyName>name</ogc:PropertyName>
            </se:Label>
            <se:Font>
              <se:SvgParameter name="font-family">微软雅黑</se:SvgParameter>
              <se:SvgParameter name="font-size">13</se:SvgParameter>
              <se:SvgParameter name="font-weight">bold</se:SvgParameter>
            </se:Font>
            <se:LabelPlacement>
              <se:PointPlacement>
                <se:AnchorPoint>
                  <se:AnchorPointX>0</se:AnchorPointX>
                  <se:AnchorPointY>0.5</se:AnchorPointY>
                </se:AnchorPoint>
              </se:PointPlacement>
            </se:LabelPlacement>
            <se:Halo>
              <se:Radius>2</se:Radius>
              <se:Fill>
                <se:SvgParameter name="fill">#ffffff</se:SvgParameter>
              </se:Fill>
            </se:Halo>
            <se:Fill>
              <se:SvgParameter name="fill">#e31a1c</se:SvgParameter>
            </se:Fill>
            <se:Graphic>
              <se:Mark>             
                <se:Fill>
                  <se:SvgParameter name="fill">#ffffff</se:SvgParameter>
                </se:Fill>
                <se:Stroke>
                  <se:SvgParameter name="stroke">#808080</se:SvgParameter>
                  <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
                </se:Stroke>
              </se:Mark>
              <se:Size>4</se:Size>
            </se:Graphic>
            <se:VendorOption name="maxDisplacement">1</se:VendorOption>
            <se:VendorOption name="graphic-resize">stretch</se:VendorOption>
          </se:TextSymbolizer>
        </se:Rule>
      </se:FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

转存失败,建议直接上传图片文件

8、然后在编辑样式页面,勾选上Default和Associated。

图片

转存失败,建议直接上传图片文件编辑

9、回到图层预览页面。点击openlayers即可看到发布的shp数据及样式。

图片

图片

10、配置矢量wms


// wms测试数据
export const wmsShpTestInfo: ILayerItem = {
    id: LayerIdFlag.WMS_SHAPETEST,
    name: "wmsShpTest",
    type: "imagery_wms",
    url : 'http://localhost:8080/geoserver/gongzhonghao/wms',  //用户需调整为自己的geoserver地址
    layer : 'gongzhonghao:beijing',   //用户需调整为自己的图层名称
}

11、前端加载数据代码

const changeWmsShpTest = (val: string | number | boolean) => {
  if (val) {
    // 加载wms矢量图层
    mLayerManager?.Add(wmsShpTestInfo)
    // 跳转到指定坐标
    viewer?.camera.flyTo({
      destination: Cartesian3.fromDegrees(116.37, 40.22, 1000000.0)
    });
  } else {
    // 移除wms矢量图层
    mLayerManager?.Remove(LayerIdFlag.WMS_SHAPETEST)
  }
}

12、最终效果。

图片

13、更多详细代码,请关注Cesium+Vue3学习系列(16)---Cesium加载Geoserver发布的矢量(.shp)WMS数据服务,。

注:本篇所用的数据及.sld样式文件放在了public/testdata/shp文件夹里,用户可自行测试使用。