Skip to content

Instantly share code, notes, and snippets.

@tomsoderlund
Created June 22, 2020 09:50
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save tomsoderlund/a2040d659aafe4064e4060f561aca6d1 to your computer and use it in GitHub Desktop.
Save tomsoderlund/a2040d659aafe4064e4060f561aca6d1 to your computer and use it in GitHub Desktop.
Using fitBounds in ReactMapGL to center points on map
import React, { useState } from 'react'
import ReactMapGL, { Marker, WebMercatorViewport } from 'react-map-gl'
const applyToArray = (func, array) => func.apply(Math, array)
const getBoundsForPoints = (points) => {
// Calculate corner values of bounds
const pointsLong = points.map(point => point.coordinates._long)
const pointsLat = points.map(point => point.coordinates._lat)
const cornersLongLat = [
[applyToArray(Math.min, pointsLong), applyToArray(Math.min, pointsLat)],
[applyToArray(Math.max, pointsLong), applyToArray(Math.max, pointsLat)]
]
// Use WebMercatorViewport to get center longitude/latitude and zoom
const viewport = new WebMercatorViewport({ width: 800, height: 600 })
.fitBounds(cornersLongLat, { padding: 200 }) // Can also use option: offset: [0, -100]
const { longitude, latitude, zoom } = viewport
return { longitude, latitude, zoom }
}
const Map = ({ points }) => {
const bounds = getBoundsForPoints(points)
const [viewport, setViewport] = useState({
width: '100%',
height: '50vh',
...bounds
})
return (
<ReactMapGL
{...viewport}
onViewportChange={setViewport}
mapStyle='mapbox://styles/mapbox/streets-v9'
mapboxApiAccessToken={mapboxPublicToken}
>
{points.map((point, index) => (
<Marker
key={index}
latitude={point.coordinates._lat}
longitude={point.coordinates._long}
offsetLeft={-20}
offsetTop={-10}
>
<div>{point.name}</div>
</Marker>
))}
</ReactMapGL>
)
}
export default Map
@yihong0618
Copy link

@tomsoderlund
Really help me, Thanks a lot.

@zdarovka
Copy link

Thank you!

@Ali-Albaker
Copy link

Thanks, very helpful

@Achiaga
Copy link

Achiaga commented Feb 20, 2023

Awesome code! thanks.

@barmettlerl
Copy link

barmettlerl commented Feb 22, 2023

Thanks

@barmettlerl
Copy link

Btw. WebMercatorViewport is not in 'react-map-gl' anymore

I used viewport-mercator-project

@geoffraymond
Copy link

👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment