示例#1
0
    def testCtor(self):
        box = QgsBox3d(5.0, 6.0, 7.0, 10.0, 11.0, 12.0)

        self.assertEqual(box.xMinimum(), 5.0)
        self.assertEqual(box.yMinimum(), 6.0)
        self.assertEqual(box.zMinimum(), 7.0)
        self.assertEqual(box.xMaximum(), 10.0)
        self.assertEqual(box.yMaximum(), 11.0)
        self.assertEqual(box.zMaximum(), 12.0)

        box = QgsBox3d(QgsPointV2(QgsWkbTypes.PointZ, 5, 6, 7),
                       QgsPointV2(QgsWkbTypes.PointZ, 10, 11, 12))
        self.assertEqual(box.xMinimum(), 5.0)
        self.assertEqual(box.yMinimum(), 6.0)
        self.assertEqual(box.zMinimum(), 7.0)
        self.assertEqual(box.xMaximum(), 10.0)
        self.assertEqual(box.yMaximum(), 11.0)
        self.assertEqual(box.zMaximum(), 12.0)

        # point constructor should normalize
        box = QgsBox3d(QgsPointV2(QgsWkbTypes.PointZ, 10, 11, 12),
                       QgsPointV2(QgsWkbTypes.PointZ, 5, 6, 7))
        self.assertEqual(box.xMinimum(), 5.0)
        self.assertEqual(box.yMinimum(), 6.0)
        self.assertEqual(box.zMinimum(), 7.0)
        self.assertEqual(box.xMaximum(), 10.0)
        self.assertEqual(box.yMaximum(), 11.0)
        self.assertEqual(box.zMaximum(), 12.0)
示例#2
0
        def exportToQgsCircularStringV2(self):
            """Export CADCircle to a QgsCircularStringV2"""
            quadrant = self.quadrant()
            quad = [QgsPointV2(p.x, p.y) for p in quadrant] + \
                   [QgsPointV2(quadrant[0].x, quadrant[0].y)]
            QgsCircString = QgsCircularStringV2()
            QgsCircString.setPoints(quad)

            return QgsCircString
示例#3
0
 def _snapCursorPoint(self, cursorPoint):
     res, snapResults = self._snapper.snapToBackgroundLayers(cursorPoint)
     if (res != 0 or len(snapResults) < 1):
         clicked = self.toMapCoordinates(cursorPoint)
         clickedV2 = QgsPointV2(clicked)
         return clicked, clickedV2, False
     else:
         # Take a copy as QGIS will delete the result!
         snapped = QgsPoint(snapResults[0].snappedVertex)
         snappedV2 = QgsPointV2(snapped)
         return snapped, snappedV2, True
示例#4
0
 def map(self, p):
     # move to origin (translation part 1)
     p = QgsPointV2(p.x() - self.dx1, p.y() - self.dy1)
     # scale
     p = QgsPointV2(self.ds * p.x(), self.ds * p.y())
     # rotation
     p = QgsPointV2(
         math.cos(self.da) * p.x() - math.sin(self.da) * p.y(),
         math.sin(self.da) * p.x() + math.cos(self.da) * p.y())
     # remove to right spot (translation part 2)
     p = QgsPointV2(p.x() + self.dx2, p.y() + self.dy2)
     return p
