openlayers+vue实现缓冲区

文章目录

  • 前言
  • 一、准备
  • 二、初始化地图
      • 1、创建一个地图容器
      • 2、引入必须的类库
      • 3、地图初始化
      • 4、给地图增加底图
  • 三、创建缓冲区
      • 1、引入需要的工具类库
      • 2、绘制方法
  • 四、完整代码
  • 总结


前言

缓冲区是地理空间目标的一种影响范围或服务范围,是对选中的一组或一类地图要素(点、线或面)按设定的距离条件,围绕其要素而形成一定缓冲区多边形实体,从而实现数据在二维空间得以扩展,后续也可以生成栅格进行叠加分析等。

简单来说,缓冲区就是影响范围,比如想看看自己小区附近10公里范围内有哪些加油站,这个以自己小区为中心,半径10公里的圆,就是一个缓冲区。


一、准备

本文已经预设建好了一个vue项目
接下来需要安装openlayers

npm install openlayers -- save

安装地图工具tur

npm install turf -- save

二、初始化地图

1、创建一个地图容器

<template>
  <div style="width: 100vw; height: 100vh">
    <div id="map" style="height: 100%; width: 100%"></div>
  </div>
</template>

2、引入必须的类库

<script>
// 引入地图库
import Map from 'ol/Map'
// 引入视图
import View from 'ol/View'
// 地图控件,例如放大、缩小、比例尺等
import { defaults as defaultControls } from 'ol/control'
// 地图瓦片
import { Tile as TileLayer } from 'ol/layer'
// 地图瓦片资源
import { WMTS } from 'ol/source'
// 地图瓦片网格
import WMTSTileGrid from 'ol/tilegrid/WMTS'
// 地图投影相关工具
import * as olProj from 'ol/proj'
// 获取地图范围工具
import { getWidth, getTopLeft } from 'ol/extent'
</script>

3、地图初始化

<script>
// 引入地图库
import Map from 'ol/Map'
// 引入视图
import View from 'ol/View'
// 地图控件,例如放大、缩小、比例尺等
import { defaults as defaultControls } from 'ol/control'
// 地图瓦片
import { Tile as TileLayer } from 'ol/layer'
// 地图瓦片资源
import { WMTS } from 'ol/source'
// 地图瓦片网格
import WMTSTileGrid from 'ol/tilegrid/WMTS'
// 地图投影相关工具
import * as olProj from 'ol/proj'
// 获取地图范围工具
import { getWidth, getTopLeft } from 'ol/extent'
export default {
  data() {
    return {
      // 地图对象
      map: null,
      // 地图中心
      center: [117.19637146504114, 39.084235071439096],
    }
  },
  mounted() {
    // 创建地图实例
    this.map = new Map({
      target: 'map',
      // 地图控件
      controls: defaultControls({
        attributionOptions: { collapsed: false },
        // 是否可旋转角度
        rotate: false
      }),
      // 视图
      view: new View({
        // 视图中心默认定位到哪里
        center: this.center,
        // 地图投影
        projection: 'EPSG:4326',
        // 缩放级别
        zoom: 13,
        minZoom: 2,
        maxZoom: 18
      })
    })
  }
}
</script>

4、给地图增加底图

