首页 > 其他分享 >前端学习openLayers配合vue3(圆形形状的绘制)

前端学习openLayers配合vue3(圆形形状的绘制)

时间:2025-01-07 16:13:51浏览次数:1  
标签:map ol openLayers color vue3 let new import 绘制

上节课我们学了加载了矢量图片,这节我们来学绘制圆形

关键代码,第一段呢是设置圆点的操作,第二步是点击地图获取地图位置来设置圆点,ol还有很多类,各种形状的

 //设置圆点
  // let anchorLayer = new VectorLayer({
  //   source: new VectorSource(),
  // });
  // let anchorFeatures = new Feature({
  //   geometry: new Point(center),
  // });

  // anchorFeatures.setStyle(
  //   new Style({
  //     image: new Circle({
  //       radius: 5,
  //       fill: new Fill({ color: "red" }),
  //       stroke: new Stroke({ color: "black", width: 1 }),
  //     }),
  //   })
  // );
  // anchorLayer.getSource().addFeature(anchorFeatures);
  // map.addLayer(anchorLayer);
let layer = new VectorLayer({
    source: new VectorSource(),
  });
  map.addLayer(layer);
  map.on("click", function (e) {
    // 点击图层获取相对的位置进行相关圆点的新增
    let position = e.coordinate;
    let feature = new Feature({
      geometry: new Point(position),
    });
    feature.setStyle(
      new Style({
        image: new Circle({
          radius: 5,
          fill: new Fill({ color: "blue" }),
          stroke: new Stroke({ color: "black", width: 1 }),
        }),
      })
    );
    layer.getSource().addFeature(feature);
  });

效果图

完整代码

 

<script setup>
import { onMounted, reactive, ref } from "vue";
import { Feature, Map, View } from "ol";
import TileLayer from "ol/layer/Tile";
import { OSM, XYZ } from "ol/source";
import { fromLonLat } from "ol/proj";
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import GeoJSON from "ol/format/GeoJSON";
import Style from "ol/style/Style";
import Fill from "ol/style/Fill";
import Stroke from "ol/style/Stroke";
import Icon from "ol/style/Icon";
import { Point } from "ol/geom";
import { Circle } from "ol/style";

defineProps({
  msg: String,
});
let map = reactive({});
let view = reactive({});
// let count=ref(0)
// let center=[114.305469, 30.592876];
let center = reactive([114.305469, 30.592876]);
onMounted(() => {
  initMap();
});
let initMap = () => {
  (view = new View({
    center,
    zoom: 5,
    projection: "EPSG:4326",
  })),
    (map = new Map({
      target: "map", //挂载视图的容器
      layers: [
        //瓦片图层source第三方,或者自带的,地图的底层
        new TileLayer({
          // source: new OSM(),//内置的国外地址,需要代理
          source: new XYZ({
            url: "http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7",
          }), //国内第三方数据源
        }),
        // 矢量图层
        new VectorLayer({
          source: new VectorSource({
            url: "https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json",
            format: new GeoJSON(),
          }),
          //填充颜色
          style: new Style({
            fill: new Fill({
              color: "rgba(255, 0, 0, 0.5)",
            }),
            stroke: new Stroke({
              color: "black",
              width: 1,
            }),
          }),
        }),
      ],

      //视图
      view: view,
    }));

  //设置圆点
  // let anchorLayer = new VectorLayer({
  //   source: new VectorSource(),
  // });
  // let anchorFeatures = new Feature({
  //   geometry: new Point(center),
  // });

  // anchorFeatures.setStyle(
  //   new Style({
  //     image: new Circle({
  //       radius: 5,
  //       fill: new Fill({ color: "red" }),
  //       stroke: new Stroke({ color: "black", width: 1 }),
  //     }),
  //   })
  // );
  // anchorLayer.getSource().addFeature(anchorFeatures);
  // map.addLayer(anchorLayer);

  let layer = new VectorLayer({
    source: new VectorSource(),
  });
  map.addLayer(layer);
  map.on("click", function (e) {
    // 点击图层获取相对的位置进行相关圆点的新增
    let position = e.coordinate;
    let feature = new Feature({
      geometry: new Point(position),
    });
    feature.setStyle(
      new Style({
        image: new Circle({
          radius: 5,
          fill: new Fill({ color: "blue" }),
          stroke: new Stroke({ color: "black", width: 1 }),
        }),
      })
    );
    layer.getSource().addFeature(feature);
  });
};