示例#5
0
 def _addGridLinesToLayer(self,
                          layer,
                          transformer,
                          originX,
                          intervalX,
                          repeatX,
                          originY,
                          intervalY,
                          repeatY,
                          attributes,
                          localFieldX='local_x',
                          localFieldY='local_x',
                          mapFieldX='map_x',
                          mapFieldY='map_y'):
     if (layer is None or not layer.isValid()
             or layer.geometryType() != QGis.Line):
         return
     features = []
     terminusX = originX + (intervalX * repeatX)
     terminusY = originY + (intervalY * repeatY)
     for localX in range(originX, originX + (intervalX * repeatX) + 1,
                         intervalX):
         localStartPoint = QgsPointV2(localX, originY)
         localEndPoint = QgsPointV2(localX, terminusY)
         mapStartPoint = transformer.map(localStartPoint)
         mapEndPoint = transformer.map(localEndPoint)
         feature = QgsFeature(layer.dataProvider().fields())
         lineGeometry = QgsLineStringV2()
         lineGeometry.setPoints([mapStartPoint, mapEndPoint])
         feature.setGeometry(QgsGeometry(lineGeometry))
         self._setAttributes(feature, attributes)
         feature.setAttribute(localFieldX, localX)
         feature.setAttribute(mapFieldX, mapStartPoint.x())
         features.append(feature)
     for localY in range(originY, originY + (intervalY * repeatY) + 1,
                         intervalY):
         localStartPoint = QgsPointV2(originX, localY)
         localEndPoint = QgsPointV2(terminusX, localY)
         mapStartPoint = transformer.map(localStartPoint)
         mapEndPoint = transformer.map(localEndPoint)
         feature = QgsFeature(layer.dataProvider().fields())
         lineGeometry = QgsLineStringV2()
         lineGeometry.setPoints([mapStartPoint, mapEndPoint])
         feature.setGeometry(QgsGeometry(lineGeometry))
         self._setAttributes(feature, attributes)
         feature.setAttribute(localFieldY, localY)
         feature.setAttribute(mapFieldY, mapStartPoint.y())
         features.append(feature)
     layers.addFeatures(features, layer)
示例#6
0
 def _addGridPointsToLayer(self,
                           layer,
                           transformer,
                           originX,
                           intervalX,
                           repeatX,
                           originY,
                           intervalY,
                           repeatY,
                           attributes,
                           localFieldX='local_x',
                           localFieldY='local_x',
                           mapFieldX='map_x',
                           mapFieldY='map_y'):
     if (layer is None or not layer.isValid()
             or layer.geometryType() != QGis.Point):
         return
     features = []
     for localX in range(originX, originX + (intervalX * repeatX) + 1,
                         intervalX):
         for localY in range(originY, originY + (intervalY * repeatY) + 1,
                             intervalY):
             localPoint = QgsPointV2(localX, localY)
             mapPoint = transformer.map(localPoint)
             feature = QgsFeature(layer.dataProvider().fields())
             feature.setGeometry(QgsGeometry(mapPoint))
             self._setAttributes(feature, attributes)
             feature.setAttribute(localFieldX, localX)
             feature.setAttribute(localFieldY, localY)
             feature.setAttribute(mapFieldX, mapPoint.x())
             feature.setAttribute(mapFieldY, mapPoint.y())
             features.append(feature)
     layers.addFeatures(features, layer)
示例#7
0
 def __mid_12(self):
     """
     To get the middle between point 1 and point 2
     :return: the middle point 1-2
     """
     return QgsPointV2(old_div((self.__p1.x() + self.__p2.x()), 2),
                       old_div((self.__p1.y() + self.__p2.y()), 2))
示例#8
0
 def __mid_23(self):
     """
     To get the middle between point 2 and point 3
     :return: the middle poinr 2-3
     """
     return QgsPointV2(old_div((self.__p2.x() + self.__p3.x()), 2),
                       old_div((self.__p2.y() + self.__p3.y()), 2))
示例#9
0
 def __linePreview(self, point):
     """
     To create a line geometry preview (rubberBand)
     :param point: new position as mapPoint
     """
     line_v2, curved = GeometryV2.asLineV2(
         self.__selectedFeature.geometry(), self.__iface)
     vertex = QgsPointV2()
     line_v2.pointAt(self.__selectedVertex, vertex)
     self.__rubberBand = QgsRubberBand(self.canvas(), QGis.Line)
     dx = vertex.x() - point.x()
     dy = vertex.y() - point.y()
     if isinstance(curved, (list, tuple)):
         self.__newFeature = QgsCompoundCurveV2()
         for pos in range(line_v2.nCurves()):
             curve_v2 = self.__newCurve(curved[pos], line_v2.curveAt(pos),
                                        dx, dy)
             self.__newFeature.addCurve(curve_v2)
             if pos == 0:
                 self.__rubberBand.setToGeometry(
                     QgsGeometry(curve_v2.curveToLine()), None)
             else:
                 self.__rubberBand.addGeometry(
                     QgsGeometry(curve_v2.curveToLine()), None)
     else:
         self.__newFeature = self.__newCurve(curved, line_v2, dx, dy)
         self.__rubberBand.setToGeometry(
             QgsGeometry(self.__newFeature.curveToLine()), None)
