/mapbox-gl-draw

Modified to support react-map-gl

Primary LanguageJavaScriptISC LicenseISC

@mapbox/mapbox-gl-draw

Modified to support use inside react-map-gl

Example:

//@flow
import React from 'react';
import ReactMapGL from 'react-map-gl';

type Props {
  viewport: {
    latitude: number,
    longitude: number,
    zoom: number,
    bearing?: number,
    pitch?: number
  }
}

type State {
  dragPan: boolean
}

export default class MapWithDrawTools extends React.Component<Props, State> {

  props: Props

  state: {
    dragPan: true
  }

reactMapLoaded(map){
  var _this = this;
  const draw = new MapboxDraw({...});

  draw.setEventManager(
    this.refs.reactMapGl._eventManager, this.refs.reactMapGl._eventCanvas,
    ()=>{
      //function that returns the view props
      return _this.props.viewport;
    },
    (dragPan)=>{
      _this.toggleDragPan(dragPan);
    },
    (cursor) =>{
      //optionally override the default cursor choices
      //To do so, set the pointer style on eventContainer
    }
  );

  this.drawControlContainer = draw.onAdd(map);
  document.getElementById('draw-controls').appendChild(this.drawControlContainer);

  this.draw = draw;
  this.map = map;

  //now use draw and map as you normally would  

  map.on('draw.create', () => {

  });

  map.on('draw.update', () => {

  });

  map.on('draw.delete', () => {

  });

}

componentWillUnMount(){
  this.draw.onRemove();
}

//needed to disable dragPan when dragging features or vertices in mapbox-gl-draw
toggleDragPan(dragPan){
  this.setState({dragPan});
}

render(){
  return (
    <div style={{position: 'relative'}}>
    <ReactMapGL ref="reactGLMap"
    dragPan={this.state.dragPan} 
    onLoad={this.reactMapLoaded} />
    <div id="draw-controls" style={{position: 'absolute', top: 0, right: '25px'}}>
  )
}
}

Greenkeeper badge Build Status

Adds support for drawing and editing features on mapbox-gl.js maps. See a live example here

Requires mapbox-gl-js. Compatible versions are documented in the package.json

On NPM this package has recently moved from mapbox-gl-draw to @mapbox/mapbox-gl-draw

Installing

npm install @mapbox/mapbox-gl-draw

Draw ships with CSS, make sure you include it in your build.
When using modules

require('@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css')
// or
import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css'

When using CDN

<link rel='stylesheet' href='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.4/mapbox-gl-draw.css' type='text/css' />

Usage in your application

When using modules

var mapboxgl = require('mapbox-gl');
var MapboxDraw = require('@mapbox/mapbox-gl-draw');

When using a CDN

<script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.4/mapbox-gl-draw.js'></script>

Example setup

mapboxgl.accessToken = 'YOUR_ACCESS_TOKEN';

var map = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v8',
  center: [40, -74.50],
  zoom: 9
});

var Draw = new MapboxDraw();

map.addControl(Draw)

map.on('load', function() {
  // ALL YOUR APPLICATION CODE
});

https://www.mapbox.com/mapbox-gl-js/example/mapbox-gl-draw/

See API.md for complete reference.

Enhancements and New Interactions

For additional functionality check out our list of custom modes.

Mapbox Draw accepts functionality changes after the functionality has been proven out via a custom mode. This lets users experiment and validate their mode before entering a review process, hopefully promoting innovation. When you write a custom mode, please open a PR adding it to our list of custom modes.

Developing and testing

Install dependencies, build the source files and crank up a server via:

git clone git@github.com:mapbox/mapbox-gl-draw.git
npm install
npm start & open http://localhost:9966/debug/?access_token=<token>

Testing

npm run test

Publishing

To github and npm

npm version (major|minor|patch)
git push --tags
git push
npm publish

Update the version number in the GL JS example.

Naming actions

We're trying to follow standards when naming things. Here is a collection of links where we look for inspiration.