三十三、openlayers官网示例Drawing Features Style——在地图上绘制图形,并修改绘制过程中的颜色

这篇讲的是使用Draw绘制图形时根据绘制形状设置不同颜色。

根据下拉框中的值在styles对象中取对应的颜色对象,new Draw的时候将其设置为style参数。

 const styles = {
      Point: {
        "circle-radius": 5,
        "circle-fill-color": "red",
      },
      LineString: {
        "circle-radius": 5,
        "circle-fill-color": "red",
        "stroke-color": "yellow",
        "stroke-width": 2,
      },
      Polygon: {
        "circle-radius": 5,
        "circle-fill-color": "red",
        "stroke-color": "yellow",
        "stroke-width": 2,
        "fill-color": "blue",
      },
      Circle: {
        "circle-radius": 5,
        "circle-fill-color": "red",
        "stroke-color": "blue",
        "stroke-width": 2,
        "fill-color": "yellow",
      },
    };

    const typeSelect = document.getElementById("type");

    let draw; 
    function addInteraction() {
      const value = typeSelect.value;
      if (value !== "None") {
        draw = new Draw({
          source: source,
          type: typeSelect.value,
          style: styles[value],
        });
        map.addInteraction(draw);
      }
    }

需要注意的是这个style是绘制过程中的颜色,如果需要设置绘制完成后的颜色还得在图层中设置

  const source = new VectorSource({ wrapX: false });

    const vector = new VectorLayer({
      source: source,
      style:style
    });

完整代码:

<template>
  <div class="box">
    <h1>Drawing Features Style绘制不同颜色的图形</h1>
    <div id="map"></div>
    <div class="row">
      <div class="col-auto">
        <span class="input-group">
          <label class="input-group-text" for="type">Geometry type:</label>
          <select class="form-select" id="type">
            <option value="Point">Point</option>
            <option value="LineString">LineString</option>
            <option value="Polygon">Polygon</option>
            <option value="Circle">Circle</option>
            <option value="None">None</option>
          </select>
        </span>
      </div>
    </div>
  </div>
</template>

<script>
import Draw from "ol/interaction/Draw.js";
import Map from "ol/Map.js";
import View from "ol/View.js";
import { OSM, Vector as VectorSource } from "ol/source.js";
import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer.js";
export default {
  name: "",
  components: {},
  data() {
    return {
      map: null,
    };
  },
  computed: {},
  created() {},
  mounted() {
    const raster = new TileLayer({
      source: new OSM(),
    });

    const source = new VectorSource({ wrapX: false });

    const vector = new VectorLayer({
      source: source,
    });

    const map = new Map({
      layers: [raster, vector],
      target: "map",
      view: new View({
        center: [-11000000, 4600000],
        zoom: 4,
      }),
    });
    const styles = {
      Point: {
        "circle-radius": 5,
        "circle-fill-color": "red",
      },
      LineString: {
        "circle-radius": 5,
        "circle-fill-color": "red",
        "stroke-color": "yellow",
        "stroke-width": 2,
      },
      Polygon: {
        "circle-radius": 5,
        "circle-fill-color": "red",
        "stroke-color": "yellow",
        "stroke-width": 2,
        "fill-color": "blue",
      },
      Circle: {
        "circle-radius": 5,
        "circle-fill-color": "red",
        "stroke-color": "blue",
        "stroke-width": 2,
        "fill-color": "yellow",
      },
    };

    const typeSelect = document.getElementById("type");

    let draw; 
    function addInteraction() {
      const value = typeSelect.value;
      if (value !== "None") {
        draw = new Draw({
          source: source,
          type: typeSelect.value,
          style: styles[value],
        });
        map.addInteraction(draw);
      }
    }

    typeSelect.onchange = function () {
      map.removeInteraction(draw);
      addInteraction();
    };

    addInteraction();
  },
  methods: {},
};
</script>

<style lang="scss" scoped>
#map {
  width: 100%;
  height: 500px;
}
.box {
  height: 100%;
}

#info {
  width: 100%;
  height: 24rem;
  overflow: scroll;
  display: flex;
  align-items: baseline;
  border: 1px solid black;
  justify-content: flex-start;
}
</style>
相关推荐
流烟默8 分钟前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch
2401_8572979119 分钟前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
茶卡盐佑星_29 分钟前
meta标签作用/SEO优化
前端·javascript·html
Ink38 分钟前
从底层看 path.resolve 实现
前端·node.js
金灰39 分钟前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
茶卡盐佑星_41 分钟前
说说你对es6中promise的理解?
前端·ecmascript·es6
Promise5201 小时前
总结汇总小工具
前端·javascript
Манго нектар1 小时前
JavaScript for循环语句
开发语言·前端·javascript
蒲公英10011 小时前
vue3学习:axios输入城市名称查询该城市天气
前端·vue.js·学习
天涯学馆2 小时前
Deno与Secure TypeScript:安全的后端开发
前端·typescript·deno