示例#10
0
    def processAlgorithm(self, progress):
        source = self.getParameterValue(self.INPUT)
        vlayer = dataobjects.getObjectFromUri(source)
        output = self.getOutputFromName(self.OUTPUT)

        fields = vlayer.fields()
        x_field_index = fields.lookupField(self.getParameterValue(self.XFIELD))
        y_field_index = fields.lookupField(self.getParameterValue(self.YFIELD))
        z_field_index = None
        if self.getParameterValue(self.ZFIELD):
            z_field_index = fields.lookupField(self.getParameterValue(self.ZFIELD))
        m_field_index = None
        if self.getParameterValue(self.MFIELD):
            m_field_index = fields.lookupField(self.getParameterValue(self.MFIELD))

        wkb_type = QgsWkbTypes.Point
        if z_field_index is not None:
            wkb_type = QgsWkbTypes.addZ(wkb_type)
        if m_field_index is not None:
            wkb_type = QgsWkbTypes.addM(wkb_type)

        crsId = self.getParameterValue(self.TARGET_CRS)
        target_crs = QgsCoordinateReferenceSystem()
        target_crs.createFromUserInput(crsId)

        writer = output.getVectorWriter(fields, wkb_type, target_crs)

        features = vector.features(vlayer)
        total = 100.0 / len(features)

        for current, feature in enumerate(features):
            progress.setPercentage(int(current * total))
            attrs = feature.attributes()

            try:
                x = float(attrs[x_field_index])
                y = float(attrs[y_field_index])

                point = QgsPointV2(x, y)

                if z_field_index is not None:
                    try:
                        point.addZValue(float(attrs[z_field_index]))
                    except:
                        point.addZValue(0.0)

                if m_field_index is not None:
                    try:
                        point.addMValue(float(attrs[m_field_index]))
                    except:
                        point.addMValue(0.0)

                feature.setGeometry(QgsGeometry(point))
            except:
                pass  # no geometry

            writer.addFeature(feature)

        del writer
示例#11
0
 def _addGridPolygonsToLayer(self,
                             layer,
                             transformer,
                             originX,
                             intervalX,
                             repeatX,
                             originY,
                             intervalY,
                             repeatY,
                             attributes,
                             localFieldX='local_x',
                             localFieldY='local_x',
                             mapFieldX='map_x',
                             mapFieldY='map_y'):
     if (layer is None or not layer.isValid()
             or layer.geometryType() != QGis.Polygon):
         return
     features = []
     for localX in range(originX, originX + intervalX * repeatX, intervalX):
         for localY in range(originY, originY + intervalY * repeatY,
                             intervalY):
             localPoint = QgsPointV2(localX, localY)
             mapPoint = transformer.map(localPoint)
             points = []
             points.append(transformer.map(localPoint))
             points.append(
                 transformer.map(QgsPointV2(localX, localY + intervalY)))
             points.append(
                 transformer.map(
                     QgsPointV2(localX + intervalX, localY + intervalY)))
             points.append(
                 transformer.map(QgsPointV2(localX + intervalX, localY)))
             feature = QgsFeature(layer.dataProvider().fields())
             lineGeometry = QgsLineStringV2()
             lineGeometry.setPoints(points)
             polygonGeometry = QgsPolygonV2()
             polygonGeometry.setExteriorRing(lineGeometry)
             feature.setGeometry(QgsGeometry(polygonGeometry))
             self._setAttributes(feature, attributes)
             feature.setAttribute(localFieldX, localX)
             feature.setAttribute(localFieldY, localY)
             feature.setAttribute(mapFieldX, mapPoint.x())
             feature.setAttribute(mapFieldY, mapPoint.y())
             features.append(feature)
     layers.addFeatures(features, layer)
