39 openlayers 对接地图图层 绘制点线面圆

前言

这里主要是展示一下 openlayers 的一个基础的使用 

主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 

增加 省市区县 的边界标记

基础绘制 点线面园 等等

测试用例

<template>
  <div style="width: 1920px; height:1080px;" >
    <div class="olMapUsageClass"></div>

    <div class="overdelay1" ref="overdelay1" >
      this is over delay1
    </div>
  </div>

</template>

<script>

  import Map from 'ol/Map'
  import View from 'ol/View'
  import DragPan from 'ol/interaction/DragPan'
  import MouseWheelZoom from 'ol/interaction/MouseWheelZoom'
  import PointerInteraction from 'ol/interaction/Pointer'
  import GeoJSON from 'ol/format/GeoJSON'
  import {Tile as TileLayer} from 'ol/layer'
  import {Vector as VectorLayer} from 'ol/layer'
  import {Image as ImageLayer} from 'ol/layer'
  import {Vector as VectorSource} from 'ol/source'
  import {Feature as Feature} from 'ol'
  import Point from 'ol/geom/Point'
  import LineString from 'ol/geom/LineString'
  import Polygon from 'ol/geom/Polygon'
  import CircleGeo from 'ol/geom/Circle'
  import XYZ from "ol/source/XYZ"
  import ImageStatic from "ol/source/ImageStatic"
  import {Circle, Fill, Icon, RegularShape, Stroke, Style, Text} from 'ol/style'
  import Overlay from 'ol/Overlay'
  import {transformExtent, transform} from "ol/proj"

  let sichuanJson = require(`../../public/json/sichuan.json`)

  export default {
    name: "olMapUsage",
    components: {},
    props: {},
    data() {
      return {
        map: null,
        tdtImgLayer: null,
        labelLayer: null,
        overlay: null,
      };
    },
    computed: {},
    watch: {},
    created() {

    },
    mounted() {

      this.initMap()

      this.test01AddBoundsLayer()
      this.test02AddDtImageLayer()
      // this.test03AddDtTDLayer()
      this.test04AddDtLabelLayer()

      this.test05AddImageLayer()
      this.test06AddCircleLayer([104.065735, 30.359462])
      this.test06AddCircleLayer([104.565735, 30.859462], "red")
      this.test07AddLineLayer()
      this.test08AddAreaLayer()
      this.test09AddCircleLayer()

      // this.test12SetCenterThenAddOverlay()

    },
    methods: {
      initMap() {
        let center = [104.065735, 30.659462]
        let projection = "EPSG:4326"
        let zoom = 10
        let minZoom = 5
        let maxZoom = 20
        const layer = []
        const view = new View({
          ...(this.viewOptions || {}),
          projection,
          center,
          zoom,
          minZoom,
          maxZoom
        })

        this.map = new Map({
          ...(this.mapOptions || {}),
          layers: [].concat(layer),
          view: view,
          target: this.$el,
          controls: [],
          interactions: [
            new DragPan(),
            new MouseWheelZoom(),
            new PointerInteraction({
              handleEvent: this.handleEvent
            })
          ]
        })
      },
      test01AddBoundsLayer() {
        const source = new VectorSource({})
        const style = {color: 'rgba(75,165,234,1)', width: '3'}
        const fill = 'rgba(255,255,255,0)'
        let parsedStyle = this.parseStyle({style, fill})
        const boundsLayer = new VectorLayer({
          zIndex: 1,
          source,
          parsedStyle
        })
        this.appendBounds2VectorLayer(boundsLayer, sichuanJson)
        this.map.addLayer(boundsLayer)
      },
      test02AddDtImageLayer() {
        this.tdtImgLayer = new TileLayer({
          zIndex: 2,
          source: new XYZ({
            projection: "EPSG:4326",
            url: "http://192.168.1.111:8888/tianditu/servlet/GoogleSatelliteMap?x={x}&y={y}&z={z}",
          }),
        });
        this.map.addLayer(this.tdtImgLayer);
      },
      test03AddDtTDLayer() {
        this.tdtImgLayer = new TileLayer({
          zIndex: 2,
          source: new XYZ({
            projection: "EPSG:4326",
            url: "http://192.168.1.111:8888/tianditu/servlet/GoogleTDMap?x={x}&y={y}&z={z}",
          }),
        });
        this.map.addLayer(this.tdtImgLayer);
      },
      test04AddDtLabelLayer() {
        this.labelLayer = new TileLayer({
          zIndex: 2,
          source: new XYZ({
            projection: "EPSG:4326",
            url: "http://192.168.1.111:8888/tianditu/servlet/GoogleTransparentMap?x={x}&y={y}&z={z}",
          }),
        });
        this.map.addLayer(this.labelLayer);
      },
      test05AddImageLayer() {
        // let extent = transformExtent([104.065735, 30.659462, 104.165735, 30.759462], "EPSG:4326", "EPSG:4326")
        let extent = [104.065735, 30.659462, 104.165735, 30.759462]
        let imageLayer = new ImageLayer({
          zIndex: 20,
          source: new ImageStatic({
            url: "/img/theme/desktop/17.jpg",
            projection: "EPSG:4326",
            imageExtent: extent
          }),
        });
        this.map.addLayer(imageLayer);
      },
      test06AddCircleLayer(coord, color) {
        color = color || 'green'
        let style = new Style({
          image: new Circle({
            radius:20,
            fill: new Fill({
              color: color
            })
          })
        })
        let feature = new Feature({
          geometry: new Point(coord)
        })
        feature.setStyle(style)
        let source = new VectorSource()
        source.addFeature(feature)

        let layer = new VectorLayer({
          zIndex: 20,
          source: source
        })
        this.map.addLayer(layer);
      },
      test07AddLineLayer() {
        let style = new Style({
          stroke: new Stroke({
            color: "blue",
            width: 3
          })
        })
        let feature = new Feature({
          geometry: new LineString([
            [104.065735, 30.359462],
            [104.165735, 30.359462],
            [104.265735, 30.459462],
          ])
        })
        feature.setStyle(style)
        let source = new VectorSource()
        source.addFeature(feature)

        let layer = new VectorLayer({
          zIndex: 20,
          source: source
        })
        this.map.addLayer(layer);
      },
      test08AddAreaLayer() {
        let style = new Style({
          fill: new Fill({
            color: "#ff0000"
          }),
          stroke: new Stroke({
            color: "blue",
            width: 3
          })
        })
        let feature = new Feature({
          geometry: new Polygon([[
            transform([104.065735, 30.559462], "EPSG:4326", "EPSG:4326"),
            transform([104.165735, 30.559462], "EPSG:4326", "EPSG:4326"),
            transform([104.165735, 30.659462], "EPSG:4326", "EPSG:4326"),
          ]])
        })
        feature.setStyle(style)
        let source = new VectorSource()
        source.addFeature(feature)

        let layer = new VectorLayer({
          zIndex: 20,
          source: source
        })
        this.map.addLayer(layer);
      },
      test09AddCircleLayer() {
        let style = new Style({
          fill: new Fill({
            color: "#ffff00"
          }),
          stroke: new Stroke({
            color: "#00ffff",
            width: 3
          })
        })
        let feature = new Feature({
          geometry: new CircleGeo(transform([104.665735, 30.559462], "EPSG:4326", "EPSG:4326"), 0.2)
          // geometry: new Circle([104.265735, 30.559462], 300)
        })
        feature.setStyle(style)
        let source = new VectorSource()
        source.addFeature(feature)

        let layer = new VectorLayer({
          zIndex: 20,
          source: source
        })
        this.map.addLayer(layer);
      },
      test10SetCenter(coord, color) {
        this.map.getView().setCenter(coord)
        this.test06AddCircleLayer(coord, color)
      },
      test11AddOverlay(coord) {
        this.overlay && this.map.removeOverlay(this.overlay)
        this.overlay = new Overlay({
          element: this.$refs.overdelay1,
          position: coord,
          positioning: "bottom-center",
          offset: [0, 0],
          autoPan: true,
          autoPanMargin: 200,
          autoPanAnimation: {
            duration: 1000
          },
          map: this.map
        })
        this.map.addOverlay(this.overlay)
      },
      test12SetCenterThenAddOverlay() {
        // refer cycle
        this.test06AddCircleLayer([10.265735, 10.659462], "#007f5a")
        this.test06AddCircleLayer([105.565735, 30.759462], "#0039ff")

        let _this = this
        // use this for map.addOverlay's animation update
        setTimeout(function() {
          _this.test11AddOverlay([10.065735, 10.459462])
          _this.test10SetCenter([10.065735, 10.459462], "yellow")
        }, 2000)

        // the core case, normal or exception or compensated
        setTimeout(function() {

          // case1. function of addOverlay
          _this.test11AddOverlay([105.065735, 30.259462])

          // case2. normal case
          // _this.test11AddOverlay([105.065735, 30.259462])
          // _this.test10SetCenter([105.065735, 30.259462], "red")

          // case3. exception case
          // _this.test10SetCenter([105.065735, 30.259462], "red")
          // _this.test11AddOverlay([105.065735, 30.259462])

          // case4. compensated case
          // _this.test10SetCenter([105.065735, 30.259462], "red")
          // setTimeout(function() {
          //   _this.test11AddOverlay([105.065735, 30.259462])
          // }, 1000)
        }, 5000)

      },
      appendBounds2VectorLayer(layer, json) {
        const geoJson = this.geoJsonDecode(json);
        let features = new GeoJSON().readFeatures(geoJson) || [];
        features = features.map(feature => {
          feature.__vm__ = this;
          return feature
        });
        const source = layer.getSource();
        source.addFeatures(features)
      },
      handleEvent(e) {
        if (e.type === "pointermove") {
          return true
        }
        console.log(" handle event : ", e)
        return true
      },
      geoJsonDecode(json) {
        const features = json.features || []
        features.forEach(feature => {
          const geometry = feature.geometry || {}
          const {coordinates, encodeOffsets} = geometry
          if (!encodeOffsets) return
          geometry.coordinates = coordinates.map((coordinate, i) => {
            if (Array.isArray(coordinate)) {
              return coordinate.map((item, j) => {
                return this.decodePolygon(item, encodeOffsets[i][j])
              })
            } else {
              return this.decodePolygon(coordinate, encodeOffsets[i])
            }
          })
          geometry.encodeOffsets = null
        })
        return json
      },
      decodePolygon(coordinate, encodeOffsets) {
        const result = [];
        let prevX = encodeOffsets[0];
        let prevY = encodeOffsets[1];
        for (let i = 0; i < coordinate.length; i += 2) {
          let x = coordinate.charCodeAt(i) - 64;
          let y = coordinate.charCodeAt(i + 1) - 64;
          x = (x >> 1) ^ (-(x & 1));
          y = (y >> 1) ^ (-(y & 1));
          x += prevX;
          y += prevY;

          prevX = x;
          prevY = y;
          result.push([x / 1024, y / 1024]);
        }

        return result;
      },
      parseStyle(settings, StyleModel) {
        const PROPS_MAP = {
          fill: Fill,
          text: Text,
          stroke: Stroke,
          circle: Circle,
          icon: Icon,
          regularShape: RegularShape,
          backgroundFill: Fill,
          backgroundStroke: Stroke
        }
        const IMAGE_PROPS = [Circle, Icon, RegularShape]

        const opts = {};
        Object.entries(settings).forEach(([key, value]) => {
          const Model = PROPS_MAP[key];
          if (key === 'font') {
            value = `${value} sans-serif`
          }
          opts[IMAGE_PROPS.includes(Model) ? 'image' : key] = this.parseValue(Model, key, value)
        });
        return new (StyleModel || Style)(opts)
      },
      parseValue(Model, key, value) {
        if (value === undefined || value === null) return;
        if (!Model) return value;
        if (['fill', 'backgroundFill'].includes(key)) return this.parseFill(value);
        if (key === 'text') {
          return isObject(value) ? parse(value, Model) : value
        }
        return parse(value, Model)
      },
      parseFill(fill) {
        const opts = this.isObject(fill) ? fill : {color: fill}
        return new Fill(opts)
      },
      isObject(value) {
        return typeof value === 'object'
      }

    }
  };
