google-maps-drawing-tools
Version:
Unified drawing tools for Google Maps
112 lines • 11.1 kB
JavaScript
import { ToolId } from './tool';
import Circle from './tools/circle';
import Line from './tools/line';
import Marker from './tools/marker';
import Polygon from './tools/polygon';
import Rectangle from './tools/rectangle';
export default class DrawingManager {
constructor(options = {}) {
this.map = options.map;
this.data = options.data || new google.maps.Data();
this.data.setMap(this.map);
this.shapes = [];
}
/**
* Change to a specified tool which will be used to draw on the map.
*
* @param toolId The identifier of the tool to change to
*/
changeTool(toolId) {
if (this.tool) {
this.tool.deactivate();
}
this.tool = this.createTool(toolId);
this.data.setDrawingMode(null);
if (this.tool) {
let shape = this.tool.activate();
this.shapes.push(shape);
return shape;
}
return undefined;
}
/**
* Removes a shape from the `shapes` array.
* Also removes it from the `data` layer if the `feature` is present on the shape.
*
* @param shape The shape to remove
*/
removeShape(shape) {
if (shape.feature) {
this.data.remove(shape.feature);
}
let index = this.shapes.indexOf(shape);
if (index !== -1) {
this.shapes.splice(index, 1);
}
}
/**
* Adds a shape to the `shapes` array. If the shape contains a `feature`, then that
* feature is added to the `data` layer.
*
* @param shape The shape to add
*/
addShape(shape) {
if (shape.feature) {
this.data.add(shape.feature);
}
this.shapes.push(shape);
}
/**
* Create a tool based on it's id.
*
* @param toolId The tool to create, by id
*/
createTool(toolId) {
switch (toolId) {
case ToolId.Circle: {
return new Circle({
map: this.map,
data: this.data
});
}
case ToolId.Polygon: {
return new Polygon({
map: this.map,
data: this.data
});
}
case ToolId.Line: {
return new Line({
map: this.map,
data: this.data
});
}
case ToolId.Rectangle: {
return new Rectangle({
map: this.map,
data: this.data
});
}
case ToolId.Marker: {
return new Marker({
map: this.map,
data: this.data
});
}
}
return undefined;
}
/**
* Show or hide the drawings by changing the map.
*
* @param map Google Map instance on which to show the drawings
*/
setMap(map) {
this.map = map;
this.data.setMap(map);
if (this.tool) {
this.tool.map = map;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL2lyYWRjaGVua28vd29ya3NwYWNlL2dvb2dsZS1tYXBzLWRyYXdpbmctdG9vbHMvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFhLEVBQVMsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzdDLE9BQU8sTUFBTSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQztBQUNwQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLFNBQVMsTUFBTSxtQkFBbUIsQ0FBQztBQWMxQyxNQUFNLENBQUMsT0FBTztJQVVaLFlBQVksVUFBMEIsRUFBRTtRQUN0QyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsTUFBcUI7UUFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRWpDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXhCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsS0FBWTtRQUN0QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLEtBQVk7UUFDbkIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QjtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLE1BQXFCO1FBQzlCLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxNQUFNLENBQUM7b0JBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztvQkFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7aUJBQ2hCLENBQUMsQ0FBQzthQUNKO1lBRUQsS0FBSyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxPQUFPLENBQUM7b0JBQ2pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztvQkFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7aUJBQ2hCLENBQUMsQ0FBQzthQUNKO1lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLE9BQU8sSUFBSSxJQUFJLENBQUM7b0JBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNiLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtpQkFDaEIsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxLQUFLLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDckIsT0FBTyxJQUFJLFNBQVMsQ0FBQztvQkFDbkIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNiLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtpQkFDaEIsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxJQUFJLE1BQU0sQ0FBQztvQkFDaEIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNiLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtpQkFDaEIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEdBQTJCO1FBQ2hDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRvb2wsIHsgU2hhcGUsIFRvb2xJZCB9IGZyb20gJy4vdG9vbCc7XG5pbXBvcnQgQ2lyY2xlIGZyb20gJy4vdG9vbHMvY2lyY2xlJztcbmltcG9ydCBMaW5lIGZyb20gJy4vdG9vbHMvbGluZSc7XG5pbXBvcnQgTWFya2VyIGZyb20gJy4vdG9vbHMvbWFya2VyJztcbmltcG9ydCBQb2x5Z29uIGZyb20gJy4vdG9vbHMvcG9seWdvbic7XG5pbXBvcnQgUmVjdGFuZ2xlIGZyb20gJy4vdG9vbHMvcmVjdGFuZ2xlJztcblxuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZWNvbW1lbmRlZCB0byBzZXQgaGVyZSwgYnV0IGNhbiBhbHNvIGJlIHNldCB2aWEgYHNldE1hcGAuXG4gICAqL1xuICBtYXA/OiBnb29nbGUubWFwcy5NYXA7XG4gIC8qKlxuICAgKiBQYXNzIGluIHlvdXIgb3duIGBnb29nbGUubWFwcy5EYXRhYCBpbnN0YW5jZSB0byBwdXQgdGhlIGRyYXdpbmdzXG4gICAqIG9uLlxuICAgKi9cbiAgZGF0YT86IGdvb2dsZS5tYXBzLkRhdGE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYXdpbmdNYW5hZ2VyIHtcbiAgbWFwOiBhbnk7XG4gIGRhdGE6IGdvb2dsZS5tYXBzLkRhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdG9vbC5cbiAgICovXG4gIHRvb2w/OiBUb29sO1xuICBzaGFwZXM6IFNoYXBlW107XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubWFwID0gb3B0aW9ucy5tYXA7XG4gICAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhIHx8IG5ldyBnb29nbGUubWFwcy5EYXRhKCk7XG5cbiAgICB0aGlzLmRhdGEuc2V0TWFwKHRoaXMubWFwKTtcbiAgICB0aGlzLnNoYXBlcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0byBhIHNwZWNpZmllZCB0b29sIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkcmF3IG9uIHRoZSBtYXAuXG4gICAqXG4gICAqIEBwYXJhbSB0b29sSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRvb2wgdG8gY2hhbmdlIHRvXG4gICAqL1xuICBjaGFuZ2VUb29sKHRvb2xJZDogVG9vbElkIHwgbnVsbCk6IFNoYXBlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy50b29sKSB7XG4gICAgICB0aGlzLnRvb2wuZGVhY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMudG9vbCA9IHRoaXMuY3JlYXRlVG9vbCh0b29sSWQpO1xuICAgIHRoaXMuZGF0YS5zZXREcmF3aW5nTW9kZShudWxsKTtcblxuICAgIGlmICh0aGlzLnRvb2wpIHtcbiAgICAgIGxldCBzaGFwZSA9IHRoaXMudG9vbC5hY3RpdmF0ZSgpO1xuXG4gICAgICB0aGlzLnNoYXBlcy5wdXNoKHNoYXBlKTtcblxuICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHNoYXBlIGZyb20gdGhlIGBzaGFwZXNgIGFycmF5LlxuICAgKiBBbHNvIHJlbW92ZXMgaXQgZnJvbSB0aGUgYGRhdGFgIGxheWVyIGlmIHRoZSBgZmVhdHVyZWAgaXMgcHJlc2VudCBvbiB0aGUgc2hhcGUuXG4gICAqXG4gICAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgdG8gcmVtb3ZlXG4gICAqL1xuICByZW1vdmVTaGFwZShzaGFwZTogU2hhcGUpIHtcbiAgICBpZiAoc2hhcGUuZmVhdHVyZSkge1xuICAgICAgdGhpcy5kYXRhLnJlbW92ZShzaGFwZS5mZWF0dXJlKTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLnNoYXBlcy5pbmRleE9mKHNoYXBlKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuc2hhcGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzaGFwZSB0byB0aGUgYHNoYXBlc2AgYXJyYXkuIElmIHRoZSBzaGFwZSBjb250YWlucyBhIGBmZWF0dXJlYCwgdGhlbiB0aGF0XG4gICAqIGZlYXR1cmUgaXMgYWRkZWQgdG8gdGhlIGBkYXRhYCBsYXllci5cbiAgICpcbiAgICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSB0byBhZGRcbiAgICovXG4gIGFkZFNoYXBlKHNoYXBlOiBTaGFwZSkge1xuICAgIGlmIChzaGFwZS5mZWF0dXJlKSB7XG4gICAgICB0aGlzLmRhdGEuYWRkKHNoYXBlLmZlYXR1cmUpO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcGVzLnB1c2goc2hhcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRvb2wgYmFzZWQgb24gaXQncyBpZC5cbiAgICpcbiAgICogQHBhcmFtIHRvb2xJZCBUaGUgdG9vbCB0byBjcmVhdGUsIGJ5IGlkXG4gICAqL1xuICBjcmVhdGVUb29sKHRvb2xJZDogVG9vbElkIHwgbnVsbCk6IChUb29sIHwgdW5kZWZpbmVkKSB7XG4gICAgc3dpdGNoICh0b29sSWQpIHtcbiAgICAgIGNhc2UgVG9vbElkLkNpcmNsZToge1xuICAgICAgICByZXR1cm4gbmV3IENpcmNsZSh7XG4gICAgICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVG9vbElkLlBvbHlnb246IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uKHtcbiAgICAgICAgICBtYXA6IHRoaXMubWFwLFxuICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUb29sSWQuTGluZToge1xuICAgICAgICByZXR1cm4gbmV3IExpbmUoe1xuICAgICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRvb2xJZC5SZWN0YW5nbGU6IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoe1xuICAgICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRvb2xJZC5NYXJrZXI6IHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrZXIoe1xuICAgICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBvciBoaWRlIHRoZSBkcmF3aW5ncyBieSBjaGFuZ2luZyB0aGUgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gbWFwIEdvb2dsZSBNYXAgaW5zdGFuY2Ugb24gd2hpY2ggdG8gc2hvdyB0aGUgZHJhd2luZ3NcbiAgICovXG4gIHNldE1hcChtYXA6IGdvb2dsZS5tYXBzLk1hcCB8IG51bGwpIHtcbiAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB0aGlzLmRhdGEuc2V0TWFwKG1hcCk7XG5cbiAgICBpZiAodGhpcy50b29sKSB7XG4gICAgICB0aGlzLnRvb2wubWFwID0gbWFwO1xuICAgIH1cbiAgfVxufVxuIl19