示例#12
0
 def translateFeatures(self, layer, xInterval, yInterval, allFeatures):
     localOriginPoint = QgsPointV2(0, 0)
     localTranslatedPoint = QgsPointV2(xInterval, yInterval)
     mapOriginPoint = self.localTransformer.map(localOriginPoint)
     mapTranslatedPoint = self.localTransformer.map(localTranslatedPoint)
     dx = mapTranslatedPoint.x() - mapOriginPoint.x()
     dy = mapTranslatedPoint.y() - mapOriginPoint.y()
     if layer.startEditing():
         featureIds = None
         if allFeatures:
             featureIds = layer.allFeatureIds()
         else:
             featureIds = layer.selectedFeaturesIds()
         for featureId in featureIds:
             layer.translateFeature(featureId, dx, dy)
         if layer.commitChanges():
             return self.updateLayerCoordinates(layer, False, False)
     return False
示例#13
0
        def exportToQgsCircularStringV2(self):
            """Export CADCircle to a QgsCircularStringV2"""
            QgsCircString = QgsCircularStringV2()
            QgsCircString.setPoints([
                QgsPointV2(p)
                for p in [self._ptStart, self._ptArc, self._ptEnd]
            ])

            return QgsCircString
示例#14
0
 def center(self):
     mid_12 = self.__mid_12()
     mid_23 = self.__mid_23()
     slop_12 = self.__slop_p_12()
     slop_23 = self.__slop_p_23()
     x = (mid_23.y() - mid_12.y() + slop_12 * mid_12.x() -
          slop_23 * mid_23.x()) / (slop_12 - slop_23)
     y = (x - mid_12.x()) * slop_12 + mid_12.y()
     return QgsPointV2(x, y)
示例#15
0
    def canvasMoveEvent(self, event):
        """
        When the mouse is moved
        :param event: mouse event
        """
        if self.__selecting:
            self.__rubber.reset()
            firstV2 = QgsPointV2(self.first)
            second = QgsPointV2(self.first.x(), event.mapPoint().y())
            third = QgsPointV2(event.mapPoint())
            fourth = QgsPointV2(event.mapPoint().x(), self.first.y())

            lineV2 = QgsLineStringV2()
            lineV2.setPoints([firstV2, second, third, fourth, firstV2])
            polygonV2 = QgsPolygonV2()
            polygonV2.setExteriorRing(lineV2)
            self.geom = QgsGeometry(polygonV2)
            self.__rubber.setToGeometry(self.geom, None)
示例#16
0
    def getProjection(self, p):
        """
        Get the p projection on segment
        :param p: QgsPointV2
        :param pProj: QgsPointV2 reference
        :return: bool
        """
        s1 = QgsPointV2(self.idxFrom.point())
        s2 = QgsPointV2(self.idxTo.point())
        nx = s2.y() - s1.y()
        ny = -(s2.x() - s1.x())
        if s1 == s2:
            return s1
        t = (p.x() * ny - p.y() * nx - s1.x() * ny + s1.y() * nx) / ((s2.x() - s1.x()) * ny - (s2.y() - s1.y()) * nx)
        if t < 0. or t > 1.:
            return False

        pProj = QgsPointV2(s1.x() + (s2.x() - s1.x()) * t, s1.y() + (s2.y() - s1.y()) * t)
        return pProj
示例#17
0
 def canvasMoveEvent(self, event):
     """
     When the mouse is moved
     :param event: mouse event
     """
     if self.__isSelected:
         dots = QgsLineStringV2()
         dots.addVertex(self.__startVertex)
         dots.addVertex(QgsPointV2(event.mapPoint()))
         self.__rubberDots.reset()
         self.__rubberDots.setToGeometry(QgsGeometry(dots.clone()), None)
示例#18
0
 def __pointPreview(self, point):
     """
     To create a point geometry preview (rubberBand)
     :param point: new position as mapPoint
     """
     point_v2 = GeometryV2.asPointV2(self.__selectedFeature.geometry())
     self.__newFeature = QgsPointV2(point.x(), point.y())
     self.__newFeature.addZValue(point_v2.z())
     self.__rubberBand = QgsRubberBand(self.__canvas, QGis.Point)
     self.__rubberBand.setToGeometry(QgsGeometry(self.__newFeature.clone()),
                                     None)
