openlayers+vue实现缓冲区

news2024/10/6 5:48:28

文章目录

  • 前言
  • 一、准备
  • 二、初始化地图
      • 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中的类,需要单独引入使用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年最新MacBook苹果电脑安装JDK8、JDK11教程,配置环境变量 + 快速切换JDK版本

本帖发布日期&#xff1a;2024年01月26日&#xff0c;全网最新教程整理。 1、概述 本文主要为在MacBook苹果电脑系统下安装JDK及环境变量配置。 教程并非原创&#xff0c;摘抄自互联网&#xff0c;本人作为更新整理亲测。&#xff08;也算给自己记录一贴&#xff09; 本帖分…

python之异常的捕获、模块、包

目录 1.了解异常 2.异常的捕获 3.异常的传递性 4.模块的概念和导入 5.自定义模块并导入 6.自定义python包 7.安装第三方包 1.了解异常 2.异常的捕获 直接报错了&#xff0c;说明我们捕获的就是名字的异常而没有捕获除0的异常。 这样就可以打印出异常 捕获全部的异常可以使…

HTML-表单

表单 概念&#xff1a;一个包含交互的区域&#xff0c;用于收集用户提供的数据。 1.基本结构 示例代码&#xff1a; <form action"https://www.baidu.com/s" target"_blank" method"get"><input type"text" name"wd&q…

使用代码取大量2*2像素图片各通道均值,存于Exel文件中。

任务是取下图RGB各个通道的均值及标签&#xff08;R, G&#xff0c;B&#xff0c;Label&#xff09;,其中标签由图片存放的文件夹标识。由于2*2像素图片较多&#xff0c;所以将结果放置于Exel表格中&#xff0c;之后使用SVM对他们进行分类。

20.云原生之GitLab集成Runner

云原生专栏大纲 文章目录 GitLab RunnerGitLab Runner 介绍GitLab Runner分类GitLab Runner工作流程 Gitlab集成Gitlab RunnerGitLab Runner 版本选择Runner在CitLab中位置专用Runner在gitlab中位置群组Runner在gitlab中位置共享Runner在gitlab中位置 GitLab部署Gitlab Runner…

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言正文 引言 之前在 《pandas向已经拥有数据的Excel文件中添加新数据》 一文中我们介绍了如何通过 pandas 向 Excel 文件中写入数据。那么对于含有多表头的数据&#xff0c;我们该如何将它们…

Linux管道学习(无名管道)

目录 1、概述 2、管道的创建 3、管道读写行为 3.1、管道读 3.2、管道写 4、管道用于兄弟进程之间的通讯 在linux中管道有两种&#xff0c;一是无名管道&#xff08;匿名管道&#xff09;&#xff0c;第二种是有名管道&#xff1b;无名管道主要用于有血缘关系的父子进程间…

八、Kotlin 反射

1. 什么是反射 反射是允许在运行时期访问 程序结构 的一类特性&#xff08;程序结构包括&#xff1a;类、接口、方法、属性等&#xff09;。 2. 反射的依赖库 Kotlin 中不仅自己实现了一套 Kotlin 反射的 API&#xff0c;还可以使用 Java 反射的 API。 Kotlin 反射的 API 是…

day33WEB 攻防-通用漏洞文件上传中间件解析漏洞编辑器安全

目录 一&#xff0c;中间件文件解析漏洞-IIS&Apache&Nginx -IIS 6 7 文件名 目录名 -Apache 换行解析 配置不当 1、换行解析-CVE-2017-15715 2、配置不当-.htaccess 配置不当 -Nginx 文件名逻辑 解析漏洞 1、文件名逻辑-CVE-2013-4547 2、解析漏洞-nginx.conf …

ECharts 中 Legend自定义可以使用svg标签

效果图&#xff1a; legend图例加载svg标签 在ECharts中&#xff0c;图例(legend)组件的formatter属性允许你自定义图例文本的格式。但是&#xff0c;formatter属性不支持直接加载SVG标签或Html。它接受一个字符串或者一个函数作为输入&#xff0c;并不能解析或渲染SVG。 如果…