let move = () => {
  // 设置北京的经纬度
  const beijing = [116.46, 39.92];
  const view = map.getView();
  view.animate({
    center: beijing,
    zoom: 10,
    projection: "EPSG:4356",
  });
};
</script>

<template>
  <div id="map">
    <div class="btns"></div>
  </div>
</template>

<style scoped>
.btns {
  display: flex;
  position: fixed;
  left: 20px;
  bottom: 20px;

  z-index: 999;
}
.btns div {
  width: 100px;
  height: 40px;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}
.read-the-docs {
  color: #888;
}
#map {
  margin: 0;
  width: 100vw;
  height: 100vh;
}
</style>

 

标签:map,ol,openLayers,color,vue3,let,new,import,绘制
From: https://www.cnblogs.com/wcq520/p/18657827

相关文章

  • VUE - VUE3使用tsx
    VUE-VUE3使用tsx Vue官方提供了一个插件@vitejs/plugin-vue-jsx来支持JSX语法。以下是使用该插件的具体步骤: 安装插件:使用npm或yarn安装 @vitejs/plugin-vue-jsx。 npminstall@vitejs/plugin-vue-jsx--save-dev  配置Vite:在 vite.config......
  • BUG:SWM32开机绘制lvgl框架下的某个自定义控件死机
    一.BUG描述现象1.画了一个关于"模式"的自定义控件,结果开机绘制总是死机。现象2.用keil进行仿真调试全速运行同样死机,但是如果在异常处加断点,然后单步调试就正常。(注:仿真调试比直接运行的速度要慢)现象3.把这个异常对象的创建代码删除,再后面加四个打印追踪,还是死机;但是删除两个......
  • 前端学习openLayers配合vue3(加载矢量图标)
    今天我们来进行矢量图标的加载关键代码有一个比较注意的点就是,图片路径必须引入不能直接写路径,我找半天也没发现问题所在letanchorLayer=newVectorLayer({source:newVectorSource(),});letanchorFeatures=newFeature({geometry:newPoint(cen......
  • vue2项目升级为vue3,有哪些需要修改的?
    将Vue2项目升级为Vue3时,前端开发者需要关注多个方面的修改。以下是需要修改的关键点,按照一定结构进行归纳:1.全局和内部API的迁移全局API的更改:在Vue3中,许多全局API已经发生了改变。例如,Vue.use()被替换为app.use(),Vue.prototype被替换为app.config.globalProperties,而......
  • 请说说Flutter的绘制原理
    Flutter的绘制原理主要涉及几个关键概念和步骤,这些共同构成了Flutter高效且一致的渲染机制。以下是对Flutter绘制原理的详细解释:核心架构层次:Flutter架构从下到上分为三层:Embedder、Engine、和Framework。Embedder层负责操作系统适配,如渲染Surface和线程设置。Engine层包含Sk......
  • Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓
    查找、绘制轮廓、圆形矩形轮廓和近似轮廓目录查找、绘制轮廓、圆形矩形轮廓和近似轮廓1轮廓查找和绘制1.1轮廓查找1.1.1函数和参数1.1.2返回值1.2轮廓绘制1.2.1函数和参数1.3步骤1.4实际测试绘制轮廓2绘制近似轮廓2.1函数和参数2.2查找特定轮廓2.3近似轮......
  • vue3+elementPlus实现利用 JSON 数据(`formItems`)描述表单结构,配置化生成表单
    一、功能点(一)组件功能点动态表单生成根据formItems配置动态生成表单项,支持多种类型(如input、radio、select)。表单校验通过rules定义表单校验规则,调用validate方法触发校验。双向绑定表单项通过v-model绑定到form对象,实现数据同步。支持扩展性支持通过form......
  • 【花雕学编程】Arduino CNC 之循环运动绘制正方形
    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用ArduinoIDE(集成开发环境)来编写、......
  • vue2与vue3生命周期钩子的不同
    Vue2的生命周期钩子在Vue2中,常用的生命周期钩子包括:created:在实例创建完成后被调用。这时,实例已完成数据观测(dataobserver),属性和方法的运算,watch/event事件回调。但是,挂载阶段还没开始,$el属性目前不可见。mounted:在挂载完成后被调用。这时,组件已经插入到DOM......
  • 前端学习openLayers配合vue3(修改地图样式)
    这一块的东西非常简单,基于上一步的继续操作关键代码,当然对应的对象需要进行相关的引入//填充颜色style:newStyle({fill:newFill({color:"rgba(255,0,0,0.5)",})})效果 完整代码<scriptsetup>i......