vue3 openlayers--添加图片图标

openlayers官网:OpenLayers - Welcomehttps://openlayers.org/

1、页面

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

2、导入

import { onMounted, shallowRef } from "vue";
import { Map, View } from "ol";
import TileLayer from "ol/layer/Tile";
import { XYZ } from "ol/source";
import "ol/ol.css";
import { defaults } from "ol/control";
import { Vector as SourceVec, Cluster } from "ol/source";
import { Feature } from "ol";
import { Point } from "ol/geom";
import { Style, Icon } from "ol/style";
import VectorSource from "ol/source/Vector.js";
import VectorLayer from "ol/layer/Vector.js";

3、数据定义,(坐标、图片)

图片是百度的图片的路径~~

const imgSrc1 = "https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png";
const lnglats1 = [
  [125.927905, 42.178945],
  [116.927905, 35.278945],
  [107.927905, 33.378945],
  [128.227905, 44.478945],
  [139.327905, 34.578945],
  [124.227905, 35.578945],
];

// 坐标
var lnglats2 = [
  [100.927905, 22.178945],
  [84.927905, 42.278945],
  [101.927905, 32.378945],
  [92.227905, 22.478945],
  [113.327905, 23.578945],
  [72.227905, 25.578945],
];
const imgSrc2 =
  "data:image/png;base64,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";

4、地图实例化

const map = shallowRef(); // 存放地图实例
function initMap() {
  // 地图实例
  map.value = new Map({
    // 让id为map的div作为地图的容器
    target: "map",
    // 设置地图图层
    layers: [
      new TileLayer({
        source: new XYZ({
          url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}", //暗色
        }),
      }),
    ],
    // 设置显示地图的视图
    view: new View({
      // 设置地图中心范围
      // extent参数类型为[minX, minY, maxX, maxY]的ol.Extent
      projection: "EPSG:4326", //EPSG:3857坐标系(投影坐标) EPSG:4326 坐标系(地理坐标)
      center: [113.927905, 22.578945], // 定义地图显示中心于经度,纬度
      zoom: 13,
      maxZoom: 18,
      minZoom: 4, // 并且定义地图显示层级为
      constrainResolution: true, //自动缩放到距离最近的整数级,非整数级别时地图会糊
    }),
    //设置地图控件
    controls: defaults({
      zoom: false, //不显示放大放小按钮;
      rotate: false, //不显示指北针控件;
      attribution: false, //不显示右下角的地图信息控件;
    }).extend([]),
  });

  //添加标记点
  addMarker(lnglats1, imgSrc1, { name: "block" });
  addMarker(lnglats2, imgSrc2, { name: "spot" });
}

5、添加标记点的方法 

option参数可选择不用,此处是为了区别该坐标点属于哪个分组,图层控制可能用得上

//添加标记点
function addMarker(lnglat: any, imgSrc: string, options = {}) {
  const lnglats = lnglat;
  // 创建Feature对象集合
  const features1 = [];
  for (let i = 0; i < lnglats.length; i++) {
    const numAry = new Feature({
      geometry: new Point([Number(lnglats[i][0]), Number(lnglats[i][1])]),
      ...lnglats[i],
    });
    features1.push(numAry);
  }

  // 矢量要素数据源
  const source1 = new VectorSource({
    features: features1,
  });
  const clusterSource = new Cluster({
    distance: 5, //标注之间
    source: source1,
  });

  const iconStyle = new Style({
    image: new Icon({
      opacity: 1,
      src: imgSrc,
      anchor: [0.5, 3], // 偏移位置
      anchorOrigin: "bottom-left",
      anchorXUnits: "fraction",
      anchorYUnits: "pixels",
      offsetOrigin: "top-right",
      offset: [0, 1], //偏移量设置
      scale: 1, //图标缩放比例
    }),
  });

  const clusters = new VectorLayer({
    source: clusterSource,
    style: iconStyle,
    ...options,
  });
  map.value!.addLayer(clusters);
  return source1;
}

6、页面挂载

onMounted(() => {
  initMap();
});

7、完整代码

<template>
  <div id="map" class="my_map"></div>
</template>
<script lang="ts" setup>
import { onMounted, shallowRef } from "vue";
import { Map, View } from "ol";
import TileLayer from "ol/layer/Tile";
import { XYZ } from "ol/source";
import "ol/ol.css";
import { defaults } from "ol/control";
import { Vector as SourceVec, Cluster } from "ol/source";
import { Feature } from "ol";
import { Point } from "ol/geom";
import { Style, Icon } from "ol/style";
import VectorSource from "ol/source/Vector.js";
import VectorLayer from "ol/layer/Vector.js";

