Build Status Coverage Status GitHub tag view on npm License

Rotate feature interaction for OpenLayers

Plugin adds interaction that allows to rotate vector features around some anchor.

Demo

Installation

Install it thought NPM or Bower:

npm install openlayers ol ol-rotate-feature
bower install openlayers ol-rotate-feature

Or download the latest version archive and add it with script tag:

<script src="/js/openlayers/dist/ol.js"></script>
<script src="/js/ol-rotate-feature/dist/bundle.min.js"></script>

Note

Plugin is available in 2 versions: as UMD module and as ES2015 module:

Usage

Plugin may be used as UMD module or ES2015 module:

// Use as ES2015 module (based on NPM package `ol`)
import Map from 'ol/map'
...
import RotateFeatureInteraction from 'ol-rotate-feature'

// Use as UMD module (based on NPM package `openlayers`)
const ol = require('openlayers')
...
const RotateFeatureInteraction = require('ol-rotate-feature')

In Browser environment you should add script tag pointing to UMD module after OpenLayers js files.

<script src="/js/openlayers/dist/ol.js"></script>
<script src="/js/ol-rotate-feature/dist/bundle.min.js"></script>
<script>
  // now plugin is available at `ol.interaction.RotateFeature` field
</script>

Options

Option Type Description
features _ol.Collection_ The features the interaction works on. Required.
style ol.style.Style | Array<ol.style.Style> | ol.style.StyleFunction | undefined Style of the overlay with interaction helper features.
angle number | undefined Initial angle in radians (positive is counter-clockwise), applied for features already added to collection. Default is 0.
anchor number[] | ol.Coordinate | undefined Initial anchor coordinate. Default is center of features extent.

Methods

// Set current angle of interaction features.
RotateFeatureInteraction.prototype.setAngle(angle : number)
// Returns current angle of interaction features.
RotateFeatureInteraction.prototype.getAngle() : number
// Set current anchor position.
RotateFeatureInteraction.prototype.setAnchor(anchor? : number[] | ol.Coordinate)
// Returns current anchor position.
RotateFeatureInteraction.prototype.getAnchor() : number[] | ol.Coordinate | undefined 

Events

All events triggered by the interaction are instances of RotateFeatureEvent.

Members
Event Arguments Description
rotatestart RotateFeatureEvent Triggered upon feature rotate start.
rotating RotateFeatureEvent Triggered upon feature rotating.
rotateend RotateFeatureEvent Triggered upon feature rotation end.

Example usage:

import Map from 'ol/map'
import View from 'ol/view'
import TileLayer from 'ol/layer/tile'
import VectorLayer from 'ol/layer/vector'
import OSMSource from 'ol/source/osm'
import VectorSource from 'ol/source/vector'
import Feature from 'ol/feature'
import Point from 'ol/geom/point'
import LineString from 'ol/geom/linestring'
import Polygon from 'ol/geom/polygon'
import Select from 'ol/interaction/select'
import RotateFeature from 'ol-rotate-feature'

const point = new Feature({
  name: 'point',
  geometry: new Point([ 2384267.0573564973, 7557371.884852641 ])
})
const line = new Feature({
  name: 'line',
  geometry: new LineString([ [ -603697.2100018249, -239432.60826165066 ], [ 4190433.20404443, 2930563.8287811787 ] ])
})
const polygon = new Feature({
  name: 'polygon',
  geometry: new Polygon([ [
    [ -14482348.171434438, 6661491.741627443 ],
    [ -9541458.663080638, 6221214.458704827 ],
    [ -11473786.738129886, 3300708.4819848104 ],
    [ -14482348.171434438, 6661491.741627443 ]
  ] ])
})

const map = new Map({
  view: new View({
    center: [ 0, 0 ],
    zoom: 2
  }),
  layers: [
    new TileLayer({
      source: new OSMSource()
    }),
    new VectorLayer({
      source: new VectorSource({
        projection: 'EPSG:33857',
        features: [ point, line, polygon ]
      })
    })
  ],
  target: 'map',
  projection: 'EPSG:3857'
})

const select = new Select()
select.getFeatures().extend([ point, line, polygon ])

const rotate = new RotateFeature({
  features: select.getFeatures(),
  anchor: [ 0, 0 ],
  angle: -90 * Math.PI / 180
})

rotate.on('rotatestart', evt => console.log('rotate start', evt))
rotate.on('rotating', evt => console.log('rotating', evt))
rotate.on('rotateend', evt => console.log('rotate end', evt))

map.addInteraction(select)
map.addInteraction(rotate)

Example of usage in Browser environment in test/umd.html.

Getting total angle or last anchor coordinates after rotation:

rotate.on('rotateend', evt => {
    // get total angle in degrees
    console.log(evt.angle + ' is '+ (-1 * evt.angle * 180 / Math.PI ) + '°')
    // get last anchor coordinates
    console.log(evt.anchor)
})

License

MIT (c) 2016-2017, Vladimir Vershinin