</script>

<style lang="scss">
  .olMapUsageClass {

  }
  .overdelay1 {
    position: absolute;
    border: 1px greenyellow solid;
    width: 200px;
    height: 50px;
  }
</style>

绘制卫星地图 + 地图标注

执行效果如下 

二维地图 + 地图标注

执行效果如下 

二维地图 + 地图边界

执行效果如下 

绘制点线面园 

执行效果如下 

卫星地图 + 地图标注 + 点线面园 

执行效果如下 

完 

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

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

相关文章

软考高级:软件架构评估概述和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

计算机网络:分层体系结构

计算机网络&#xff1a;分层体系结构 基本分层概述各层次的任务物理层数据链路层网络层运输层应用层 数据传递过程分层体系常见概念实体协议服务 基本分层概述 为了使不同体系结构的计算机网络都能互联&#xff0c;国际标准化组织于 1977 年成立了专门机构研究该问题。不久他们…

鸿蒙一次开发,多端部署(十一)交互归一

对于不同类型的智能设备&#xff0c;用户可能有不同的交互方式&#xff0c;如通过触摸屏、鼠标、触控板等。如果针对不同的交互方式单独做适配&#xff0c;会增加开发工作量同时产生大量重复代码。为解决这一问题&#xff0c;我们统一了各种交互方式的API&#xff0c;即实现了交…

