Skip to content

ol-context-menu-control

A contextmenu extension for OpenLayers.

Right click on the map to open the contextmenu.

Usage

Add context menu to map

vue
<template>
  <ol-map
    :loadTilesWhileAnimating="true"
    :loadTilesWhileInteracting="true"
    style="height: 400px"
    ref="map"
    :controls="[]"
  >
    <ol-view
      :center="center"
      :zoom="zoom"
      :projection="projection"
      ref="view"
    />

    <ol-tile-layer>
      <ol-source-osm />
    </ol-tile-layer>

    <ol-context-menu-control
      :items="contextMenuItems"
      @beforeopen="log('beforeopen', $event)"
      @open="log('open', $event)"
      @close="log('close', $event)"
      @add-menu-entry="log('add-menu-entry', $event)"
    />

    <ol-vector-layer>
      <ol-source-vector ref="markers"> </ol-source-vector>
      <ol-style>
        <ol-style-icon :src="marker" :scale="0.1"></ol-style-icon>
      </ol-style>
    </ol-vector-layer>
  </ol-map>
</template>

<script setup lang="ts">
import type { ContextMenuEvent, Item } from "ol-contextmenu";
import { onMounted, ref } from "vue";
import { Feature, type View } from "ol";
import { Point } from "ol/geom";
import type VectorSource from "ol/source/Vector";

import marker from "@/assets/marker.png";

const contextMenuItems = ref<Item[]>([]);
const center = ref([40, 40]);
const projection = ref("EPSG:4326");
const zoom = ref(8);
const markers = ref<{ source: VectorSource } | null>(null);
const view = ref<View | null>(null);

contextMenuItems.value = [
  {
    text: "Center map here",
    classname: "some-style-class", // add some CSS rules
    callback: (val) => {
      view.value?.setCenter(val.coordinate);
    }, // `center` is your callback function
  },
  {
    text: "Add a Marker",
    classname: "some-style-class", // you can add this icon with a CSS class
    // instead of `icon` property (see next line)
    icon: marker, // this can be relative or absolute
    callback: (val) => {
      console.log(val);
      const feature = new Feature({
        geometry: new Point(val.coordinate),
      });
      markers.value?.source.addFeature(feature);
    },
  },
  "-", // this is a separator
];

function log(type: string, event: ContextMenuEvent) {
  console.log(type, event);
}
</script>

Properties

eventType

  • Type: String
  • Default: contextmenu

The listening event type (You could use 'click', 'dblclick')

defaultItems

  • Type: Boolean
  • Default: true

Whether the default items (which are: Zoom In/Out) are enabled

width

  • Type: Number
  • Default: 150

The menu's width

items

  • Type: Array
  • Default: []

An array of object|string