const imgSrc1 = "https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png";
const lnglats1 = [
  [125.927905, 42.178945],
  [116.927905, 35.278945],
  [107.927905, 33.378945],
  [128.227905, 44.478945],
  [139.327905, 34.578945],
  [124.227905, 35.578945],
];

// 坐标
var lnglats2 = [
  [100.927905, 22.178945],
  [84.927905, 42.278945],
  [101.927905, 32.378945],
  [92.227905, 22.478945],
  [113.327905, 23.578945],
  [72.227905, 25.578945],
];
const imgSrc2 =
  "data:image/png;base64,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";

const map = shallowRef(); // 存放地图实例
function initMap() {
  // 地图实例
  map.value = new Map({
    // 让id为map的div作为地图的容器
    target: "map",
    // 设置地图图层
    layers: [
      new TileLayer({
        source: new XYZ({
          url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}", //暗色
        }),
      }),
    ],
    // 设置显示地图的视图
    view: new View({
      // 设置地图中心范围
      // extent参数类型为[minX, minY, maxX, maxY]的ol.Extent
      projection: "EPSG:4326", //EPSG:3857坐标系(投影坐标) EPSG:4326 坐标系(地理坐标)
      center: [113.927905, 22.578945], // 定义地图显示中心于经度,纬度
      zoom: 13,
      maxZoom: 18,
      minZoom: 4, // 并且定义地图显示层级为
      constrainResolution: true, //自动缩放到距离最近的整数级,非整数级别时地图会糊
    }),
    //设置地图控件
    controls: defaults({
      zoom: false, //不显示放大放小按钮;
      rotate: false, //不显示指北针控件;
      attribution: false, //不显示右下角的地图信息控件;
    }).extend([]),
  });
  addMarker(lnglats1, imgSrc1, { name: "block" });
  addMarker(lnglats2, imgSrc2, { name: "spot" });
}

//添加标记点
function addMarker(lnglat: any, imgSrc: string, options = {}) {
  const lnglats = lnglat;
  // 创建Feature对象集合
  const features1 = [];
  for (let i = 0; i < lnglats.length; i++) {
    const numAry = new Feature({
      geometry: new Point([Number(lnglats[i][0]), Number(lnglats[i][1])]),
      ...lnglats[i],
    });
    features1.push(numAry);
  }

  // 矢量要素数据源
  const source1 = new VectorSource({
    features: features1,
  });
  const clusterSource = new Cluster({
    distance: 5, //标注之间
    source: source1,
  });

  const iconStyle = new Style({
    image: new Icon({
      opacity: 1,
      src: imgSrc,
      anchor: [0.5, 3], // 偏移位置
      anchorOrigin: "bottom-left",
      anchorXUnits: "fraction",
      anchorYUnits: "pixels",
      offsetOrigin: "top-right",
      offset: [0, 1], //偏移量设置
      scale: 1, //图标缩放比例
    }),
  });

  const clusters = new VectorLayer({
    source: clusterSource,
    style: iconStyle,
    ...options,
  });
  map.value!.addLayer(clusters);
  return source1;
}

onMounted(() => {
  initMap();
});
</script>
<style>
.my_map {
  width: 100%;
  height: 800px;
}
</style>

8、页面效果

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,我们可以使用OpenLayers库来添加标注(marker)到地图上。下面是一个简单的步骤: 1. 首先,确保你已经安装了VueOpenLayers库。你可以通过npm命令来安装它们: ``` npm install vue npm install ol ``` 2. 在Vue组件中引入OpenLayers: ```javascript import * as ol from 'ol'; import 'ol/ol.css'; ``` 3. 在Vue组件中创建地图容器元素和地图对象: ```javascript mounted() { const map = new ol.Map({ target: 'map-container', // 地图容器元素的ID layers: [ new ol.layer.Tile({ source: new ol.source.OSM() // 使用OpenStreetMap作为底图 }) ], view: new ol.View({ center: ol.proj.fromLonLat([0, 0]), // 地图中心坐标 zoom: 2 // 缩放级别 }) }); } ``` 4. 在Vue组件的模板中添加地图容器元素: ```html <template> <div id="map-container"></div> </template> ``` 5. 在Vue组件中添加标注到地图上: ```javascript mounted() { // ...其他代码 const marker = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.fromLonLat([longitude, latitude])) // 标注的经纬度坐标 }); marker.setStyle( new ol.style.Style({ image: new ol.style.Icon({ src: 'marker.png' // 标注的图标文件路径 }) }) ); const vectorSource = new ol.source.Vector({ features: [marker] }); const vectorLayer = new ol.layer.Vector({ source: vectorSource }); map.addLayer(vectorLayer); } ``` 通过上述步骤,我们可以在Vue3中使用OpenLayers库来添加标注到地图上。你可以根据实际情况调整代码和样式来满足你的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值