<script>
// 引入地图库
import Map from 'ol/Map'
// 引入视图
import View from 'ol/View'
// 地图控件,例如放大、缩小、比例尺等
import { defaults as defaultControls } from 'ol/control'
// 地图瓦片
import { Tile as TileLayer } from 'ol/layer'
// 地图瓦片资源
import { WMTS } from 'ol/source'
// 地图瓦片网格
import WMTSTileGrid from 'ol/tilegrid/WMTS'
// 地图投影相关工具
import * as olProj from 'ol/proj'
// 获取地图范围工具
import { getWidth, getTopLeft } from 'ol/extent'
export default {
  data() {
    return {
      // 地图对象
      map: null,
      // 地图中心
      center: [117.19637146504114, 39.084235071439096],
      // 底图,本文实例用的是天地图免费图层,tk为天地图官网注册的key,大家自行注册
      basicLayer: [
        // 影像底图
        {
          // 具体可看https://openlayers.org/en/v6.15.1/apidoc/module-ol_source_WMTS-WMTS.html
          url: `http://t3.tianditu.gov.cn/img_c/wmts?tk=key`, // 服务地址
          layer: 'img', // 图层名称
          matrixSet: 'c', // 矩阵集
          format: 'tiles', // 格式化成瓦片
          wrapX: true // 在水平方向上无限循环显示瓦片
        },
        // 影像注记,地图中的地点名称由此图层渲染
        {
          url: `http://t3.tianditu.gov.cn/cia_c/wmts?tk=key`,
          layer: 'cia',
          matrixSet: 'c',
          format: 'tiles',
          wrapX: true
        }
      ]
    }
  },
  methods: {
    // 增加图层到地图
    addLayerToMap() {
      this.basicLayer.forEach((config, index) => {
        this.map.addLayer(this.initLayers(config, index + 1))
      })
    },
    // 初始化图层对象
    initLayers(config, index) {
      const projection = olProj.get('EPSG:4326')
      // 默认比例尺等相关配置
      const projectionExtent = projection.getExtent()
      const size = getWidth(projectionExtent) / 256
      const resolutions = new Array(18)
      const matrixIds = new Array(18)
      for (let z = 1; z < 19; ++z) {
        resolutions[z] = size / Math.pow(2, z)
        matrixIds[z] = z
      }
      let gridConfig = {
        origin: getTopLeft(projectionExtent),
        resolutions,
        matrixIds
      }
      // 网格
      const tileGrid = new WMTSTileGrid(gridConfig)
      // 创建瓦片资源
      let source = new WMTS(
        Object.assign(
          {
            crossOrigin: 'anonymous',
            projection,
            tileGrid
          },
          config
        )
      )
      // 创建图层对象
      return new TileLayer({
        source,
        projection,
        layerName: config.layer,
        index
      })
    },
  },
  mounted() {
    // 创建地图实例
    this.map = new Map({
      target: 'map',
      // 地图控件
      controls: defaultControls({
        attributionOptions: { collapsed: false },
        zoom: false,
        rotate: false
      }),
      view: new View({
        center: this.center,
        projection: 'EPSG:4326',
        zoom: 13,
        minZoom: 2,
        maxZoom: 18
      })
    })
    this.addLayerToMap()
  }
}
</script>

到此地图就算初始化成功
运行代码:
在这里插入图片描述

三、创建缓冲区

1、引入需要的工具类库

// 格式化GeoJSON
import { GeoJSON } from 'ol/format'
// 矢量图层资源
import { Vector as VectorSource } from 'ol/source'
// 矢量图层
import { Vector as VectorLayer } from 'ol/layer'
// 地图计算分析工具,例如绘制缓冲区、计算相交面、获取多边形中心等等
import * as turf from '@turf/turf'

2、绘制方法

createBuffer() {
      let options = {
      	// 缓冲区的粒度
        steps: 60,
        // 缓冲区单位
        units: 'meters'
      }
      // 这里第一个参数为缓冲区的中心,第二参数为缓冲区的半径,第三个参数为缓冲区的生成参数
      let drawFeature = turf.circle(this.center, 300, options)
      //创建缓冲区
      let buffered = turf.buffer(drawFeature, 100, {
        units: 'kilometers',
        steps: 5
      })
      //创建数据geojson对象和数据源对象
      let format = new GeoJSON()
      let source = new VectorSource()
      //读取geojson数据
      let a = format.readFeature(drawFeature)
      // 将数据添加数据源的
      source.addFeature(a)
      // 设置缓冲区样式
      if (buffered) {
        let b = format.readFeature(buffered)
        source.addFeature(b)
       // 将缓冲区移入视图,padding为边距 this.map.getView().fit(b.getGeometry().getExtent(), { padding: [10, 10, 10, 10] })
      }
      //添加图层
      let bufferLayer = new VectorLayer({
        source: source,
        layerName: 'bufferLayer',
        zIndex: 3
      })
      this.map.addLayer(bufferLayer)
    }

还可以给缓冲区增加样式

在头部需要引入
// 地图样式相关,例如绘制圆形、设置笔触、多边形颜色、字体颜色等等
import { Circle as CircleStyle, Fill, Stroke, Style } from 'ol/style'

// 在createBuffer方法中增加样式
     let a = format.readFeature(drawFeature)
      // 样式设置
      a.setStyle(
        new Style({
          stroke: new Stroke({
            color: 'rgba(255, 0, 0, 0.8)',
            width: 3
          }),
          fill: new Fill({
            color: 'rgba(255, 0, 0, 0.5)'
          }),
          image: new CircleStyle({
            // 点的颜色
            fill: new Fill({
              color: 'rgba(255, 0, 0, 0.8)'
            }),
            // 圆形半径
            radius: 5
          })
        })
      )
      // 设置缓冲区样式
      let b = format.readFeature(buffered)
      b.setStyle(
        new Style({
          stroke: new Stroke({
            color: '#2491ff',
            lineDash: [5, 5],
            width: 3
          }),
          fill: new Fill({
            color: 'rgba(176, 202, 241, 0.5)'
          })
        })
      )