示例#19
0
 def __createPoint(tab):
     """
     To create a new QGSPointV2 from coordinates
     :param tab: coordinates
     :return: QGSPointV2
     """
     pointV2 = QgsPointV2(float(tab[0]), float(tab[1]))
     if len(tab) > 2:
         pointV2.addZValue(float(tab[2]))
     if len(tab) > 3:
         pointV2.addMValue(float(tab[3]))
     return pointV2
示例#20
0
 def pasteMapPointFromClipboard(self):
     # TODO Use QgsClipboard when it becomes public
     text = QApplication.clipboard().text().strip().upper()
     idx = text.find('POINT(')
     if idx >= 0:
         idx_l = idx + 5
         idx_r = text.find(')', idx_l) + 1
         text = text[idx_l:idx_r]
     if (text[0] == '(' and text[len(text) - 1] == ')'):
         coords = text[1:len(text) - 2].split()
         point = QgsPointV2(float(coords[0]), float(coords[1]))
         self.setMapPoint(point)
示例#21
0
 def testContainsPoint(self):
     box = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0)
     self.assertTrue(box.contains(QgsPointV2(QgsWkbTypes.PointZ, 6, 7, 8)))
     self.assertFalse(box.contains(QgsPointV2(QgsWkbTypes.PointZ, 16, 7, 8)))
     self.assertFalse(box.contains(QgsPointV2(QgsWkbTypes.PointZ, 6, 17, 8)))
     self.assertFalse(box.contains(QgsPointV2(QgsWkbTypes.PointZ, 6, 7, 18)))
     # 2d containment
     self.assertTrue(box.contains(QgsPointV2(QgsWkbTypes.Point, 6, 7)))
     self.assertFalse(box.contains(QgsPointV2(QgsWkbTypes.Point, 16, 7)))
     self.assertFalse(box.contains(QgsPointV2(QgsWkbTypes.Point, 6, 17)))
示例#22
0
 def __newPoint(angle, point, distance):
     """
     To create a new point at a certain distance and certain azimut from another point
     :param angle: the azimut
     :param point: the reference point
     :param distance: the distance
     :return: the new QgsPoint (with same elevation than parameter point)
     """
     x = point.x() + cos(angle) * distance
     y = point.y() + sin(angle) * distance
     pt = QgsPointV2(x, y)
     pt.addZValue(point.z())
     return pt
示例#23
0
 def center(self):
     """
     To get the center of the arc
     :return: the arc center
     """
     mid_12 = self.__mid_12()
     mid_23 = self.__mid_23()
     slop_12 = self.__slop_p_12()
     slop_23 = self.__slop_p_23()
     x = old_div((mid_23.y() - mid_12.y() + slop_12 * mid_12.x() -
                  slop_23 * mid_23.x()), (slop_12 - slop_23))
     y = (x - mid_12.x()) * slop_12 + mid_12.y()
     return QgsPointV2(x, y)
示例#24
0
 def __newCurve(self, curved, line_v2, dx, dy):
     if curved:
         newCurve = QgsCircularStringV2()
     else:
         newCurve = QgsLineStringV2()
     points = []
     for pos in xrange(line_v2.numPoints()):
         x = line_v2.pointN(pos).x() - dx
         y = line_v2.pointN(pos).y() - dy
         pt = QgsPointV2(x, y)
         pt.addZValue(line_v2.pointN(pos).z())
         points.append(pt)
     newCurve.setPoints(points)
     return newCurve
