Neste artigo, você pode encontrar uma visão geral sobre diferentes bibliotecas de mapeamento React. Muitos de nossos projetos são sobre visualizações de dados e mapas. Ao longo de dois anos, temos construído a maioria de nossos aplicativos com React. No início, apenas usamos Leaflet dentro de um componente React. Agora estamos usando principalmente React Leaflet que é um wrapper React para Leaflet.
Todos os exemplos incluídos neste artigo podem ser encontrados no repositório do GitHub make-maps-with-react se você quiser brincar um pouco.
Suporte para WebGL
Antes de você começar a desenvolver o seu mapa, você deve decidir se precisa ou não de suporte WebGL. Você deve considerar o uso de WebGL se você tem um monte de recursos a serem exibidos ao mesmo tempo, digamos marcadores de 10k, por exemplo. Para um mapa normal, uma biblioteca sem suporte WebGL será suficiente.
React Leaflet
Como mencionado anteriormente, essa é a biblioteca que mais usamos. Leaflet é uma biblioteca de mapeamento muito sólida e esse é o wrapper do React. Ele é ativamente mantido e já usa a versão Leaflet 1.0.0.
A API é bastante simples se você estiver acostumado com a API Leaflet. Os componentes diferentes estão bem documentados e já existem alguns bons plugins de terceiros. Para ver o mapa, você também precisa adicionar Leaflet.css. Estamos importando isso em nosso arquivo main.styl.
Instalação:
yarn add react-leaflet leaflet react react-dom
Componente React:
Você pode encontrar o exemplo completo no repositório GitHub.
class ReactLeafletMap extends PureComponent { render() { // create an array with marker components const LeafletMarkers = markers.map(marker => ( <Marker position={marker.latlng} key={`marker_${marker.name}`}> <Popup> <span>{marker.name}</span> </Popup> </Marker> )); return ( <div className="map"> <Map center={mapConfig.center} zoom={mapConfig.zoom} className="map__reactleaflet"> <TileLayer url="https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png" attribution='© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>, © <a href="https://carto.com/attribution">CARTO</a>' /> {LeafletMarkers} </Map> </div> ); } }
Mapas Pigeon
Essa é uma biblioteca de mapeamento muito especial porque ela não tem dependências externas. Por enquanto, você pode apenas exibir sobreposições e marcadores em um mapa base, então isso pode ser útil para um mapa de localizador muito simples. Até agora, não há pop-ups para os marcadores implementados, então você precisaria encontrar sua própria lógica. Para obter mais informações, consulte a página do projeto.
Instalação
yarn add pigeon-maps pigeon-marker
Componente React
Você pode encontrar o exemplo completo no repositório GitHub.
class PigeonMaps extends PureComponent { onMarkerClick(evt) { console.log(evt.payload); } render() { // create an array with marker components const PigeonMarkers = markers.map(marker => ( <Marker key={`marker_${marker.name}`} anchor={marker.latlng} payload={marker.name} onClick={this.onMarkerClick} /> )); return ( <div className="map"> <Map width={window.innerWidth} height={600} defaultCenter={mapConfig.center} defaultZoom={mapConfig.zoom} provider={getProvider} > {PigeonMarkers} </Map> </div> ); } }
Google Map React
A biblioteca do Google Map React envolve o seu mapa do Google como um componente React. O legal sobre isso é que ele permite que você renderize qualquer componente React no mapa, o que lhe dá a oportunidade de criar facilmente marcadores personalizados. Outra característica útil é que os componentes fornecidos pela API do Google Maps (por exemplo, Camadas de Tráfego ou Trânsito ou uma caixa de pesquisa) também podem ser incluídos no mapa.
Certifique-se de incluir a chave da API do Google Maps. A configuração é muito simples:
Instalação:
yarn add google-map-react react
Componente React:
O exemplo completo está disponível no repositório GitHub.
const CustomMarker = ({ text }) => <div className="custom-marker"><p>{text}</p></div>; class GoogleMapReactComponent extends PureComponent { render() { const GoogleMapsMarkers = markers.map(marker => ( <CustomMarker key={`marker_${marker.name}`} lat={marker.latlng[0]} lng={marker.latlng[1]} text={marker.name} /> )); return ( <GoogleMapReact defaultCenter={mapConfig.center} defaultZoom={mapConfig.zoom} layerTypes={['TrafficLayer', 'TransitLayer']} bootstrapURLKeys={{ key: CONFIG.GOOGLE_MAPS_API_KEY, language: 'de' }} > {GoogleMapsMarkers} </GoogleMapReact> ); } }
React MapGL
Se você precisar de suporte para WebGL em seu projeto, deve considerar o uso de React MapGL. Ele é um wrapper react para Mapbox GL que usa o WebGL para fazer mapas a partir de tiles vetoriais.
A biblioteca tem uma API pequena e algumas sobreposições de amostra como scatterplot de dispersão. Outras sobreposições úteis são fornecidas, por exemplo, por deck.gl. Como exemplo, criamos um mapa simples usando a sobreposição scatterplot. Na próxima seção, você pode encontrar uma versão que usa deck.gl.
A configuração é um pouco complicada e os documentos parecem ser um pouco confusos porque o readme do repositório e os documentos são diferentes. Observe que é necessário instalar immutable e fornecer uma chave Mapbox API para começar.
Instalação:
yarn add react-map-gl immutable react react-dom
Componente React:
Você pode encontrar o exemplo completo no repositório GitHub.
class ReactMapGL extends PureComponent { constructor(props) { super(props); this.state = { viewport: { width: window.innerWidth, height: 600, latitude: mapConfig.center[0], longitude: mapConfig.center[1], zoom: mapConfig.zoom, isDragging: false, startDragLngLat: mapConfig.center, pitch: 50, bearing: 0 } }; this.onChangeViewport = this.onChangeViewport.bind(this); } onChangeViewport(viewport) { this.setState({ viewport: { ...this.state.viewport, ...viewport } }); } render() { const { viewport } = this.state; return ( <div className="reactmapgl"> <MapGL {...viewport} mapboxApiAccessToken={CONFIG.MAPBOX_ACCESS_TOKEN} perspectiveEnabled onChangeViewport={this.onChangeViewport} > <ScatterplotOverlay {...viewport} locations={locations} dotRadius={2} globalOpacity={1} compositeOperation="screen" dotFill="#1FBAD6" renderWhileDragging /> </MapGL> </div> ); } }
React MapGL com Deck.GL
Deck.GL foi desenvolvido pela equipe do Uber e é um framework que fornece belas sobreposições para mapas renderizados com Mapbox GL. No site do projeto, você encontrará um tutorial que mostra como implementar diferentes camadas em seu mapa. O exemplo abaixo usa o GeoJsonLayer e o ScreenGridLayer (com 50.000 pontos).
Instalação:
yarn add react-map-gl immutable react react-dom deck.gl luma.gl
Componente React:
Você pode encontrar o exemplo completo no repositório GitHub.
class ReactMapGLDeckGL extends PureComponent { constructor(props) { super(props); this.state = { viewport: { width: window.innerWidth, height: 600, latitude: mapConfig.center[0], longitude: mapConfig.center[1], zoom: mapConfig.zoom, isDragging: false, startDragLngLat: mapConfig.center, pitch: 50, bearing: 0 }, geojson: null }; requestJson('data/berlin_bezirke.json', (error, response) => { if (!error) { this.setState({ geojson: response }); } }); this.onChangeViewport = this.onChangeViewport.bind(this); } onChangeViewport(viewport) { this.setState({ viewport: { ...this.state.viewport, ...viewport } }); } initialize(gl) { gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE, gl.ONE_MINUS_DST_ALPHA, gl.ONE); gl.blendEquation(gl.FUNC_ADD); } render() { const { viewport, geojson } = this.state; const geosjsonLayer = new GeoJsonLayer({ id: 'geojson-layer', data: geojson, filled: false, stroked: true, lineWidthMinPixels: 1, lineWidthScale: 1, getLineColor: d => [175, 175, 175] }); const screenGridLayer = new ScreenGridLayer({ id: 'screen-grid-layer', data: scatterPlotData, cellSizePixels: 10, minColor: [43, 140, 190, 0], maxColor: [43, 140, 190, 255] }); return ( <div className="reactmapgldeckgl"> <MapGL {...viewport} mapboxApiAccessToken={CONFIG.MAPBOX_ACCESS_TOKEN} mapStyle="mapbox://styles/mapbox/dark-v9" perspectiveEnabled onChangeViewport={this.onChangeViewport} > <DeckGL {...viewport} layers={[geosjsonLayer, screenGridLayer]} onWebGLInitialized={this.initialize} /> </MapGL> </div> ); } }
***
Christine Wiederer faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://blog.webkid.io/making-maps-with-react/.