1

I'm having difficulties to get the bounding box of a polygon. My code is the following:

def getBoundingBox(self):
    boundingBox = []
    polygon = self.getVectorLayer()
    vertices = polygon.geometry().asPolygon()

    xmax = vertices[0].x()
    xmin = vertices[0].x()
    ymax = vertices[0].y()
    ymin = vertices[0].y()

    for vertice in vertices:
        if vertice.x() > xmax:
            xmax = vertice.x()
        if vertice.x() < xmin:
            xmin = vertice.x()
        if vertice.y() > ymax:
            ymax = vertice.y()
        if vertice.y() < ymin:
            ymin = vertice.y()

    boundingBox.append(xmax)
    boundingBox.append(xmin)
    boundingBox.append(ymax)
    boundingBox.append(ymin)

    return boundingBox

The error message I get is

AttributeError: 'QgsVectorLayer' object has no attribute 'geometry'

The function self.getVectorLayer() works perfectly fine for other tools I wrote, thus this shouldn't be the problem. With the line xmax = vertices[0].x() I wanted to get the first vertice in the polygon, which probalby doesn't work that way, but it seems the problem starts even earlier.

Any ideas?

Taras
  • 32,823
  • 4
  • 66
  • 137
DGIS
  • 2,527
  • 16
  • 36
  • 1
    possible duplicated https://gis.stackexchange.com/q/79248/49538 – Fran Raga Nov 22 '19 at 19:09
  • 1
    if you check "layer = iface.activeLayer()", then dir(layer) you'll see there's no attribute "geometry", maybe you can use "layer.extent()" which returns the coordinates as well. Maybe you are looking for "layer.getFeature().geometry()" – Elio Diaz Nov 22 '19 at 19:35

1 Answers1

2

You're confusing a feature with a vector layer.

A feature is a row on a vector layer that may contain attributes and geometry. A vector layer is a set of features that represent "the same kind of data", like a set of roads.

(Im being really simplistic with this explanation, please look more into it)

Now, assuming that you want the bounding box of all features in a vector layer, select all the features in the vector layer and use the method boundingBoxOfSelected()

def getBoundingBox(self):
    layer = self.getVectorLayer()
    layer.selectAll()
    return layer.boundingBoxOfSelected()
xlDias
  • 516
  • 2
  • 7
  • this looks super useful. Thank you for that. Just one more question to make sure I got it right. If I wright in another function something like

    bbox = self.getBoundingBox()

    and then I want the xMax value of my bounding box I can acces it with bbox.xMax because bbox is an object that includes the four double variables xMin, yMin, xMax, yMax.

    Am I right

    – DGIS Nov 23 '19 at 16:17
  • Almost right, the actual attribute to access would be bbox.xMaximum(). As described in the docs for QgsRectangle (which is the class of the object returned by the boundingBoxOfSelected method) – xlDias Nov 25 '19 at 18:14