效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c8d46a7a3327439cae40879050232bf4.png

四、完整代码

<template>
  <div style="width: 100vw; height: 100vh">
    <div id="map" style="height: 100%; width: 100%"></div>
  </div>
</template>
<script>
// 引入地图库
import Map from 'ol/Map'
// 引入视图
import View from 'ol/View'
// 地图控件,例如放大、缩小、比例尺等
import { defaults as defaultControls } from 'ol/control'
// 地图瓦片
import { Tile as TileLayer } from 'ol/layer'
// 地图瓦片资源
import { WMTS } from 'ol/source'
// 地图瓦片网格
import WMTSTileGrid from 'ol/tilegrid/WMTS'
// 地图投影相关工具
import * as olProj from 'ol/proj'
// 获取地图范围工具
import { getWidth, getTopLeft } from 'ol/extent'
// 格式化GeoJSON
import { GeoJSON } from 'ol/format'
// 矢量图层资源
import { Vector as VectorSource } from 'ol/source'
// 矢量图层
import { Vector as VectorLayer } from 'ol/layer'
// 地图样式相关,例如绘制圆形、设置笔触、多边形颜色、字体颜色等等
import { Circle as CircleStyle, Fill, Stroke, Style } from 'ol/style'
// 地图计算分析工具,例如绘制缓冲区、计算相交面、获取多边形中心等等
import * as turf from '@turf/turf'
export default {
  data() {
    return {
      // 地图对象
      map: null,
      // 地图中心
      center: [117.19637146504114, 39.084235071439096],
      // 底图,本文实例用的是天地图免费图层,tk为天地图官网注册的key,大家自行注册
      basicLayer: [
        // 影像底图
        {
          // 具体可看https://openlayers.org/en/v6.15.1/apidoc/module-ol_source_WMTS-WMTS.html
          url: `http://t3.tianditu.gov.cn/img_c/wmts?tk=key`, // 服务地址
          layer: 'img', // 图层名称
          matrixSet: 'c', // 矩阵集
          format: 'tiles', // 格式化成瓦片
          wrapX: true // 在水平方向上无限循环显示瓦片
        },
        // 影像注记,地图中的地点名称由此图层渲染
        {
          url: `http://t3.tianditu.gov.cn/cia_c/wmts?tk=key`,
          layer: 'cia',
          matrixSet: 'c',
          format: 'tiles',
          wrapX: true
        }
      ]
    }
  },
  methods: {
    // 增加图层到地图
    addLayerToMap() {
      this.basicLayer.forEach((config, index) => {
        this.map.addLayer(this.initLayers(config, index + 1))
      })
    },
    // 初始化图层对象
    initLayers(config, index) {
      const projection = olProj.get('EPSG:4326')
      // 默认比例尺等相关配置
      const projectionExtent = projection.getExtent()
      const size = getWidth(projectionExtent) / 256
      const resolutions = new Array(18)
      const matrixIds = new Array(18)
      for (let z = 1; z < 19; ++z) {
        resolutions[z] = size / Math.pow(2, z)
        matrixIds[z] = z
      }
      let gridConfig = {
        origin: getTopLeft(projectionExtent),
        resolutions,
        matrixIds
      }
      // 网格
      const tileGrid = new WMTSTileGrid(gridConfig)
      let source = new WMTS(
        Object.assign(
          {
            crossOrigin: 'anonymous',
            projection,
            tileGrid
          },
          config
        )
      )
      return new TileLayer({
        source,
        projection,
        layerName: config.layer,
        index
      })
    },
    /**
     * 创建缓冲区
     * shape: Point Line Square Circle Polygon
     * distance: 缓冲区距离,单位是千米
     * polygon: 根据已绘制的图形创建缓冲区
     * maxArea: 最大创建范围,超出后不再进行缓冲区查询
     */
    createBuffer() {
      let options = {
        steps: 60,
        units: 'meters'
      }
      let drawFeature = turf.circle(this.center, 300, options)
      //创建缓冲区
      let buffered = turf.buffer(drawFeature, 100, {
        units: 'kilometers',
        steps: 5
      })
      //创建数据geojson对象和数据源对象
      let format = new GeoJSON()
      let source = new VectorSource()
      //读取geojson数据
      let a = format.readFeature(drawFeature)
      // 样式设置
      a.setStyle(
        new Style({
          stroke: new Stroke({
            color: 'rgba(255, 0, 0, 0.8)',
            width: 3
          }),
          fill: new Fill({
            color: 'rgba(255, 0, 0, 0.5)'
          }),
          image: new CircleStyle({
            // 点的颜色
            fill: new Fill({
              color: 'rgba(255, 0, 0, 0.8)'
            }),
            // 圆形半径
            radius: 5
          })
        })
      )
      // 设置缓冲区样式
      let b = format.readFeature(buffered)
      b.setStyle(
        new Style({
          stroke: new Stroke({
            color: '#2491ff',
            lineDash: [5, 5],
            width: 3
          }),
          fill: new Fill({
            color: 'rgba(176, 202, 241, 0.5)'
          })
        })
      )
      // 将数据添加数据源的
      source.addFeature(a)
      source.addFeature(b)
      // 将缓冲区移入视图,padding为边距this.map.getView().fit(b.getGeometry().getExtent(), { padding: [10, 10, 10, 10] })
      //添加图层
      let bufferLayer = new VectorLayer({
        source: source,
        layerName: 'bufferLayer',
        zIndex: 3
      })
      this.map.addLayer(bufferLayer)
    }
  },
  mounted() {
    // 创建地图实例
    this.map = new Map({
      target: 'map',
      controls: defaultControls({
        attributionOptions: { collapsed: false },
        zoom: false,
        rotate: false
      }),
      view: new View({
        center: this.center,
        projection: 'EPSG:4326',
        zoom: 13,
        minZoom: 2,
        maxZoom: 18
      })
    })
    this.addLayerToMap()
    this.createBuffer()
  }
}
</script>

