Vue.js2+Cesium1.103.0 十三、通过经纬度查询 GeoServer 发布的 wms 服务下的 feature 对象的相关信息

Vue.js2+Cesium1.103.0 十三、通过经纬度查询 GeoServer 发布的 wms 服务下的 feature 对象的相关信息

Demo

vue 复制代码
<template>
  <div
    id="cesium-container"
    style="width: 100%; height: 100%;"
  >
    <div style="position: absolute;z-index: 999;bottom: 0;left: 0;background: #fff;width: 100%;padding: 20px;box-sizing: border-box;">
      <div> {{ position }}</div>
      <div>{{ info }}</div>
    </div>
  </div>
</template>

  <script>
/* eslint-disable no-undef */
import axios from 'axios'
export default {
  data() {
    return {
      position: '',
      info: ''
    }
  },
  computed: {},
  watch: {},
  mounted() {
    const _this = this
    window.$InitMap()

    const imageryLayer = new Cesium.ImageryLayer(
      new Cesium.WebMapServiceImageryProvider({
        url: 'http://openlayers.vip/geoserver/cite/wms',
        layers: 'cite:2000',
        parameters: {
          transparent: true,
          format: 'image/png',
          srs: 'EPSG:4326'
        },
        tileWidth: 1024,
        tileHeight: 1024
      })
    )
    viewer.imageryLayers.add(imageryLayer)

    viewer.camera.flyTo({
      destination: Cesium.Rectangle.fromDegrees(
        114.4491417723215,
        38.96451275547338,
        118.24157311104125,
        41.29160446951736
      )
    })

    /**
     * @description: 根据用户点击的坐标计算 bbox 参数
     * @param {*} latlng
     * @param {*} zoom
     * @return {*}
     */
    function PositionToBbox(latlng, zoom) {
      const box = getZoomBbox(zoom)
      const boxMin = {
        lat: latlng.lat - box,
        lng: latlng.lng - box
      }
      const boxMax = {
        lat: latlng.lat + box,
        lng: latlng.lng + box
      }
      return `${boxMin.lng},${boxMin.lat},${boxMax.lng},${boxMax.lat}`
    }

    /**
     * @description: 计算用户坐标`应该减去的差值
     * @param {*} zoom
     * @return {*}
     */
    function getZoomBbox(zoom) {
      const level0 = 142.03125
      let box = level0 / Math.pow(2, zoom)
      box = box / 2
      return box
    }

    function geoServerQuery(data) {
      return axios({
        method: 'get',
        url: `http://openlayers.vip/geoserver/cite/wms`,
        headers: {
          // Authorization: "",
        },
        params: data
      })
        .then(res => {
          if (res && res.data) {
            return res.data
          }
        })
        .catch(() => {
          return false
        })
    }

    // 鼠标事件
    const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
    handler.setInputAction(function (movement) {
      const earthPosition = viewer.camera.pickEllipsoid(
        movement.endPosition,
        viewer.scene.globe.ellipsoid
      )
      const cartographic = Cesium.Cartographic.fromCartesian(
        earthPosition,
        viewer.scene.globe.ellipsoid,
        new Cesium.Cartographic()
      )
      const longitude = Cesium.Math.toDegrees(cartographic.longitude)
      const latitude = Cesium.Math.toDegrees(cartographic.latitude)
      if (longitude && latitude) {
        console.log('.................', longitude, latitude)
        _this.position = `${longitude}, ${latitude}`
        geoServerQuery({
          service: 'wms',
          version: '1.1.1',
          request: 'getfeatureinfo',
          format: 'image/png',
          transparent: true,
          query_layers: 'cite:2000',
          layers: 'cite:2000',
          exceptions: 'application/vnd.ogc.se_inimage',
          info_format: 'application/json',
          feature_count: 50,
          x: 50,
          y: 50,
          srs: 'epsg:4490',
          width: 101,
          height: 101,
          bbox: PositionToBbox(
            {
              lng: longitude,
              lat: latitude
            },
            24
          )
        })
          .then(res => {
            console.log('..............res', res)
            if (res && res.features && res.features.length > 0) {
              _this.info = res.features[0].properties
            } else {
              _this.info = ''
            }
          })
          .catch(err => {
            _this.info = ''
            console.log(err)
          })
      }
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
  },
  methods: {}
}
</script>

<style>
</style>
相关推荐
向日葵花籽儿7 分钟前
#运维 | 前端 # Linux http.server 实践:隐藏长文件名,简短路径 (http://IP:port/别名 ) 访问
linux·运维·前端
zheshiyangyang20 分钟前
uni-app学习【pages】
前端·学习·uni-app
nightunderblackcat1 小时前
新手向:异步编程入门asyncio最佳实践
前端·数据库·python
前端工作日常1 小时前
我的 Jasmine 入门之旅
前端·单元测试·测试
前端小巷子1 小时前
Vue 3 运行机制
前端·vue.js·面试
yzzzzzzzzzzzzzzzzz8 小时前
JavaScript 操作 DOM
开发语言·javascript·ecmascript
奋斗的小羊羊9 小时前
HTML5关键知识点之多种视频编码工具的使用方法
前端·音视频·html5
前端呆猿9 小时前
深入解析HTML5中的object-fit属性
前端·css·html5
再学一点就睡9 小时前
实现大文件上传全流程详解(补偿版本)
前端·javascript·面试
你的人类朋友10 小时前
【Node&Vue】什么是ECMAScript?
前端·javascript·后端