OpenLayers 动态绘制点, 线, 面, 图片, dom图标

可以在新的图层中绘制(推荐), 也可以在已有的图层中绘制, 预览:
image-bdyv.png

1. 动态设置方式, 绘制图片

import VectorSource from "ol/source/Vector";
import VectorLayer from "ol/layer/Vector";
import { Feature } from "ol";
import { Point } from "ol/geom";
import { Icon } from "ol/style";
import { Style } from "ol/style";

// 创建新的图层
const layer = new VectorLayer({
  source: new VectorSource()
})
// 创建新的要素
const feature = new Feature({
  geometry: new Point([118.6, 31]),
})
// 动态设置方式, 绘制图片
feature.setStyle(new Style({
  image: new Icon({
    src: 'https://api.lolimi.cn/API/meizi/api.php?type=image',
    scale: 0.1, // 图标大小, 缩放倍率
  })
}))

layer.getSource().addFeature(feature) // 添加要素到图层
map.value.addLayer(layer)             // 添加图层到地图中

2. 动态设置方式, 绘制点

// 动态设置方式, 绘制点
const feature = new Feature({
  geometry: new Point([118.6, 31]),
})
feature.setStyle(new Style({
  image: new CircleStyle({
    radius: 10,
    fill: new Fill({
      color: 'red',
    }),
    stroke: new Stroke({
      color: 'green',
      width: 2,
    }),
  }),
}))
source.addFeature(feature)

3. 动态设置方式, 绘制线, 北京到上海,

// 动态设置方式, 绘制线, 北京到上海
const feature = new Feature({
  // 绘制线要使用二维数组
  geometry: new LineString([[116.46, 39.92], [121.47, 31.22]])
})
feature.setStyle(new Style({
  fill: new Fill({
    color: 'rgba(255, 0, 0, 0.3)',
  }),
  stroke: new Stroke({
    color: 'green',
    width: 5,
  }),
}))
source.addFeature(feature)

4. 动态设置方式, 绘制面(多边形)并填充颜色, 北京,上海,武汉

// 动态设置方式, 绘制面(多边形)并填充颜色, 北京,上海,武汉
const polygonFeature = new Feature({
  // 绘制线要使用三维数组
  geometry: new Polygon([
    [
      [116.46, 39.92],
      [121.47, 31.22],
      [114.3, 30.59],
    ]
  ])
})
polygonFeature.setStyle(new Style({
  fill: new Fill({
    color: 'rgba(255, 0, 0, 0.3)',
  }),
  stroke: new Stroke({
    color: 'green',
    width: 5,
  }),
}))
source.addFeature(polygonFeature)

5. 动态设置方式, 添加一个图标(通过dom元素的方式)

import { Overlay } from "ol";

// 动态设置方式, 添加一个图标(通过dom元素的方式)
const overlay = new Overlay({
  element: document.getElementsByClassName('overlay')[0],
  offset: [-20, -20],
})
overlay.setPosition([119, 31])
map.value.addOverlay(overlay)


<template>
  <div class="title">openlayers vue3 地图示例</div>

  <span class="overlay" ref="domoOverlay">
    <img src="https://api.lolimi.cn/API/meizi/api.php?type=image" alt="美子">
  </span>
  <div id="container"></div>
</template>

<style>
.overlay {
  background-color: aqua;
}

.overlay img {
  width: 40px;
  vertical-align: middle;
  font-size: 0;
}
</style>

四下皆无人