0

Is there a library available in Python 3.6 using which I could convert a GeoJSON object (geometry) into a bounding box object?

Actually I am calling a WMS layer from GeoServer and I want to set the bounds of the map to the bounding box of the requested polygon (WMS layer) so the only method I could figure out to get bounds of an individual polygon from geometry is to get the geometry of the polygon using a getfeatureInfo request of WMS service and then converting that geojson to bounding box at the backend.

If there is any other method that I could do to get the bbox of an individual polygon from geoserver using WMS service then please suggest it?

Ian Turton
  • 81,417
  • 6
  • 84
  • 185
Gaurav
  • 85
  • 2
  • 10

3 Answers3

6

You can probably use the geojson package to handle the JSON parsing, then finding the min/max corners of the bounding box is something like:

import geojson

def bbox(coord_list):
     box = []
     for i in (0,1):
         res = sorted(coord_list, key=lambda x:x[i])
         box.append((res[0][i],res[-1][i]))
     ret = f"({box[0][0]} {box[1][0]}, {box[0][1]} {box[1][1]})"
     return ret

# obviously you need to parse your json here
poly=geojson.Polygon([[(2.38, 57.322), (23.194, -20.28), (-120.43, 19.15), (2.38, 57.322)]])
line = bbox(list(geojson.utils.coords(poly)))
print(line)

which gives (-120.43 -20.28, 23.194 57.322) as a result.

Ian Turton
  • 81,417
  • 6
  • 84
  • 185
  • If your polygon cross 180, -180 longitude this may not work. Lucky nothing "live" there – James Sep 09 '22 at 08:30
2
import numpy as np
import geojson

def get_bounding_box(geometry):
    coords = np.array(list(geojson.utils.coords(geometry)))
    return coords[:,0].min(), coords[:,0].max(),
           coords[:,1].min(), coords[:,1].max()
0

After extracting the coordinates with geojson.utils.coords as described in the existing answers, the bounds function of the shapely packages might be used:

from geojson.utils import coords
from shapely.geometry import LineString

def get_bbox(geometry): return LineString(coords(geometry)).bounds

geometry might be a parsed GeoJSON file, the bounding box is returned as tuple with 4 floats.

phispi
  • 101
  • 1