I'm trying to add a GeoJSON line to show car direction between a point A and a point B ( like they have in the official documentation of mapbox-gl-js (https://www.mapbox.com/mapbox-gl-js/example/geojson-line/)
But the docs of react-map-gl doesn't talk about that at all.
How can I achieve something similar to this using https://uber.github.io/react-map-gl/#/Documentation/introduction/introduction :
here's my code so far :
class MapPage extends Component {
constructor(props) {
super(props);
this.state = {
viewport: {
latitude: 38.63738602787579,
longitude: -121.23576311149986,
zoom: 6.8,
bearing: 0,
pitch: 0,
dragPan: true,
width: 600,
height: 600
}
};
}
render() {
const { viewport } = this.state;
return (
<ReactMapGL
{...viewport}
mapboxApiAccessToken={MAPBOX_TOKEN}
onViewportChange={newViewport => {
this.setState({ viewport: newViewport });
}}
/>
);
}
}
You can upload GeoJSON files to Mapbox as tilesets using Mapbox Tiling Service or as datasets or tilesets using the Mapbox Uploads API. You can also upload GeoJSON files to Mapbox Studio, which uses the Uploads API, as either datasets or tilesets.
The preferred way to draw lines within Mapbox GL JS is to express the lines as GeoJSON and add them to the map as a GeoJSONSource / line layer pair. You might find this example of drawing a GeoJSON line and this example of drawing a great arc line helpful.
The map provided by Mapbox doesn't have a Polyline component by default but we can leverage on other components that gives us the same result as what we get from Google Maps Polylines. To add a polyline on our map, we would be using the ShapeSource and LineLayer component provided by Mapbox.
Style markers First, add the CSS you'll need to style your markers. In this case, add the image file you downloaded as the background-image for a class called marker . In your same index. html file, copy and paste the code inside your style tag below the #map declaration.
Applicable for those who are using react-map-gl Version 5.0 onwards
As of October 2019, react-map-gl
supports Layer and Source components, which is meant to allow developers to render Mapbox layers on the Mapbox canvas without the need to call getMap()
to expose the underlying native Mapbox API.
You may refer to the original Mapbox Source and Layer documentations for the full specifications for the valid values for the Layer
and Source
props.
This is how the Source
and Layer
components can be used together with the code you have provided to generatea GeoJSON line on your map.
class MapPage extends Component {
constructor(props) {
super(props);
this.state = {
viewport: {
latitude: 38.63738602787579,
longitude: -121.23576311149986,
zoom: 6.8,
bearing: 0,
pitch: 0,
dragPan: true,
width: 600,
height: 600
}
};
}
render() {
const { viewport } = this.state;
return (
<ReactMapGL
{...viewport}
mapboxApiAccessToken={MAPBOX_TOKEN}
onViewportChange={newViewport => {
this.setState({ viewport: newViewport });
}}
>
<Source id='polylineLayer' type='geojson' data={polylineGeoJSON}>
<Layer
id='lineLayer'
type='line'
source='my-data'
layout={{
'line-join': 'round',
'line-cap': 'round',
}}
paint={{
'line-color': 'rgba(3, 170, 238, 0.5)',
'line-width': 5,
}}
/>
</Source>
</ReactMapGL>
);
}
}
You can get the mapbox-gl map object once the component mounts, then you can work with it directly. Try something like this:
class MapPage extends Component {
constructor(props) {
super(props);
this.state = {
viewport: {
latitude: 38.63738602787579,
longitude: -121.23576311149986,
zoom: 6.8,
bearing: 0,
pitch: 0,
dragPan: true,
width: 600,
height: 600
}
};
}
componentDidMount(){
const map = this.reactMap.getMap();
map.on('load', () => {
//add the GeoJSON layer here
map.addLayer({...})
})
}
render() {
const { viewport } = this.state;
return (
<ReactMapGL
ref={(reactMap) => this.reactMap = reactMap} />
{...viewport}
mapboxApiAccessToken={MAPBOX_TOKEN}
onViewportChange={newViewport => {
this.setState({ viewport: newViewport });
}}
/>
);
}
}
React Refs: https://reactjs.org/docs/refs-and-the-dom.html
GetMap(): https://uber.github.io/react-map-gl/#/Documentation/api-reference/static-map?section=methods
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With