基于ssm的勤工助学管理系统+数据库+报告+免费远程调试

项目介绍: 基于ssm的勤工助学管理系统。Javaee项目&#xff0c;ssm项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatisplus VuelayuiMaven来实现。有管理员和老…

国内AI领域的新星:Kimi与GPT的较量,谁主沉浮?

近期&#xff0c;国产大型人工智能模型Kimi频繁成为众多行业领袖讨论的焦点。这些来自不同领域的专家和领袖们&#xff0c;似乎都在对Kimi的性能和能力给予高度评价。在这两年国产AI模型的快速发展中&#xff0c;尽管市场上涌现出了许多新面孔&#xff0c;但真正能够在技术和应…

Tomcat整体架构

一、Tomcat介绍 开源的java web应用服务器&#xff0c;实现了java EE的部分技术规范&#xff0c;如 java servlet、javaServer Pages、 JavaWebSocket等&#xff1b; 核心&#xff1a;http服务器Servlet容器 二、Tomcat两个核心功能 1、处理Socket连接&#xff0c;负责网络字节…

jQuery 其他方法

文章目录 1. jQuery 拷贝对象2. 多库共存3. jQuery 插件3.1 瀑布流插件3.2 图片懒加载技术3.3 bootstrap JS 组件3.4 bootstrap JS 插件*案例--todolist布局 1. jQuery 拷贝对象 拷贝过去的对象属性值会覆盖原来对象的值。 **浅拷贝&#xff1a;**简单数据类型就直接被拷贝&am…

