examples/website/map-tile/app.js (66 lines of code) (raw):

import React from 'react'; import {render} from 'react-dom'; import DeckGL from '@deck.gl/react'; import {MapView} from '@deck.gl/core'; import {TileLayer} from '@deck.gl/geo-layers'; import {BitmapLayer, PathLayer} from '@deck.gl/layers'; const INITIAL_VIEW_STATE = { latitude: 47.65, longitude: 7, zoom: 4.5, maxZoom: 20, maxPitch: 89, bearing: 0 }; /* global window */ const devicePixelRatio = (typeof window !== 'undefined' && window.devicePixelRatio) || 1; function getTooltip({tile}) { return tile && `tile: x: ${tile.x}, y: ${tile.y}, z: ${tile.z}`; } export default function App({showBorder = false, onTilesLoad = null}) { const tileLayer = new TileLayer({ // https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tile_servers data: [ 'https://a.tile.openstreetmap.org/{z}/{x}/{y}.png', 'https://b.tile.openstreetmap.org/{z}/{x}/{y}.png', 'https://c.tile.openstreetmap.org/{z}/{x}/{y}.png' ], // Since these OSM tiles support HTTP/2, we can make many concurrent requests // and we aren't limited by the browser to a certain number per domain. maxRequests: 20, pickable: true, onViewportLoad: onTilesLoad, autoHighlight: showBorder, highlightColor: [60, 60, 60, 40], // https://wiki.openstreetmap.org/wiki/Zoom_levels minZoom: 0, maxZoom: 19, tileSize: 512 / devicePixelRatio, renderSubLayers: props => { const { bbox: {west, south, east, north} } = props.tile; return [ new BitmapLayer(props, { data: null, image: props.data, bounds: [west, south, east, north] }), showBorder && new PathLayer({ id: `${props.id}-border`, data: [[[west, north], [west, south], [east, south], [east, north], [west, north]]], getPath: d => d, getColor: [255, 0, 0], widthMinPixels: 4 }) ]; } }); return ( <DeckGL layers={[tileLayer]} views={new MapView({repeat: true})} initialViewState={INITIAL_VIEW_STATE} controller={true} getTooltip={getTooltip} /> ); } export function renderToDOM(container) { render(<App />, container); }