def create_polygon(outer, inners): outer_line = create_line(outer, False) qgs_pol = QgsPolygon() qgs_pol.setExteriorRing(outer_line) for inner in inners: inner_line = create_line(inner, False) qgs_pol.addInteriorRing(inner_line) qgs_geom = QgsGeometry(qgs_pol) return qgs_geom
def get_qgs_feature(self): """Reconstruct the original QgsFeature with the new geometry. :return: The new QgsFeature :rtype: QgsFeature """ qgs_pol = QgsPolygon() qgs_pol.setExteriorRing(self.rb_geom[0].qgs_geom.constGet().clone()) for rb_geom in self.rb_geom[1:]: qgs_pol.addInteriorRing(rb_geom.qgs_geom.constGet().clone()) self.qgs_feature.setGeometry(qgs_pol) return self.qgs_feature
def read_polygon(self, boundary): """Reads the specified polygon""" g = QgsPolygon() i = 0 for ring in boundary: poly = [] for point in ring: poly.append(point) r = QgsLineString(poly) if i == 0: g.setExteriorRing(r) else: g.addInteriorRing(r) i = 1 return g
def splitPolygon(self, geom): z_func = lambda x, y: self.valueOnSurface(x, y) or 0 cache = FunctionCacheXY(z_func) z_func = cache.func polygons = QgsMultiPolygon() for poly in self._splitPolygon(geom): p = QgsPolygon() ring = QgsLineString() for pt in poly[0]: ring.addVertex(QgsPoint(pt.x(), pt.y(), z_func(pt.x(), pt.y()))) p.setExteriorRing(ring) for bnd in poly[1:]: ring = QgsLineString() for pt in bnd: ring.addVertex(QgsPoint(pt.x(), pt.y(), z_func(pt.x(), pt.y()))) p.addInteriorRing(ring) polygons.addGeometry(p) return QgsGeometry(polygons)
def createGeom(self, coords): crsDest = self.__layer.crs() rc = ReprojectCoordinates(self.crsId, crsDest.srsid(), self.__hasZ, self.__hasM) if self.crsId != crsDest.srsid(): coordsPoint = list(rc.reproject(coords, True)) else: coordsPoint = list(rc.copyCoordstoPoints(coords)) # Point and multipoint Geometry # Always 1 part, 0 element of matrix if self.__layergeometryType == QgsWkbTypes.PointGeometry: if self.__isMultiType: multipoint = QgsMultiPoint() for coords_item in coordsPoint[0][1]: multipoint.addGeometry(coords_item) geom = QgsGeometry(multipoint) self.createFeature(geom) else: geom = QgsGeometry(coordsPoint[0][1][0]) self.createFeature(geom) elif self.__layergeometryType == QgsWkbTypes.LineGeometry: if self.__isMultiType: multiline = QgsGeometry(QgsMultiLineString()) for j in range(len(coordsPoint)): line = QgsLineString(coordsPoint[j][1]) multiline.addPart(line) self.createFeature(multiline) else: line = QgsGeometry(QgsLineString(coordsPoint[0][1])) self.createFeature(line) elif self.__layergeometryType == QgsWkbTypes.PolygonGeometry: if self.__isMultiType: multipoly = QgsGeometry(QgsMultiPolygon()) for i in range(len(coordsPoint)): if int(coordsPoint[i][0]) > 0: mycurve = QgsLineString(coordsPoint[i][1]) poly = QgsPolygon() poly.setExteriorRing(mycurve) polyGeometry = QgsGeometry(QgsPolygon(poly)) for j in range(len(coordsPoint)): if int(coordsPoint[j][0]) < 0: containsAllPoints = True for k in range(len(coordsPoint[j][1])): containsAllPoints = True curPoint = coordsPoint[j][1][k].clone() containsAllPoints = containsAllPoints \ and polyGeometry.contains(QgsPointXY(curPoint.x(), curPoint.y())) if containsAllPoints: mycurve = QgsLineString(coordsPoint[j][1]) poly.addInteriorRing(mycurve) multipoly.addPart(poly) self.createFeature(multipoly) else: extRing = 0 for i in range(len(coordsPoint)): if int(coordsPoint[i][0]) > 0: extRing = i mycurve = QgsLineString(coordsPoint[extRing][1]) poly = QgsPolygon() poly.setExteriorRing(mycurve) polyGeometry = QgsGeometry(QgsPolygon(poly)) for i in range(len(coordsPoint)): if int(coordsPoint[i][0]) < 0: containsAllPoints = True for j in range(len(coordsPoint[i][1])): containsAllPoints = True curPoint = coordsPoint[i][1][j].clone() containsAllPoints = containsAllPoints \ and polyGeometry.contains(QgsPointXY(curPoint.x(), curPoint.y())) if containsAllPoints: mycurve = QgsLineString(coordsPoint[i][1]) poly.addInteriorRing(mycurve) else: QMessageBox.question(self.iface.mainWindow(), self.translate_str("Ring not in exterior contour"), self.translate_str("The new geometry of the feature" " isn't valid. Do you want to use it anyway?"), QMessageBox.Yes, QMessageBox.No) self.createFeature(QgsGeometry(poly))