// Copyright (c) 2015 Uber Technologies, Inc. // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import window from 'global/window'; const windowAlert = window.alert; import React, {PropTypes, Component} from 'react'; import autobind from 'autobind-decorator'; import {scaleOrdinal, schemeCategory10} from 'd3-scale'; import {rgb} from 'd3-color'; import MapGL, {SVGOverlay, CanvasOverlay} from '../../src'; import alphaify from '../../src/utils/alphaify'; import ROUTES from './../data/routes-example.json'; function round(x, n) { const tenN = Math.pow(10, n); return Math.round(x * tenN) / tenN; } const color = scaleOrdinal(schemeCategory10); export default class RouteOverlayExample extends Component { static propTypes = { width: PropTypes.number.isRequired, height: PropTypes.number.isRequired }; constructor(props) { super(props); this.state = { viewport: { latitude: 37.7736092599127, longitude: -122.42312591099463, zoom: 12.011557070552028, startDragLngLat: null, isDragging: false } }; } @autobind _onChangeViewport(viewport) { this.setState({viewport}); } _renderRoute(points, index) { return ( windowAlert(`route ${index}`) }> ); } @autobind _redrawSVGOverlay({project}) { return ( { ROUTES.map((route, index) => { const points = route.coordinates.map(project).map( p => [round(p[0], 1), round(p[1], 1)] ); return { this._renderRoute(points, index) }; }) } ); } @autobind _redrawCanvasOverlay({ctx, width, height, project}) { ctx.clearRect(0, 0, width, height); ROUTES.map((route, index) => route.coordinates.map(project).forEach((p, i) => { const point = [round(p[0], 1), round(p[1], 1)]; ctx.fillStyle = rgb(color(index)).brighter(1).toString(); ctx.beginPath(); ctx.arc(point[0], point[1], 2, 0, Math.PI * 2); ctx.fill(); }) ); } render() { const viewport = { ...this.state.viewport, ...this.props }; return ( , ); } }