+(function(window, undefined) {
+ function _getCommonBounds(bounds) {
+ return bounds.reduce(function(prev, cur) {
+ return [Math.min(prev[0], cur[0]), Math.min(prev[1], cur[1]), Math.max(prev[2], cur[2]), Math.max(prev[3], cur[3])]
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
+ function _getGeometryBounds(coords, type) {
+ return [coords[0], coords[1], coords[0], coords[1]];
+ return coords.reduce(function(prev, cur) {
+ return [Math.min(prev[0], cur[0]), Math.min(prev[1], cur[1]), Math.max(prev[2], cur[0]), Math.max(prev[3], cur[1])]
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
+ case "MultiLineString":
+ return _getCommonBounds(coords.map(function(lineString) {
+ return _getGeometryBounds(lineString, "LineString");
+ return _getCommonBounds(coords.map(function(polygon) {
+ return _getGeometryBounds(polygon, "Polygon");
+ function getGeometryBounds(geometry) {
+ if (geometry.bbox) return geometry.bbox;
+ if (geometry.type === "GeometryCollection")
+ return _getCommonBounds(geometry.geometries.map(getGeometryBounds));
+ return _getGeometryBounds(geometry.coordinates, geometry.type)
+ function getFeatureBounds(feature) {
+ return getGeometryBounds(feature.geometry);
+ function getBounds(obj) {
+ if (obj.bbox) return obj.bbox;
+ if (obj.coordinates || obj.geometries) return getGeometryBounds(obj);
+ if (obj.type === "Feature") return getFeatureBounds(obj);
+ if (obj.type === "FeatureCollection") return _getCommonBounds(obj.features.map(getFeatureBounds));
+ var GeoJSONUtils = function() {}
+ GeoJSONUtils.prototype = {
+ getCommonBounds: _getCommonBounds
+ window.gjutils = new GeoJSONUtils();