总结

需要创建缓冲区首先需要初始化一个地图,一个地图需要有容器、控件(可选)、视图、图层来构成。

绘制缓冲区,这里借助工具turf.buffer来创建。
缓冲区的中心、半径和样式可以完全自定义,其中中心和半径,可以直接在创建时传入参数,自定义样式需要用到ol/style中的类,需要单独引入使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着顶刊学科研绘图——nature配色篇(三)

只有朝着100分学习&#xff0c;才能想出80分的想法。 今日继续一起跟着nature培养科研绘图配色的美感。 三色对比 四色对比 五色对比 今日感悟 四色对比中&#xff0c;红蓝一定存在&#xff01; 关注公众号“魔方科研”&#xff0c;随时随地获取您想要的科研信息。 参考文献…

虹科数字化与AR部门升级为安宝特AR子公司

致关心虹科AR的朋友们&#xff1a; 感谢您一直以来对虹科数字化与AR的支持和信任&#xff0c;为了更好地满足市场需求和公司发展的需要&#xff0c;虹科数字化与AR部门现已升级为虹科旗下独立子公司&#xff0c;并正式更名为“安宝特AR”。 ”虹科数字化与AR“自成立以来&…

《佛法修学概要》005-008集研讨

5、我們怎樣才能做到不隨妄轉&#xff0c;找修行的捷徑&#xff1f; 如果說要進步快&#xff0c;你要先找到你生命的原點&#xff0c;就是《楞嚴經》說的&#xff0c;你從什麼地方來&#xff1f;這個道理太重要了&#xff01;就是你要住在什麼角度。如果你住在妄想的角度來處理…

第十九周周报

文章目录 摘要文献阅读DeepHuman: 3D Human Reconstruction from a Single Image(ICCV 2019)贡献摘要网络结构总结 PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization贡献摘要网络结构总结 Animated 3D human avatars from a single imag…

已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘bool‘.

文章目录 引言报错分析解决方案1&#xff1a;降低NumPy版本解决方案2&#xff1a;更改NumPy源码 结尾 引言 在Python编程的世界里&#xff0c;NumPy无疑是一个不可或缺的库。它不仅在处理大规模数值计算中发挥着核心作用&#xff0c;而且为众多开发者提供了强大的支持。然而&a…

自然语言处理--双向匹配算法

自然语言处理作业1--双向匹配算法 一、概述 双向匹配算法是一种用于自然语言处理的算法&#xff0c;用于确定两个文本之间的相似度或匹配程度。该算法通常使用在文本对齐、翻译、语义匹配等任务中。 在双向匹配算法中&#xff0c;首先将两个文本分别进行处理&#xff0c;然后…

Redis核心技术与实战【学习笔记】 - 1.Redis为什么高性能

作为键值数据库&#xff0c;Redis 的应用非常广泛&#xff0c;如果你是后端工程师&#xff0c;我猜你出去面试&#xff0c;八成都会被问到与它相关的性能问题。比如说&#xff0c;为了保证数据的可靠性&#xff0c;Redis 需要在磁盘上读写 AOF 和 RDB&#xff0c;但在高并发场景…