探索 DevOps 中的自动化技术

DevOps 是一种强调开发与 IT 运营之间合作的软件开发范式&#xff0c;主要依靠自动化来优化流程、提高生产力并确保及时、可靠的软件交付。以下是对 DevOps 不可或缺的关键自动化技术的探索&#xff1a; 1.持续集成/持续部署&#xff08;CI/CD&#xff09; 在 DevOps 领域&…

WebSocket服务端数据推送及心跳机制(Spring Boot + VUE):

文章目录 一、WebSocket简介&#xff1a;二、WebSocket通信原理及机制&#xff1a;三、WebSocket特点和优点&#xff1a;四、WebSocket心跳机制&#xff1a;五、在后端Spring Boot 和前端VUE中如何建立通信&#xff1a;【1】在Spring Boot 中 pom.xml中添加 websocket依赖【2】…

Java程序设计(猜拳、猜数字、猜硬币)

前言 Java实现简单的程序设计&#xff0c;包含猜拳、猜数字和猜硬币&#xff0c;实现玩家和电脑之间的互动&#xff0c;电脑每次出的结果实现随机&#xff0c;玩家选择需要玩的游戏&#xff08;猜拳、猜数字、猜硬币&#xff09;&#xff0c;选择需要进行的局数。 界面设计 程…

pcl+vtk(十四)vtkCamera相机简单介绍

一、vtkCamera相机 人眼相当于三维场景下的相机&#xff0c; VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕、图像等。 相机位置&#xff1a;即相机所在的位置&#xff0c;用方法vtkCamera::SetPosition()设置。 相…

k8s的安全机制

k8s是分布式集群管理工具&#xff0c;k8s作用是容器编排 1、安全机制核心&#xff1a;API server。API server作为整个集群内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕api sserver来进行设计的。请求api server资源要满足3个条件&#x…

数据结构篇-02:最小栈

对于这道题&#xff0c;除了 getMin 外的功能&#xff0c;传统的 栈 结构中都有&#xff0c;所以重点在于如何实现 getMin 方法。 有两类方法&#xff1a;使用辅助栈/不使用辅助栈 使用辅助栈的解法一 定义一个 栈 来实现常规功能&#xff0c;另外定义一个栈&#xff08;最小…

如何配置点击抖音直播小风车跳转到微信公众号?

随着抖音直播间的普及&#xff0c;越来越多的品牌选择通过直播进行宣传推广。然而&#xff0c;直播间主播的氛围营造是一项极具挑战性的任务。如果观众的热情无法被调动起来&#xff0c;直播间很容易陷入沉寂&#xff0c;难以吸引流量。 为了最大化利用流量&#xff0c;许多品牌…

智能充电桩,机器人 wifi蓝牙 解决方案

新联鑫威低功耗高性价比sdio wifi/蓝牙combo的模块单频2.4g的CYWL6208&#xff0c;双频2.4g/5g CYWL6312可以应用到一些低延时 高性能 低功耗 联网需求的交流直流充电桩&#xff0c;扭力扳手&#xff0c;agv机器人&#xff0c;目前支持主流的stm32F4/GD32F4 瑞萨 psoc的主控&am…

道合顺:一站式电子元器件采购商城

欢迎来到道合顺&#xff0c;您专属的电子元器件采购商城。我们为您提供广泛的元器件选择&#xff0c;包括各类芯片、传感器、电容电阻、连接器等&#xff0c;以满足您项目的需求。 最新价格实时查询 通过道合顺电子网&#xff0c;您可以随时随地查询各类电子元器件的最新价格…

外汇天眼:QoinTech误信假老师话术投资外汇,惨遭黑平台滑点爆仓拒出金

去年11月与12月&#xff0c;外汇天眼先后发布了「钓鱼广告诱加投资群组&#xff0c;限制出金逼迫缴分成费」与「假投顾诱导投资黄金获利&#xff0c;黑平台操作爆仓狠诈700万」这2篇文章&#xff0c;曝光黑平台QoinTech的诈骗手法&#xff0c;呼吁投资人不要上当&#xff0c;没…