示例#25
0
    def __ok(self, withVertex, withPoint):
        line_v2, curved = GeometryV2.asLineV2(
            self.__selectedFeature.geometry())
        vertex_v2 = QgsPointV2()
        vertex_id = QgsVertexId()
        line_v2.closestSegment(QgsPointV2(self.__mapPoint), vertex_v2,
                               vertex_id, 0)

        x0 = line_v2.xAt(vertex_id.vertex - 1)
        y0 = line_v2.yAt(vertex_id.vertex - 1)
        d0 = Finder.sqrDistForCoords(x0, vertex_v2.x(), y0, vertex_v2.y())
        x1 = line_v2.xAt(vertex_id.vertex)
        y1 = line_v2.yAt(vertex_id.vertex)
        d1 = Finder.sqrDistForCoords(x1, vertex_v2.x(), y1, vertex_v2.y())
        z0 = line_v2.zAt(vertex_id.vertex - 1)
        z1 = line_v2.zAt(vertex_id.vertex)
        vertex_v2.addZValue((d0 * z1 + d1 * z0) / (d0 + d1))

        if withPoint:
            pt_feat = QgsFeature(self.__layer.pendingFields())
            pt_feat.setGeometry(QgsGeometry(vertex_v2))

            if self.__layer.editFormConfig().suppress(
            ) == QgsEditFormConfig.SuppressOn:
                self.__layer.addFeature(pt_feat)
            else:
                self.__iface.openFeatureForm(self.__layer, pt_feat)

        if withVertex:
            line_v2.insertVertex(vertex_id, vertex_v2)
            self.__lastLayer.changeGeometry(self.__selectedFeature.id(),
                                            QgsGeometry(line_v2))
        self.__lastLayer.removeSelection()
        self.__rubber.reset()
        self.__lastFeatureId = None
        self.__selectedFeature = None
        self.__isEditing = False
示例#26
0
 def createGridDialogAccepted(self):
     mp1 = self.gridWizard.mapPoint1()
     lp1 = self.gridWizard.localPoint1()
     mp2 = self.gridWizard.mapPoint2()
     lp2 = self.gridWizard.localPoint2()
     xInterval = self.gridWizard.localEastingInterval()
     yInterval = self.gridWizard.localNorthingInterval()
     if self.gridWizard.methodType() != GridWizard.TwoKnownPoints:
         axisGeometry = QgsGeometry.fromPolyline([mp1, mp2])
         if self.gridWizard.methodType() == GridWizard.PointOnYAxis:
             if axisGeometry.length() < yInterval:
                 self._plugin.showCriticalMessage(
                     'Cannot create grid: Input axis must be longer than local interval'
                 )
                 return False
             mp2 = axisGeometry.interpolate(yInterval).geometry()
             lp2 = QgsPointV2(lp1.x(), lp1.y() + yInterval)
         else:
             if axisGeometry.length() < xInterval:
                 self._plugin.showCriticalMessage(
                     'Cannot create grid: Input axis must be longer than local interval'
                 )
                 return False
             mp2 = axisGeometry.interpolate(xInterval).geometry()
             lp2 = QgsPointV2(lp1.x() + xInterval, lp1.y())
     if self.createGrid(self.gridWizard.siteCode(),
                        self.gridWizard.gridName(), mp1, lp1, mp2, lp2,
                        self.gridWizard.localOriginPoint(),
                        self.gridWizard.localTerminusPoint(), xInterval,
                        yInterval):
         self._plugin.mapCanvas().refresh()
         self.loadGridNames()
         self.setGrid(self.gridWizard.siteCode(),
                      self.gridWizard.gridName())
         self._setReadOnly(False)
         self._plugin.showInfoMessage('Grid successfully created', 10)
示例#27
0
 def __snapToIntersection(self, mapPoint, selectedFeature):
     """
     To check is we can snap a close intersection
     :param mapPoint: the point to check
     :param selectedFeature: the feature that can intersect another one
     :return: an intersection QgsPointV2 or none
     """
     f = Finder.findClosestFeatureAt(mapPoint, self.__linesConfig, self)
     if f is None:
         return None
     intersect = Finder.intersect(selectedFeature.geometry(), f.geometry(),
                                  mapPoint)
     if intersect is not None:
         return QgsPointV2(intersect)
     else:
         return None
示例#28
0
 def projPointOnSegment(self, p, s1, s2):
     """
     p: QgsPointV2
     s1: QgsPointV2 of segment
     s2: QgsPointV2 of segment
     """
     nx = s2.y() - s1.y()
     ny = -( s2.x() - s1.x() )
     if s1 == s2:
         return s1
     t = ( p.x() * ny - p.y() * nx - s1.x() * ny + s1.y() * nx ) / ( ( s2.x() - s1.x() ) * ny - ( s2.y() - s1.y() ) * nx )
     if t < 0.:
         return s1
     elif t > 1.:
         return s2
     else:
         return QgsPointV2( s1.x() + ( s2.x() - s1.x() ) * t, s1.y() + ( s2.y() - s1.y() ) * t )