WPF入门到跪下 第十一章 Prism(四)View与ViewModel的自动关联

View与ViewModel的自动关联 一、ViewModelLocator 在学习MvvmLight框架时&#xff0c;也使用了ViewModelLocator类。但在MvvmLight框架中&#xff0c;ViewModelLocator只是一个自定义类&#xff0c;与框架无关&#xff0c;目的就是初始化IoC容器。而在Prism框架中则不同&…

机房及设备安全智慧监管AI+视频方案的设计和应用

一、背景分析 随着互联网的迅猛发展&#xff0c;机房及其配套设施的数量持续攀升&#xff0c;它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石&#xff0c;机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营&#xff0c;同时也…

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示 el-table列属性中带的有show-overflow-tooltip&#xff0c;可以设置内容超出列宽度显示为…&#xff0c;并且有tooltip提示&#xff0c;但是内容过多时&#xff0c;提示会超出屏幕&#xff1a; 但是el-table组件…

Vue 3.0中Treeshaking特性(详细解析)

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除…

逆向 jsvmp 之_signature实例

预备:a.v_jstools 插件,用来解析混淆 b.浏览器启动本地替换 c.nodejs 用来快速调试js 准备好后开搞: 1.首先找到 jsvmp入口点 2.用v_jstools解析混淆,再次刷新,进入入口,找到循环点 3.打日志,分析代码功能

察势而动,破界争先!COSP深圳户外电源展2024重磅开幕!

随着国内疫情逐渐消退&#xff0c;中央政府积极出台了一系列恢复民生的政策。其中&#xff0c;“地摊经济”的火爆&#xff0c;成为了人们茶余饭后的热门话题。这个政策的出台&#xff0c;不仅推动了地摊经济的发展&#xff0c;也让户外电源市场迎来了新的机遇。 随着户外电源产…

Git标签推送

标签默认属于本地分支&#xff0c;推送分支的时候并不会上传。需要自己手动推送 通过命令 git push origin <tagname>推送指定的标签 通过命令git push origin --tags批量推送所有的标签 在VS里打开git命令行窗口的方法&#xff1a;Git更改-操作-打开命令行提示符 对于…

【java】常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别&#xff1f; 2、 final、finally、finalize 有什么区别&#xff1f; 3、try-catch-finally 中哪个部分可以省略&#xff1f; 4、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#…

【C++】入门

结束数据结构初阶的学习后&#xff0c;很高兴继续学习C&#xff0c;欢迎大家一起交流~ 目录 C关键字 命名空间 命名空间定义 命名空间使用 C输入&输出 缺省参数 缺省参数概念 缺省参数分类 函数重载 函数重载概念 C支持函数重载的原理--名字修饰 引用 引用概念…

MacOS平台翻译OCR软件,双管齐下,还可自定义插件,为其添砖加瓦!

小编昨天为大家分享了Windows系统下的一款功能强大且免费的 OCR 开源工具 Umi-OCR。 今天则为大家推荐一款 MacOS系统下的一款 翻译 OCR 多功能双管齐下的桌面应用软件 Bob。这款软件虽然也上线了GitHub&#xff0c;但它不是一款开源软件&#xff0c;仓库只是作者为了用户反馈…

线程池调优,深入理解,线程池各个参数的含义(keepAliveTime 展开说说?)

线程池调优&#xff0c;深入理解&#xff0c;线程池各个参数的含义&#xff08;keepAliveTime 展开说说&#xff1f;&#xff09;目录 线程池核心组件核心线程、最大线程、阻塞队列的关系&#xff08;重点&#xff09;线程池调优&#xff08;运行流程&#xff09;keepAliveTime…

C++ 利用容器适配器,仿函数实现栈,队列,优先级队列(堆),反向迭代器,deque的介绍与底层

C 利用容器适配器,仿函数实现栈,队列,优先级队列【堆】,反向迭代器,deque的介绍与底层 一.容器适配器的介绍二.利用容器适配器实现栈和队列1.stack2.queue 三.仿函数介绍1.什么是仿函数2.仿函数的使用3.函数指针的使用1.函数指针的用处2.利用函数指针完成回调3.利用仿函数完成回…

CSS之粘性定位

让我为大家介绍一下粘性定位吧&#xff01; 大家应该都了解过绝对定位&#xff0c;它是相对于父级定位 那么粘性定位相对于谁呢&#xff1f; 它相对于overflow:hidden; 如果没找到就会跟fixed固定定位一样&#xff0c;相对于视口 <!DOCTYPE html> <html lang"en…