Example #1
0
    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())
Example #2
0
    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())
Example #3
0
    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")
Example #4
0
    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")
Example #5
0
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))
Example #6
0
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)
Example #7
0
    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