Skip to content

Instantly share code, notes, and snippets.

@alexbodn
Created March 18, 2024 14:15
Show Gist options
  • Save alexbodn/d55294c52e9978be3370885fe94f3e5a to your computer and use it in GitHub Desktop.
Save alexbodn/d55294c52e9978be3370885fe94f3e5a to your computer and use it in GitHub Desktop.
calculate the extent of a geoJSON geometry
/**
* @data : Object object parsed from a geoJSON file.
* @options: used internally as this function calls itself recursively.
**/
const dataExtent = (data, {depth=0, inCoordinates=false, extent}={}) => {
if (!extent) {
extent = [[Infinity, Infinity], [-Infinity, -Infinity]];
}
if (Array.isArray(data)) {
if (
inCoordinates &&
data.length > 1 &&
typeof data[0] === 'number' &&
typeof data[1] === 'number'
) {
extent[0][0] = Math.min(extent[0][0], data[0]);
extent[1][0] = Math.max(extent[1][0], data[0]);
extent[0][1] = Math.min(extent[0][1], data[1]);
extent[1][1] = Math.max(extent[1][1], data[1]);
}
else {
for (let chunk of data) {
extent = dataExtent(
chunk, {depth: depth + 1, inCoordinates, extent});
}
}
}
else if (data && typeof data === 'object') {
for (let [key, chunk] of Object.entries(data)) {
if (key === 'coordinates') {
inCoordinates = true;
}
extent = dataExtent(
chunk, {depth: depth + 1, inCoordinates, extent});
}
}
if (depth === 0) {
extent = [
extent[0],
[
extent[1][0],
extent[0][1],
],
extent[1],
[
extent[0][0],
extent[1][1],
],
];
}
return extent;
}
//usage:
//this function takes as argument
//an object resulting from parsing
//the content of a geoJSON file.
//the returned value is an array of
//four points surrounding all the points
//in the input file.
//this may be used
//in leaflet as a bounding box
//and in openlayers as the extent of a map.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment