def control(self): self.ids = [] self.polynum = self.ml.featureCount() feat = QgsFeature() provider = self.ml.dataProvider() feats = provider.getFeatures() self.emit(SIGNAL("runStatus(PyQt_PyObject)"), 0) self.emit(SIGNAL("runRange(PyQt_PyObject)"), (0, self.polynum)) ne = 0 while feats.nextFeature(feat): ne += 1 self.emit(SIGNAL("runStatus(PyQt_PyObject)"), ne) geom = QgsGeometry(feat.geometry()) if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) self.ids.append(feat.id())
def control(self): self.ids = [] self.polynum = self.ml.featureCount() feat = QgsFeature() provider = self.ml.dataProvider() feats = provider.getFeatures() #self.emit(SIGNAL("runStatus(PyQt_PyObject)"), 0) #self.emit(SIGNAL("runRange(PyQt_PyObject)"), (0, self.polynum)) ne = 0 while feats.nextFeature(feat): ne += 1 #self.emit(SIGNAL("runStatus(PyQt_PyObject)"), ne) geom = QgsGeometry(feat.geometry()) if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) self.ids.append(feat.id())
def convSplus(self, prec): for i in range(0, self.polynum): j = i + 1 self.plainTextEdit.appendPlainText("%s area%s" % (j, j)) self.plainTextEdit.appendPlainText("") mod = min(self.ids) p = 1 if mod == 1: p = 0 for ne in range(mod, self.polynum + mod): pn = 1 feat = QgsFeature() geom = QgsGeometry() fiter = self.ml.getFeatures(QgsFeatureRequest(ne)) if fiter.nextFeature(feat): geom = QgsGeometry(feat.geometry()) id = feat.id() + p if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") if pn >= 10000: QMessageBox.information( self, "Too many points", "Polygon No. %s contains to many points to read into GeoBUGS.\nSimplifying of polygon can solve this problem." % (id), buttons=QMessageBox.Ok, defaultButton=QMessageBox.NoButton) self.progressBar.setValue(100 * id / self.polynum) self.plainTextEdit.appendPlainText("END")
def convSplus(self, prec): for i in range(0, self.polynum): j = i + 1 self.plainTextEdit.appendPlainText("%s area%s" % (j, j)) self.plainTextEdit.appendPlainText("") mod = min(self.ids) p = 1 if mod==1: p = 0 for ne in range(mod, self.polynum + mod): pn = 1 feat = QgsFeature() geom = QgsGeometry() fiter = self.ml.getFeatures(QgsFeatureRequest(ne)) if fiter.nextFeature(feat): geom = QgsGeometry(feat.geometry()) id = feat.id()+p if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") if pn >= 10000: QMessageBox.information(self, "Too many points", "Polygon No. %s contains to many points to read into GeoBUGS.\nSimplifying of polygon can solve this problem." % (id), buttons=QMessageBox.Ok, defaultButton=QMessageBox.NoButton) self.progressBar.setValue(100 * id / self.polynum) self.plainTextEdit.appendPlainText("END")
def qGeometry(feature): try: geom = QgsGeometry(feature.geometry()) fid = feature.id() if not geom.isMultipart(): if not geom.convertToMultiType(): raise Exception("unable to extract feature geometry (invalid geometry type)") if geom.type() == 0: return qPoints(geom.asMultiPoint()) elif geom.type() == 1: return qLines(geom.asMultiPolyline(), fid) elif geom.type() == 2: return qPolygons(geom.asMultiPolygon(), fid) else: raise Exception("unable to extract feature geometry (unknown geometry type)") except Exception, e: raise Exception("unable to extract feature geometry: %s" % unicode(e))
class GeometryHighlight(QgsMapCanvasItem): _mapCanvas = None # QgsMapCanvas _geometry = None # QgsGeometry() _brush = QBrush() _pen = QPen() def __init__(self, mapCanvas, geometry, layer): super(GeometryHighlight, self).__init__(mapCanvas) self._mapCanvas = mapCanvas if not geometry or not isinstance(geometry, QgsGeometry) or geometry.isEmpty() or not geometry.isGeosValid(): return self._geometry = QgsGeometry(geometry) # Force deep copy self.setLineColor(Project.highlightLineColor()) self.setFillColor(Project.highlightFillColor()) if (layer and self._mapCanvas.mapSettings().hasCrsTransformEnabled()): ct = self._mapCanvas.mapSettings().layerTransform(layer) if ct: self._geometry.transform(ct) self.updateRect() self.update() def remove(self): self._mapCanvas.scene().removeItem(self) def setLineWidth(self, width): self._pen.setWidth(width) def setLineColor(self, color): lineColor = QColor(color) lineColor.setAlpha(255) self._pen.setColor(lineColor) def setFillColor(self, fillColor): self._brush.setColor(fillColor) self._brush.setStyle(Qt.SolidPattern) def updatePosition(self): pass # protected: def paint(self, painter, option=None, widget=None): # Override if not self._geometry: return painter.setPen(self._pen) painter.setBrush(self._brush) wkbType = self._geometry.wkbType() if wkbType == QGis.WKBPoint or wkbType == QGis.WKBPoint25D: self._paintPoint(painter, self._geometry.asPoint()) elif wkbType == QGis.WKBMultiPoint or wkbType == QGis.WKBMultiPoint25D: for point in self._geometry.asMultiPoint(): self._paintPoint(painter, point) elif wkbType == QGis.WKBLineString or wkbType == QGis.WKBLineString25D: self._paintLine(painter, self._geometry.asPolyline()) elif wkbType == QGis.WKBMultiLineString or wkbType == QGis.WKBMultiLineString25D: for line in self._geometry.asMultiPolyline(): self._paintLine(painter, line) elif wkbType == QGis.WKBPolygon or wkbType == QGis.WKBPolygon25D: self._paintPolygon(painter, self._geometry.asPolygon()) elif wkbType == QGis.WKBMultiPolygon or wkbType == QGis.WKBMultiPolygon25D: for polygon in self._geometry.asMultiPolygon(): self._paintPolygon(painter, polygon) def updateRect(self): if self._geometry: r = self._geometry.boundingBox() if r.isEmpty(): d = self._mapCanvas.extent().width() * 0.005 r.setXMinimum(r.xMinimum() - d) r.setYMinimum(r.yMinimum() - d) r.setXMaximum(r.xMaximum() + d) r.setYMaximum(r.yMaximum() + d) self.setRect(r) self.setVisible(True) else: self.setRect(QgsRectangle()) # private: def _paintPoint(self, painter, point): painter.drawEllipse(self.toCanvasCoordinates(point) - self.pos(), 2, 2) def _paintLine(self, painter, line): polyline = QPolygonF() for point in line: polyline.append(self.toCanvasCoordinates(point) - self.pos()) painter.drawPolyline(polyline) def _paintPolygon(self, painter, polygon): path = QPainterPath() for line in polygon: ring = QPolygonF() for point in line: cur = self.toCanvasCoordinates(point) - self.pos() ring.append(cur) ring.append(ring[0]) path.addPolygon(ring) painter.drawPath(path)
def getSchnittpunkteAusPolygonen(self, overlapFeats, featureCrs, laengsProfil, feedback): schnittpunktFeatures = [] schnittLinesFeatures = [] ioFeat = 0 countPoints = 0 try: for feat in overlapFeats: #Feature bekommt neues Attribut Station if ioFeat == 0: fields = feat.fields() fields.append(QgsField("station", QVariant.Double)) schnittpunktFeaturesOfThisPolygon = [] schnittpunktListOfPolygon = [ ] #Liste [points, stations, feature.id's] #check if Multipolygon iMulti = 0 iRing = 0 tempGeom = QgsGeometry() tempGeom.fromWkb(feat.geometry().asWkb()) #transform geom to Project.crs() if crs a different if not featureCrs.authid() == QgsProject.instance().crs( ).authid(): trafo = QgsCoordinateTransform(featureCrs, QgsProject.instance().crs(), QgsProject.instance()) #transform Geom to Project.crs() tempGeom.transform(trafo, QgsCoordinateTransform.ForwardTransform, False) if tempGeom.isMultipart(): multiGeom = tempGeom.asMultiPolygon() #Schleife zum Auflösen des Multiparts for polygon in multiGeom: for ring in polygon: points = [] for pxy in ring: #feedback.pushInfo(str(iMulti)+" "+str(iRing)+" "+str(pxy) + " " + str(type(pxy))) points.append(QgsPoint(pxy.x(), pxy.y())) singlePolygon = QgsGeometry().fromPolyline(points) iRing = iRing + 1 #feedback.pushInfo(str(iMulti) + str(type(singlePolygon)) + str(polygon)) schnittpunktFeaturesOfThisPolygonItem = self.makeIntersectionFeatures( feat, singlePolygon, laengsProfil, fields, feedback) for spfotp in schnittpunktFeaturesOfThisPolygonItem: schnittpunktFeaturesOfThisPolygon.append( spfotp) #Liste [points, stations, feature.id's] schnittpunktListOfPolygonItem = self.makeIntersectionPointsStationList( feat, singlePolygon, laengsProfil, fields, feedback) for sp in schnittpunktListOfPolygonItem: schnittpunktListOfPolygon.append(sp) iMulti = iMulti + 1 else: # single Geometry schnittpunktFeaturesOfThisPolygon = self.makeIntersectionFeatures( feat, tempGeom, laengsProfil, fields, feedback) schnittpunktListOfPolygon = self.makeIntersectionPointsStationList( feat, tempGeom, laengsProfil, fields, feedback) #create LineFeatures schnittLinesFeats = self.makeLineFeaturesFromPointStationList( feat, schnittpunktListOfPolygon, laengsProfil, feedback) for f in schnittLinesFeats: schnittLinesFeatures.append(f) #add to list for schnittFeat in schnittpunktFeaturesOfThisPolygon: #Intersection Feature in project.crs() schnittpunktFeatures.append(schnittFeat) #feedback.pushInfo(str(schnittFeat.attributes())) ioFeat = ioFeat + 1 #count Intersections countPoints = countPoints + len( schnittpunktFeaturesOfThisPolygon) except: msg = self.tr( "Error: Creating Intersections Geometry {0} Feature {1}" ).format(str(type(feat.geometry())), str(feat.attributes())) feedback.reportError(msg) raise QgsProcessingException(msg) msgInfo = self.tr("Intersected Lines: {0} Intersections: {1}").format( ioFeat, countPoints) feedback.pushInfo(msgInfo) return schnittpunktFeatures, schnittLinesFeatures