第十三届蓝桥杯物联网试题(省赛)

做后感悟&#xff1a; OLED显示函数需要一直显示&#xff0c;所以在主函数中要一直循环&#xff0c;为了确保这个检错功能error只输出一次&#xff0c;最好用中断串口进行接收数据&#xff0c;数据收完后自动进入中断函数中&#xff0c;做一次数据检查就好了&#xff0c;该开灯…

正基塑业邀您参观2024长三角快递物流供应链与技术装备展览会

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 展会介绍 2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09;&#xff0c;于2024年7月8-10日在杭州…

QGraphicsView 实例3地图浏览器

主要介绍Graphics View框架&#xff0c;实现地图的浏览、放大、缩小&#xff0c;以及显示各个位置的视图、场景和地图坐标 效果图: mapwidget.h #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QLabel> #include <QMouseEvent> #include <QGraphicsView&…

Tomcat 服务器部署和 IDEA 配置 Tomcat

(一) Tomcat 简介 Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP少量JavaEE规范。 概念中提到了JavaEE规范&#xff0c;那什么又是JavaEE规范呢? JavaEE: Java Enterprise Edition,Java企业版。指Java企业级…

【Java初阶(二)】分支与循环

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1.前言2.顺序结构3.分支循环3.1if语句3.2switch语句 4.循环结构4.1while循环4.2 break和continue4.3 for循环4.4 do while循环 5.输入输出5.1输出5.2输…

三级数据库技术知识点(详解!!!)

1、从功能角度数据库应用系统可以划分为表示层、业务逻辑层、数据访问层、数据持久层四个层次&#xff0c;其中负责向表示层直接传送数据的是业务逻辑层。 【解析】表示层负责所有与用户交互的功能;业务逻辑层负责根据业务逻辑需要将表示层获取的数据进行组织后&#xff0c;传…

提升Midjourney风格化的三个技巧

1. 引言 在前篇博文中&#xff0c;我们详细讲述了Midjourney的新功能风格参考的一些基础使用方法&#xff0c;事实上我们可以通过控制参数和提示权重进行更多的自定义操作&#xff0c;在本文中&#xff0c;我将向大家介绍我在网上搜集到的一些提升风格化效果的三个技巧。 闲话…

阿里云服务器租用一年多少钱?2024年最新阿里云租用价格

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

NC 现金流量查询 节点 多账簿联查时,根据所选择的列来判断明细和现金流量联查按钮是否可用,根据添加列选择监听事件处理。

NC 现金流量查询 节点 多账簿联查时&#xff0c;根据所选择的列来判断明细和现金流量联查按钮是否可用&#xff0c;如下图的情况&#xff1a; 在现金流量查询界面UI类的initTable(QueryConditionVO conVO)方法中添加列选择监听事件即可&#xff0c;如下&#xff1a; // 列监听…

【Android】【Bluetooth Stack】蓝牙电话协议之拨打电话分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01…

【Spring框架】单元测试:JUnit

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Filter介绍使用案例

文章目录 一、Filter概念二、Filter快速入门定义类&#xff0c;实现Filter接口&#xff0c;并重写其所有方法 三、Filter执行流程四、Filter使用细节1、Filter拦截路径配置2、过滤器链 五、案例 一、Filter概念 二、Filter快速入门 定义类&#xff0c;实现Filter接口&#xff0…

cc-inputSelView:使用uni-app和原生input组件实现用户位置选择功能

摘要&#xff1a; 在前端开发中&#xff0c;为用户提供选择位置的功能是一个常见的需求。本文将介绍如何使用uni-app和原生input组件实现用户位置选择功能&#xff0c;包括地图定位和页面跳转选择数据两种方式。通过这种方式&#xff0c;开发者可以轻松地为用户提供便利的位置选…