示例#29
0
 def updateLayerCoordinates(self, layer, updateGeometry, createMapFields):
     if (not self._initialised or layer is None or not layer.isValid()
             or layer.geometryType() != QGis.Point):
         return False
     local_x = 'local_x'
     local_y = 'local_y'
     map_x = 'map_x'
     map_y = 'map_y'
     if layer.startEditing():
         if layer.fieldNameIndex(local_x) < 0:
             layer.dataProvider().addAttributes(
                 [self._plugin.field('local_x')])
         if layer.fieldNameIndex(local_y) < 0:
             layer.dataProvider().addAttributes(
                 [self._plugin.field('local_y')])
         if (createMapFields and layer.fieldNameIndex(map_x) < 0):
             layer.dataProvider().addAttributes(
                 [self._plugin.field('map_x')])
         if (createMapFields and layer.fieldNameIndex(map_y) < 0):
             layer.dataProvider().addAttributes(
                 [self._plugin.field('map_y')])
         local_x_idx = layer.fieldNameIndex(local_x)
         local_y_idx = layer.fieldNameIndex(local_y)
         map_x_idx = layer.fieldNameIndex(map_x)
         map_y_idx = layer.fieldNameIndex(map_y)
         if updateGeometry:
             for feature in layer.getFeatures():
                 localPoint = QgsPointV2(feature.attribute(local_x),
                                         feature.attribute(local_y))
                 mapPoint = self.localTransformer.map(localPoint)
                 layer.changeGeometry(feature.id(), QgsGeometry(mapPoint))
         for feature in layer.getFeatures():
             mapPoint = feature.geometry().geometry()
             localPoint = self.mapTransformer.map(mapPoint)
             layer.changeAttributeValue(feature.id(), local_x_idx,
                                        localPoint.x())
             layer.changeAttributeValue(feature.id(), local_y_idx,
                                        localPoint.y())
             layer.changeAttributeValue(feature.id(), map_x_idx,
                                        mapPoint.x())
             layer.changeAttributeValue(feature.id(), map_y_idx,
                                        mapPoint.y())
         return layer.commitChanges()
     return False
示例#30
0
    def __onDstOk(self):
        """
        When the Ok button in Intersect Distance Dialog is pushed
        """
        self.__distance = float(self.__dstDlg.observation().text())
        circle = QgsCircularStringV2()
        x = self.__dstDlg.mapPoint().x()
        y = self.__dstDlg.mapPoint().y()
        circle.setPoints([
            QgsPointV2(x + self.__distance * cos(pi / 180 * a),
                       y + self.__distance * sin(pi / 180 * a))
            for a in range(0, 361, 90)
        ])
        lineLayer = self.__lineLayer()
        lineLayer.startEditing()
        feature = QgsFeature()
        feature.setGeometry(QgsGeometry(circle))
        fields = lineLayer.pendingFields()
        feature.setFields(fields)
        fieldsNames = [fields.at(pos).name() for pos in range(fields.count())]
        if "distance" in fieldsNames:
            feature.setAttribute("distance", self.__distance)
        if "x" in fieldsNames:
            feature.setAttribute("x", self.__dstDlg.mapPoint().x())
        if "y" in fieldsNames:
            feature.setAttribute("y", self.__dstDlg.mapPoint().y())
        lineLayer.addFeature(feature)
        # lineLayer.updateExtents()
        lineLayer.commitChanges()

        # center
        pointLayer = self.__pointLayer()
        pointLayer.startEditing()
        feature = QgsFeature()
        feature.setGeometry(QgsGeometry().fromPoint(self.__dstDlg.mapPoint()))
        fields = pointLayer.pendingFields()
        feature.setFields(fields)
        pointLayer.addFeature(feature)
        pointLayer.commitChanges()

        self.__dstDlg.accept()
        self.__cancel()