Пример #1
0
    def paint_extent(self, rec):
        self.roi_x_max = rec.xMaximum()
        self.ui.XMaxLineEdit.setText(str(round(rec.xMaximum(), 3)))
        self.roi_y_min = rec.yMinimum()
        self.ui.YMinLineEdit.setText(str(round(rec.yMinimum(), 3)))
        self.roi_x_min = rec.xMinimum()
        self.ui.XMinLineEdit.setText(str(round(rec.xMinimum(), 3)))
        self.roi_y_max = rec.yMaximum()
        self.ui.YMaxLineEdit.setText(str(round(rec.yMaximum(), 3)))

        if self.extent:
            self.canvas.scene().removeItem(self.extent)
            self.extent = None
        self.extent = QgsRubberBand(self.canvas, True)
        points = [
            QgsPoint(self.roi_x_max, self.roi_y_min),
            QgsPoint(self.roi_x_max, self.roi_y_max),
            QgsPoint(self.roi_x_min, self.roi_y_max),
            QgsPoint(self.roi_x_min, self.roi_y_min),
            QgsPoint(self.roi_x_max, self.roi_y_min)
        ]
        self.extent.setToGeometry(QgsGeometry.fromPolyline(points), None)
        self.extent.setColor(QColor(227, 26, 28, 255))
        self.extent.setWidth(5)
        self.extent.setLineStyle(Qt.PenStyle(Qt.DashLine))
        self.canvas.refresh()
Пример #2
0
 def run(self):
     area_type_dict = {}  # (key: area_type, value: nsite index list)
     d = QgsDistanceArea()  # 计算距离
     allNSiteFeatures = getFeaturesList(self.nsiteLayer)
     # 把所有的nsite按区域类型分类
     for nsiteFeature in allNSiteFeatures:
         area_type = nsiteFeature[u"区域类型"]
         if area_type not in [u"普通市区", u"密集市区", u"农村", u"郊区乡镇"]:
             area_type = u"普通市区"
         if not area_type_dict.has_key(area_type):
             area_type_dict[area_type] = [nsiteFeature]
         else:
             t = area_type_dict[area_type]
             t.append(nsiteFeature)
             area_type_dict[area_type] = t
             del t
     total = len(allNSiteFeatures)  # 写进度条
     progess = Progess(self.parent, total, u"优化中...")
     progess.show()
     delete_list = []  # 要删除的 nsiteFeaures.id() list
     for (area_type, nsiteFeatures_list) in area_type_dict.items():
         if area_type == u"密集市区":
             mergeDis = 200
         elif area_type == u"郊区乡镇":
             mergeDis = 500
         elif area_type == u"农村":
             mergeDis = 800
         else:
             # 默认普通市区
             mergeDis = 300
         for nsiteFeatures1 in nsiteFeatures_list:
             progess.count()
             lon1 = nsiteFeatures1[u"经度"]
             lat1 = nsiteFeatures1[u"纬度"]
             point1 = QgsPoint(float(lon1), float(lat1))
             rectangle = createARectangleByCenterPoint(point1, 2000)
             if nsiteFeatures1.id() in delete_list:
                 progess.count()
                 continue
             else:
                 request = QgsFeatureRequest()
                 request.setFilterRect(rectangle)
                 for nsiteFeature2 in self.nsiteLayer.getFeatures(request):
                     if nsiteFeatures1.id() == nsiteFeature2.id():
                         continue
                     if nsiteFeature2.id() in delete_list:
                         continue
                     lon2 = nsiteFeatures1[u"经度"]
                     lat2 = nsiteFeatures1[u"纬度"]
                     point2 = QgsPoint(float(lon2), float(lat2))
                     distance = d.convertMeasurement(
                         d.measureLine(point1, point2), 2, 0, False)[0]
                     if distance <= mergeDis:
                         delete_list.append(nsiteFeature2.id())
                         break
     progess.kill()
     # 删除features
     delFeatures(self.nsiteLayer, delete_list)
     return True
Пример #3
0
    def gera_tracado_pontos(self,
                            inicial=False,
                            final=False,
                            callback_inst=None,
                            callback_method=None,
                            crs=None):
        if (not (inicial) and not (final)):
            self.callback = eval('callback_inst.%s' % callback_method)
            self.crs = crs
            self.tracado_dlg_inicial = GeraTracadoUI(self.iface)
            self.tracado_dlg_inicial.lblName.setText("Ponto Inicial")
            self.tracado_dlg_inicial.btnCapture.clicked.connect(
                self.capture_point_inicial)
            self.tracado_dlg_final = GeraTracadoUI(self.iface)
            self.tracado_dlg_final.lblName.setText("Ponto Final")
            self.tracado_dlg_final.btnCapture.clicked.connect(
                self.capture_point_final)
        if (not (inicial) and not (final)) or not (final):
            ok = self.tracado_dlg_inicial.exec_()
            if not (ok):
                return None
            else:
                pn = float(
                    self.tracado_dlg_inicial.txtNorth.text().strip().replace(
                        ",", "."))
                pe = float(
                    self.tracado_dlg_inicial.txtEste.text().strip().replace(
                        ",", "."))
                self.gera_tracado_ponto_inicial(QgsPoint(pe, pn))

        if (not (inicial) and not (final)) or not (inicial):
            ok = self.tracado_dlg_final.exec_()
            if not (ok):
                return None
            else:
                pn = float(
                    self.tracado_dlg_final.txtNorth.text().strip().replace(
                        ",", "."))
                pe = float(
                    self.tracado_dlg_final.txtEste.text().strip().replace(
                        ",", "."))
                self.gera_tracado_ponto_final(QgsPoint(pe, pn))

        if inicial and final:
            p1n = float(
                self.tracado_dlg_inicial.txtNorth.text().strip().replace(
                    ",", "."))
            p1e = float(
                self.tracado_dlg_inicial.txtEste.text().strip().replace(
                    ",", "."))
            p2n = float(self.tracado_dlg_final.txtNorth.text().strip().replace(
                ",", "."))
            p2e = float(self.tracado_dlg_final.txtEste.text().strip().replace(
                ",", "."))
            self.iface.mapCanvas().setMapTool(None)
            self.callback(pontos=self.create_line(QgsPoint(p1e, p1n),
                                                  QgsPoint(p2e, p2n),
                                                  "Diretriz"),
                          parte=1)
Пример #4
0
 def get_click_coordenate(self, point, mouse):
     self.actual_point = QgsPoint(point)
     if self.tracado_dlg.txtNorthStart.text().strip() == '':
         self.tracado_dlg.txtNorthStart.setText("%f" %
                                                self.actual_point.y())
         self.tracado_dlg.txtEsteStart.setText("%f" % self.actual_point.x())
     elif self.tracado_dlg.txtNorthEnd.text().strip() == '':
         self.tracado_dlg.txtNorthEnd.setText("%f" % self.actual_point.y())
         self.tracado_dlg.txtEsteEnd.setText("%f" % self.actual_point.x())
Пример #5
0
    def canvasReleaseEvent(self, event: QgsMapMouseEvent):
        if event.button() == Qt.RightButton:
            self.endcapture()
            return

        if not self.editmode:
            point = QgsPoint(event.snapPoint())
            point.addZValue(0)
            self.add_point(point)
        else:
            self.editvertex = None

        self.update_valid_state()
Пример #6
0
def createARectangleByCenterPoint(centerPoint, mradius):
    x0 = centerPoint.x()
    y0 = centerPoint.y()
    delta_x = (1.0 / 111000.0 * mradius)
    delta_y = (1.0 / 111000.0 * mradius * math.cos(y0))
    x1 = x0 - delta_x
    y1 = y0 - delta_y
    point1 = QgsPoint(x1, y1)
    x2 = x0 + delta_x
    y2 = y0 + delta_y
    point2 = QgsPoint(x2, y2)
    rectangle = QgsRectangle(point1, point2)
    return rectangle
Пример #7
0
    def gera_estaca_intermediaria(self,
                                  estaca,
                                  anterior,
                                  prog,
                                  az,
                                  cosa,
                                  cosb,
                                  sobra=0.0):
        dist = sobra if sobra > 0 else self.distancia

        p = QgsPoint(anterior.x() + (dist * cosa),
                     anterior.y() + (dist * cosb))
        prog += dist
        return [estaca, '', prog, p.y(), p.x(), 0.0, az], prog, p
Пример #8
0
    def showRect(self, startPoint, endPoint):
        self.rubberBand.reset(True)
        if startPoint.x() == endPoint.x() or startPoint.y() == endPoint.y():
            return

        point1 = QgsPoint(startPoint.x(), startPoint.y())
        point2 = QgsPoint(startPoint.x(), endPoint.y())
        point3 = QgsPoint(endPoint.x(), endPoint.y())
        point4 = QgsPoint(endPoint.x(), startPoint.y())

        self.rubberBand.addPoint(point1, False)
        self.rubberBand.addPoint(point2, False)
        self.rubberBand.addPoint(point3, False)
        self.rubberBand.addPoint(point4, False)
        self.rubberBand.addPoint(point1, True)  # true to update canvas
        self.rubberBand.show()
    def getPoint(self, mapPoint):
        self.set_rad.setEnabled(True)
        # change tool so you don't get more than one POI
        self.canvas.unsetMapTool(self.emitPoint)
        self.canvas.setMapTool(self.userTool)
        # Get the click
        if mapPoint:
            self.atk_pt = QgsPoint(mapPoint)
            self.distance()
            # Specify the geometry type
            layer = QgsVectorLayer('Point?crs=epsg:28992', 'Attack Point',
                                   'memory')

            style = "style_attack.qml"
            qml_path = self.plugin_dir + "/data/" + style
            layer.loadNamedStyle(qml_path)
            layer.triggerRepaint()

            # Set the provider to accept the data source
            prov = layer.dataProvider()

            # Add a new feature and assign the geometry
            feat = QgsFeature()
            feat.setGeometry(QgsGeometry.fromPoint(mapPoint))
            prov.addFeatures([feat])

            # Update extent of the layer
            layer.updateExtents()

            # Add the layer to the Layers panel
            QgsMapLayerRegistry.instance().addMapLayers([layer])
Пример #10
0
 def add_vertex_avg(self):
     # if turned on
     if roam.config.settings.get('gps_averaging', True):
         # if currently happening
         if roam.config.settings.get('gps_averaging_in_action', True):
             # start -> stop
             # averaging
             average_point = GPS.average_func(GPS.gpspoints)
             point = QgsPoint(average_point[0], average_point[1],
                              average_point[2])
             self.add_point(point)
             self.band.addPoint(QgsPointXY(point))
             # default settings
             vertex_or_point = ''
             in_action = False
             start_time = '0:00:00'
             roam.config.settings['gps_averaging_measurements'] = 0
             self.set_buttons_avg(True)
         else:
             # stop -> start
             # avg settings
             vertex_or_point = 'vertex'
             in_action = True
             start_time = datetime.now()
             self.set_buttons_avg(False)
         roam.config.settings['gps_vertex_or_point'] = vertex_or_point
         roam.config.settings['gps_averaging_in_action'] = in_action
         roam.config.settings['gps_averaging_start_time'] = start_time
         roam.config.save()
     else:
         self.add_vertex()
Пример #11
0
def p2QgsPoint(
    pt,
    pt2=None
):  #Qgis 3.10.0 has a bug where the QgsPoint doesn't accept a QgsPointXY as a constructor
    if pt2 is None:
        try:
            if type(pt) is list:
                if len(pt) == 3:
                    return QgsPoint(pt[0], pt[1], pt[2])
                else:
                    return QgsPoint(pt[0], pt[1])
            else:
                return QgsPoint(pt.x(), pt.y())
        except:
            return QgsPoint(pt)
    else:
        return QgsPoint(pt, pt2)
    def getEvac(self, evac):
        self.canvas.unsetMapTool(self.emitEvac)
        self.select_POI.setEnabled(False)
        self.select_shelter.setEnabled(True)

        if evac:
            self.evac = QgsPoint(evac)
            self.evac_layer, self.evac_feat = self.select(self.evac)
            self.to_evac_table()
    def getShel(self, shel):
        self.canvas.unsetMapTool(self.emitShel)

        if shel:
            self.shel = QgsPoint(shel)
            self.shel_layer, self.shel_feat = self.select(self.shel)
            self.shelter_table()
        if self.evac and self.shel:
            self.shortestRouteButton.setEnabled(True)
    def criticalLocate(self):
        point = None
        try:
            point = QgsPoint(float(self.ui.txtCriticalX.text()), float(self.ui.txtCriticalY.text()))
        except:
            return
        if define._units == QGis.Meters:
            extent = QgsRectangle(point.x() - 350, point.y() - 350, point.x() + 350, point.y() + 350)
        else:
            extent = QgsRectangle(point.x() - 0.005, point.y() - 0.005, point.x() + 0.005, point.y() + 0.005)

        if extent is None:
            return

        QgisHelper.zoomExtent(point, extent, 2)
Пример #15
0
    def exit_dialog(self, points, crs):
        self.dialog.close()

        layer = QgsVectorLayer('LineString', self.name_tracado, "memory")
        pr = layer.dataProvider()
        print points
        anterior = QgsPoint(points[0])
        fets = []
        for p in points[1:]:
            fet = QgsFeature(layer.pendingFields())
            fet.setGeometry(QgsGeometry.fromPolyline([anterior, QgsPoint(p)]))
            fets.append(fet)
            anterior = QgsPoint(p)
        pr.addFeatures(fets)
        self.crs = crs
        layer.setCrs(QgsCoordinateReferenceSystem(int(crs), 0))
        layer.updateExtents()

        QgsMapLayerRegistry.instance().addMapLayer(layer)
Пример #16
0
    def canvasReleaseEvent(self, event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)
        self.p = QgsPoint(point[0], point[1])

        print point, self.p
        print self.p.wellKnownText()
Пример #17
0
class PointTool(QgsMapTool):   
    def __init__(self, canvas):
        QgsMapTool.__init__(self, canvas)
        self.canvas = canvas    

    def canvasPressEvent(self, event):
        pass

    def canvasMoveEvent(self, event):
        #Uncomment Activate point Hovering
        #x = event.pos().x()
        #y = event.pos().y()
        #point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)
        pass

    def canvasReleaseEvent(self, event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)
        self.p = QgsPoint(point[0], point[1])

        print point, self.p
        print self.p.wellKnownText()

    def activate(self):
        pass

    def deactivate(self):
        pass

    def isZoomTool(self):
        return False

    def isTransient(self):
        return False

    def isEditTool(self):
        return True
    
    def getPoint(self):
        return self.p
Пример #18
0
    def paint(self, p, *args):
        super(RubberBand, self).paint(p)

        # p.drawRect(self.boundingRect())
        if not roam.config.settings.get("draw_distance", True):
            return

        offset = QPointF(5, 5)
        nodescount = self.numberOfVertices()
        for index in range(nodescount, -1, -1):
            if index == 0:
                return

            qgspoint = self.getPoint(0, index)
            qgspointbefore = self.getPoint(0, index - 1)
            # No point before means we are the first index and there is nothing
            # before us.
            if not qgspointbefore:
                return

            if qgspoint and qgspointbefore:
                distance = self.distancearea.measureLine(
                    qgspoint, qgspointbefore)
                if int(distance) == 0:
                    continue
                text = QgsDistanceArea.formatDistance(distance,
                                                      3,
                                                      self.unit,
                                                      keepBaseUnit=False)
                linegeom = QgsGeometry.fromPolyline(
                    [QgsPoint(qgspoint),
                     QgsPoint(qgspointbefore)])
                midpoint = linegeom.centroid().asPoint()
                midpoint = self.toCanvasCoordinates(midpoint) - self.pos()
                midpoint += offset
                path = QPainterPath()
                path.addText(midpoint, self.font, text)
                p.setPen(self.blackpen)
                p.setRenderHints(QPainter.Antialiasing)
                p.setFont(self.font)
                p.setBrush(self.whitebrush)
                p.drawPath(path)
Пример #19
0
    def reprojectBoundingBox(self, crsSrc, ogrPoly):
        crsDest = QgsCoordinateReferenceSystem(4326)
        coordinateTransformer = QgsCoordinateTransform(crsSrc, crsDest)

        newPolyline = []
        ring = ogrPoly.GetGeometryRef(0)
        for i in range(ring.GetPointCount()):
            pt = ring.GetPoint(i)
            point = QgsPoint(pt[0], pt[1])
            newPolyline.append(coordinateTransformer.transform(point))
        qgsPolygon = QgsGeometry.fromPolygon([newPolyline])
        return qgsPolygon
Пример #20
0
def createCircle(mpoint, mradius, iface, mapunits=True, segment=64):
    if not mapunits:
        ctx = iface.mapCanvas().mapRenderer().rendererContext()
        mradius *= ctx.scaleFactor() * ctx.mapToPixel().mapUnitsPerPixel()
    pts = []
    for i in range(segment):
        theta = i * (2.0 * math.pi / segment)
        p = QgsPoint(mpoint.x() + mradius * math.cos(theta),
                     mpoint.y() + mradius * math.sin(theta))
        pts.append(p)

    return pts
Пример #21
0
    def gera_tracado_ponto_inicial(self, point):
        self.tracado_dlg_inicial.txtNorth.setText("%f" % point.y())
        self.tracado_dlg_inicial.txtEste.setText("%f" % point.x())
        ok = self.tracado_dlg_inicial.exec_()
        if not (ok):
            return None
        else:
            pn = float(
                self.tracado_dlg_inicial.txtNorth.text().strip().replace(
                    ",", "."))
            pe = float(self.tracado_dlg_inicial.txtEste.text().strip().replace(
                ",", "."))
            self.gera_tracado_ponto_final(QgsPoint(pe, pn))

        #self.gera_tracado_pontos(inicial=True)
        self.gera_tracado_pontos(final=True)
Пример #22
0
    def canvasMoveEvent(self, event: QgsMapMouseEvent):
        if self.is_tracking and not self.capturing or self.editvertex is None:
            return

        point = point_from_event(event, self.snapping)
        if not self.editmode:
            self.pointband.movePoint(point)

        if self.capturing:
            self.band.movePoint(point)

        if self.editmode and self.editvertex is not None:
            found, vertexid = self.geom.vertexIdFromVertexNr(self.editvertex)
            self.geom.get().moveVertex(vertexid, QgsPoint(point))
            self.feature.setGeometry(self.geom)
            self.currentVectorLayer().updateFeature(self.feature)
            self.pointband.setToGeometry(self.toMultiPoint(self.geom), self.currentVectorLayer())
            self.band.setToGeometry(self.geom, self.currentVectorLayer())
Пример #23
0
    def setResultLayer(self, result_list):
        layerName = u'规划基站结果'
        layerType = QGis.WKBPoint
        project_dir = getProjectDir(self.iface)
        # 先判断是否已存在规划基站结果图层
        result_layer = getLayerByName(layerName, self.iface)
        if result_layer:
            #清空数据
            delAllFeatures(result_layer)
        else:
            # 删除原有图层文件
            deleteShapefile(project_dir, layerName)
            shapPath = os.path.join(project_dir, layerName + u".shp")
            # 生成图层
            fileds = self.createFields()
            # 创建出Shap文件
            # 数据源编码模式为GBK2312(否则中文字段会乱码)
            wr = QgsVectorFileWriter(shapPath, "GBK2312", fileds, layerType, None, "ESRI Shapefile")
            # 如果保存的时候没有错误
            if wr.hasError() == QgsVectorFileWriter.NoError:
                pass
            else:
                print wr.hasError()
                raise Exception, wr.errorMessage()  # 发生错误,抛出异常交给外面的方法处理异常
            del wr  # 使添加的字段生效

            result_layer = QgsVectorLayer(shapPath, layerName, 'ogr')
            QgsMapLayerRegistry.instance().addMapLayer(result_layer)

        # 添加数据
        features_list = []
        for result in result_list:
            feature = createABasicPointFeature(QgsPoint(float(result[1]),float(result[2])), result)
            features_list.append(feature)
        importFeaturesToLayer(result_layer, features_list)
        # 合并站点
        mergeNSite = OptimizateNewSite(result_layer, self.parent)
        if mergeNSite.run():
            QMessageBox.information(self.parent, u"自动规划基站", u"自动规划基站成功!")
        else:
            QMessageBox.critical(self.parent, u"自动规划基站", u"自动规划基站失败!")
    def get_del(self, delete):
        self.canvas.unsetMapTool(self.emitDel)

        if delete:
            layer = "Danger Zones"

            min_dist = QgsDistanceArea()
            vl = uf.getLegendLayerByName(self.iface, layer)
            point = QgsPoint(delete)
            feats = vl.getFeatures()
            for feat in feats:
                geom = feat.geometry()
                pt = geom.centroid().asPoint()
                dist = QgsDistanceArea().measureLine(point, pt)
                if dist < min_dist:
                    min_dist = dist
                    fid = feat.id()

            vl.startEditing()
            vl.deleteFeature(fid)
            vl.commitChanges()
Пример #25
0
    def plotar(self):
        vl = QgsVectorLayer("Point", "temporary_points", "memory")
        pr = vl.dataProvider()

        # Enter editing mode
        vl.startEditing()

        # add fields
        pr.addAttributes([
            QgsField("estaca", QVariant.String),
            QgsField("descrição", QVariant.String),
            QgsField("north", QVariant.String),
            QgsField("este", QVariant.String),
            QgsField("cota", QVariant.String),
            QgsField("azimite", QVariant.String)
        ])
        fets = []

        for r in range(self.tableWidget.rowCount()):
            ident = self.tableWidget.item(r, 0).text()
            if ident in ["", None]: break
            fet = QgsFeature(vl.pendingFields())
            n = 0.0
            e = 0.0
            try:
                es = self.tableWidget.item(r, 0).text()
                d = self.tableWidget.item(r, 1).text()
                n = float(self.tableWidget.item(r, 3).text())
                e = float(self.tableWidget.item(r, 4).text())
                c = float(self.tableWidget.item(r, 5).text())
                a = self.tableWidget.item(r, 6).text()
            except:
                break
            fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(e, n)))
            fet.setAttributes([es, d, n, e, c, a])
            fets.append(fet)
        pr.addFeatures(fets)
        vl.commitChanges()
        QgsMapLayerRegistry.instance().addMapLayer(vl)
Пример #26
0
def createSector(mpoint,
                 mradius,
                 iface,
                 mapunits=True,
                 angle=0.0,
                 szAngle=0.0,
                 segment=24):
    if not mapunits:
        ctx = iface.mapCanvas().mapRenderer().rendererContext()
        mradius *= ctx.scaleFactor() * ctx.mapToPixel().mapUnitsPerPixel()
    if type(angle) != float:
        angle = math.pi / 180 * (90.0 - float(angle))
    szAngle = math.pi / 180 * szAngle
    pts = []
    pts.append(mpoint)
    for i in range(segment):
        theta = angle - szAngle / 2 + i * (szAngle / segment)
        p = QgsPoint(mpoint.x() + mradius * math.cos(theta),
                     mpoint.y() + mradius * math.sin(theta))
        pts.append(p)
    pts.append(mpoint)
    return pts
Пример #27
0
    def create_estacas_old(self):
        estacas = []
        k = 0
        prog = 0.0
        dist = 0.0
        p = self.get_features()[self.estaca]
        az = 0.0
        lab = 0
        for elem in self.layer.getFeatures():
            for i, (seg_start, seg_end) in enumerate(pairs(elem, self.estaca)):
                estaca = []
                line_start = QgsPoint(seg_start)
                line_end = QgsPoint(seg_end)
                if k != 0:
                    # lab = 1
                    pass
                else:

                    lab = 0

                # mid point = vector coordinates [x2-x1,y2-y1]
                pointm = diff(line_end, line_start)
                # direction cosines of the segment
                cosa, cosb = dircos(pointm)
                # length of the segment
                lg = length(line_end, line_start)
                az = azimuth(
                    line_start,
                    QgsPoint(line_start.x() + ((prog + self.distancia) * cosa),
                             line_start.y() +
                             ((prog + self.distancia) * cosb)))

                geo = line_start
                prop = self.distancia - (
                    (prog + self.distancia) - dist) if prog > 0 else prog
                txtId = "%d+%f" % (
                    lab, prop) if prog > 0 or prop > 0 else "%d" % lab
                estaca.extend(
                    [txtId, 'v%d' % i, dist,
                     geo.y(),
                     geo.x(), 0.0, az])
                estacas.append(estaca)
                '''
                    ------------------------------------------------
                    Definição das estacas intermediarias.
                    ------------------------------------------------
                '''
                prog = 0.0 if (prog == 0) else prog
                dist = dist + lg
                p = line_start
                nprog = 0.0
                while nprog + self.distancia < lg:
                    estaca = []
                    lab += 1
                    k += 1
                    pa = p
                    p = QgsPoint(p.x() + ((self.distancia - prop) * cosa),
                                 p.y() + ((self.distancia - prop) * cosb))

                    az = azimuth(seg_start, p)
                    prog += self.distancia
                    nprog += self.distancia
                    prop = 0
                    estaca.extend([str(lab), '', prog, p.y(), p.x(), 0.0, az])
                    estacas.append(estaca)

        estaca = []
        ultimo = self.get_features()[-1]
        lg = prog + length(p, ultimo)
        prop = self.distancia - (prog - lg) if prog > 0 else prog
        txtId = "%d+%f" % (lab, prop) if prog > 0 or prop > 0 else "%d" % lab

        # az = self.azimuth(p,QgsPoint(ultimo.x(), ultimo.y()))

        estaca.extend(
            [txtId, 'vf', lg,
             ultimo.y(),
             ultimo.x(),
             ultimo.x(), az])
        estacas.append(estaca)
        return estacas
Пример #28
0
    def gera_vertice(self):
        prog = 0.0
        sobra = 0.0
        resto = 0.0
        estaca = 0
        cosa = 0.0
        cosb = 0.0
        crs = int(self.getCRS())
        sem_internet = False
        for elemento in self.layer.getFeatures():
            for i, (seg_start,
                    seg_end) in enumerate(pairs(elemento, self.estaca)):
                ponto_inicial = QgsPoint(seg_start)
                ponto_final = QgsPoint(seg_end)
                tamanho_da_linha = length(ponto_final, ponto_inicial)
                ponto = diff(ponto_final, ponto_inicial)
                cosa, cosb = dircos(ponto)
                az = azimuth(
                    ponto_inicial,
                    QgsPoint(ponto_inicial.x() + ((self.distancia) * cosa),
                             ponto_inicial.y() + ((self.distancia) * cosb)))
                estacas_inteiras = int(
                    math.floor((tamanho_da_linha - sobra) / self.distancia))
                estacas_inteiras_sobra = estacas_inteiras + 1 if sobra > 0 else estacas_inteiras
                if not sem_internet:
                    cota = getElevation(
                        crs,
                        QgsPoint(float(ponto_inicial.x()),
                                 float(ponto_inicial.y())))
                    if cota == 0:
                        sem_internet = True
                else:
                    cota = 0.0

                yield [
                    '%d+%f' % (estaca, resto) if resto != 0 else '%d' %
                    (estaca),
                    'v%d' % i, prog,
                    ponto_inicial.y(),
                    ponto_inicial.x(), cota, az
                ], ponto_inicial, estacas_inteiras, prog, az, sobra, tamanho_da_linha, cosa, cosb

                prog += tamanho_da_linha
                resto = (tamanho_da_linha - sobra) - (self.distancia *
                                                      estacas_inteiras)
                sobra = self.distancia - resto
                estaca += estacas_inteiras_sobra
            cota = getElevation(
                crs, QgsPoint(float(ponto_final.x()), float(ponto_final.y())))
            yield [
                '%d+%f' % (estaca, resto),
                'v%d' % i, prog,
                ponto_final.y(),
                ponto_final.x(), cota, az
            ], ponto_final, 0, tamanho_da_linha, az, sobra, tamanho_da_linha, cosa, cosb
Пример #29
0
 def geometry(self):
     if self.geom.type() == QgsWkbTypes.PointGeometry:
         x = float(self.xedit.text())
         y = float(self.yedit.text())
         return QgsGeometry.fromPointXY(QgsPoint(x, y))
    def __init__(self, parent=None):
        """Constructor."""
        super(Evacu8DockWidget, self).__init__(parent)
        # Set up the user interface from Designer.
        # After setupUI you can access any designer object by doing
        # self.<objectname>, and you can use autoconnect slots - see
        # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
        # #widgets-and-dialogs-with-auto-connect
        self.setupUi(self)

        #define globals
        self.iface = iface
        self.canvas = self.iface.mapCanvas()
        self.plugin_dir = os.path.dirname(__file__)
        self.emitPoint = QgsMapToolEmitPoint(self.canvas)
        self.toolPoly = PolyMapTool(self.canvas)
        self.emitEvac = QgsMapToolEmitPoint(self.canvas)
        self.emitShel = QgsMapToolEmitPoint(self.canvas)
        self.emitDel = QgsMapToolEmitPoint(self.canvas)
        self.input_template = self.scen_info.toHtml()

        # set up GUI operation signals
        # data
        self.load_scen.clicked.connect(self.openScenario)
        self.tabs.setTabEnabled(1, False)
        self.set_pt.clicked.connect(self.enterPoi)
        self.emitPoint.canvasClicked.connect(self.getPoint)
        self.set_rad.clicked.connect(self.calculateBuffer)
        self.set_rad.setEnabled(False)
        self.send_notes.clicked.connect(self.sendNotes)
        self.set_danger.clicked.connect(self.setDangerZone)
        self.get_danger.clicked.connect(self.getDangerZone)
        self.del_danger.clicked.connect(self.delDangerZone)
        self.emitDel.canvasClicked.connect(self.get_del)

        # set images and icons
        self.logo.setPixmap(QtGui.QPixmap(':images/Logosmall.jpeg'))
        self.load_scen.setIcon(QtGui.QIcon(':images/Open.png'))
        self.load_scen.setIconSize(QSize(25, 25))
        self.set_danger.setIcon(QtGui.QIcon(':images/Draw1.svg'))
        self.set_danger.setIconSize(QSize(25, 25))
        self.get_danger.setIcon(QtGui.QIcon(':images/Check.png'))
        self.get_danger.setIconSize(QSize(25, 25))
        self.del_danger.setIcon(QtGui.QIcon(':images/Delete.png'))
        self.del_danger.setIconSize(QSize(30, 30))
        self.shortestRouteButton.setIcon(QtGui.QIcon(':images/Route.png'))
        self.shortestRouteButton.setIconSize(QSize(25, 25))
        self.to_wiki1.setIcon(QtGui.QIcon(':images/Info.png'))
        self.to_wiki1.setIconSize(QSize(20, 20))

        # analysis
        self.evac = QgsPoint()
        self.evacId = int()
        self.shel = QgsPoint()
        self.shelId = int()

        self.evac_layer = QgsVectorLayer()
        self.evac_feat = QgsFeature()
        self.shel_layer = QgsVectorLayer()
        self.shel_feat = QgsFeature()

        self.select_POI.clicked.connect(self.enterEvac)
        self.emitEvac.canvasClicked.connect(self.getEvac)
        self.desel_POI.clicked.connect(self.deleteEvac)
        self.select_shelter.setEnabled(False)
        self.select_shelter.clicked.connect(self.enterShel)
        self.emitShel.canvasClicked.connect(self.getShel)
        self.shortestRouteButton.setEnabled(False)
        self.shortestRouteButton.clicked.connect(self.buildNetwork)
        self.shortestRouteButton.clicked.connect(self.calculateRoute)
        self.network_layer = QgsVectorLayer()
        self.tied_points = []
        self.to_evac_info.setVerticalHeaderLabels(
            ["Type", "Name", "Address", "Population", "Dist from Attack(m)"])
        self.shelter_info.setVerticalHeaderLabels(
            ["Type", "Name", "Address", "Capacity", "Route distance (m)"])

        # Open wiki
        self.to_wiki1.clicked.connect(self.open_wiki)

        self.big_button.clicked.connect(self.evacuateThis)
        self.savelog.clicked.connect(self.saveLog)

        self.big_button.setEnabled(False)
        self.warning_msg.setVisible(False)

        self.show_selected.clicked.connect(self.showSelected)
        self.hide_selected.clicked.connect(self.hideSelected)
        self.save_map.pressed.connect(self.showSelected)
        self.save_map.released.connect(self.saveMap)

        self.savelog.clicked.connect(self.timerMessage)
        self.save_map.released.connect(self.timerMessage)
        self.saved_msg.setVisible(False)

        self.sent_msg.setVisible(False)
Пример #31
0
    def matrix_dem_build(self, dem_dataset, height, width, scale, spacing_mm,
                         roi_x_max, roi_x_min, roi_y_min, h_base, z_scale, projected):

        # Calculate DEM parameters
        dem_col = dem_dataset.RasterXSize
        dem_row = dem_dataset.RasterYSize
        geotransform = dem_dataset.GetGeoTransform()
        dem_x_min = geotransform[0]
        dem_y_max = geotransform[3]
        dem_y_min = dem_y_max + dem_row * geotransform[5]
        dem_x_max = dem_x_min + dem_col * geotransform[1]

        if not projected:
            spacing_deg = spacing_mm * (roi_x_max - roi_x_min) / width

        row_stl = int(math.ceil(height / spacing_mm) + 1)
        col_stl = int(math.ceil(width / spacing_mm) + 1)
        matrix_dem = [range(col_stl) for i in range(row_stl)]

        var_y = height
        for i in range(row_stl):
            self.updateProgress.emit()
            QApplication.processEvents()
            var_x = 0
            for j in range(col_stl):
                # Model coordinate x(mm), y(mm)
                x_model = round(var_x, 2)
                y_model = round(var_y, 2)

                # Model maps geo_coordinates
                if projected:
                    x = x_model * scale / 1000 + roi_x_min
                    y = y_model * scale / 1000 + roi_y_min
                else:
                    x = x_model * spacing_deg / spacing_mm + roi_x_min
                    y = y_model * spacing_deg / spacing_mm + roi_y_min

                # Model layer geo_coordinates to query z value
                point = QgsPoint(x, y)
                source = self.parameters["crs_map"]
                target = self.parameters["crs_layer"]
                if source != target:
                    transform = QgsCoordinateTransform(source, target)
                    point = transform.transform(point)
                    x = point.x()
                    y = point.y()

                # From x(m) get Column in DEM file
                col_dem = (x - dem_x_min) * dem_col / (dem_x_max - dem_x_min)
                col_dem = int(math.floor(col_dem))
                if col_dem == dem_col:
                    col_dem -= 1
                # From y(m) get Row in DEM file
                row_dem = (dem_y_max - y) * dem_row / (dem_y_max - dem_y_min)
                row_dem = int(math.floor(row_dem))
                if row_dem == dem_row:
                    row_dem -= 1

                # Model coordinate z(mm)
                if col_dem < 0 or row_dem < 0:
                    z_model = 2
                elif self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0] <= h_base:
                    z_model = 2
                elif math.isnan(self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0]):
                    z_model = 2
                else:
                    z_model = round((self.get_dem_z(dem_dataset, col_dem, row_dem, 1, 1)[0] - h_base) /
                                    scale * 1000 * z_scale, 2) + 2

                matrix_dem[i][j] = self.pto(x=x_model, y=y_model, z=z_model)

                var_x += spacing_mm
                if var_x > width:
                    var_x = width
            var_y = spacing_mm * (row_stl - (i + 2))
            if self.quit:
                return 0
        return matrix_dem
Пример #32
0
    def run(self):

        d = QgsDistanceArea()
        self.jlist = self.getNewSites()
        maxDistance = self.tlist[1]  # 最大搜索范围
        feature_list = []
        existed_name_list = self.getResultNodesNames()
        for (jindex, jsite) in enumerate(self.jlist):  # 遍历结点
            perList = []  # 临时列表,用于转化子字典
            jnaminDis1, jnaminDis2, jnaminDis3, jnaminDis4, jnaminDis5, jnaminDis6 = [
                self.tlist[1] for i in range(6)
            ]
            asite1, asite2, asite3, asite4, asite5, asite6 = [
                None for i in range(6)
            ]
            if jsite[7] == u'农村':
                minDis = float(self.tlist[2])
            elif jsite[7] == u'郊区乡镇':
                minDis = float(self.tlist[3])
            elif jsite[7] == u'密集市区':
                minDis = float(self.tlist[5])
            else:  # 区域类型的结点的最小辐射范围
                # 默认jsite[7]==u'普通市区'
                minDis = float(self.tlist[4])
            jpoint = jsite.geometry().asPoint()
            # 先找到结点附近设置搜索范围内的所有基站
            area = createARectangleByCenterPoint(jpoint, maxDistance)
            siteFeatures_list = getFeaturesListByArea(self.siteLayer, area)
            for asite in siteFeatures_list:  # #遍历找到的基站
                jnaDis = d.convertMeasurement(d.measureLine(jpoint, \
                                    QgsPoint(asite[4], asite[5])), 2, 0, False)[0]

                jnaAngle = math.atan2(asite[5] - jpoint.y(),
                                      asite[4] - jpoint.x())
                jnaAngle = 90.0 - 180 / math.pi * jnaAngle  # 弧度转角度(90-方位角,可转为以正北为0度角)

                if jnaDis <= jnaminDis1 and 0 < jnaAngle <= 60:
                    jnaminDis1 = float('%0.4f' % jnaDis)  # 保留四位小数
                    asite1 = asite
                elif jnaDis <= jnaminDis2 and 60 < jnaAngle <= 120:
                    jnaminDis2 = float('%0.4f' % jnaDis)  # 保留四位小数
                    asite2 = asite
                elif jnaDis <= jnaminDis3 and 120 < jnaAngle <= 180:
                    jnaminDis3 = float('%0.4f' % jnaDis)  # 保留四位小数
                    asite3 = asite
                elif jnaDis <= jnaminDis4 and -180 < jnaAngle <= -120:
                    jnaminDis4 = float('%0.4f' % jnaDis)  # 保留四位小数
                    asite4 = asite
                elif jnaDis <= jnaminDis5 and -120 < jnaAngle <= -60:
                    jnaminDis5 = float('%0.4f' % jnaDis)  # 保留四位小数
                    asite5 = asite
                elif jnaDis <= jnaminDis6 and -60 < jnaAngle <= 0:
                    jnaminDis6 = float('%0.4f' % jnaDis)  # 保留四位小数
                    asite6 = asite

            if jnaminDis1 and asite1: perList.append([jnaminDis1, asite1])
            if jnaminDis2 and asite2: perList.append([jnaminDis2, asite2])
            if jnaminDis3 and asite3: perList.append([jnaminDis3, asite3])
            if jnaminDis4 and asite4: perList.append([jnaminDis4, asite4])
            if jnaminDis5 and asite5: perList.append([jnaminDis5, asite5])
            if jnaminDis6 and asite6: perList.append([jnaminDis6, asite6])
            # 判断是否至少找到一个符合的基站
            if len(perList) < 6:
                for i in range(6 - len(perList)):
                    perList.append(None)  # 若数量不足,给列表补None值

            NewSiteName = "0"
            while True:
                if NewSiteName in existed_name_list:
                    NewSiteName = str(int(NewSiteName) + 1)

                else:
                    existed_name_list.append(NewSiteName)
                    break
            tempList1 = [
                NewSiteName,
                str(jpoint.x()),
                str(jpoint.y()), jsite[7]
            ]
            tempList2 = []
            tolDistance = 0
            suit_site_dict = {
            }  # 用于记录符合基站的基站名和距离 (key: SiteName, value: distance)
            for L in perList:
                if isinstance(L, list):  # 判断是否为列表类型
                    tolDistance = tolDistance + L[0]
                    psite = L[1]
                    tempList2.append(psite[2])  # 基站名
                    tempList2.append(str(L[0]))  # 距离
                    tempList2.append(str(psite[4]))  # 经度
                    tempList2.append(str(psite[5]))  # 纬度
                    suit_site_dict[psite[2]] = L[0]
                else:
                    tempList2.append('NULL')
                    tempList2.append('NULL')  # 没有基站,设为None值
                    tempList2.append('NULL')
                    tempList2.append('NULL')
            if ((tolDistance != 0) and (len(suit_site_dict) != 0)):
                avgDistance = ("%.4f" % (tolDistance / len(suit_site_dict)))
                # 将符合要求的站点按距离从小到大排序
                sorted_list = sorted(suit_site_dict.iteritems(),
                                     key=lambda d: d[1],
                                     reverse=False)
                # tempList1后追加最近基站名称,最近基站距离,平均距离
                tempList1.extend([
                    sorted_list[0][0],
                    str(sorted_list[0][1]),
                    str(avgDistance)
                ])
            else:
                # tempList1后追加最近基站名称,最近基站距离,平均距离
                tempList1.extend(["NULL", "NULL", "0"])
            NewSite_datas = (tempList1 + tempList2)

            feature_list.append(createABasicPointFeature(
                jpoint, NewSite_datas))

        if importFeaturesToLayer(self.nsiteLayer, feature_list):
            self.iface.actionDraw().trigger()
            return True
        else:
            return False
Пример #33
0
    def importSiteAndCellData(self):
        cell_features = []
        site_features = []
        site_dict = {}
        try:
            # 先生成小区feature再生成基站feature
            for itm in self.data_list:
                # 创建小区feature
                # 当有小区ID和小区名时才导入信息
                cell_id = itm[2]
                cell_name = itm[3]
                if cell_id and cell_name:
                    cell = []
                    for (index, i) in enumerate(itm):
                        # 小区表中没有站点地址(48)和基站ID2(51)
                        if index not in [48, 51]:
                            cell.append(i)
                    # 获取小区图形设置\
                    setting = self.getCellGraphicParam()
                    if not setting:
                        return
                    # 处理小区图形参数
                    if setting["type"] == 0:
                        # 按运营商
                        operator = itm[18]
                        if operator == u'移动':
                            angle = setting[u"移动"][0]
                            length = setting[u"移动"][1]
                        elif operator == u'联通':
                            angle = setting[u"联通"][0]
                            length = setting[u"联通"][1]
                        elif operator == u'电信':
                            angle = setting[u"电信"][0]
                            length = setting[u"电信"][1]
                        else:
                            angle = setting[u"铁塔"][0]
                            length = setting[u"铁塔"][1]
                    else:
                        # 自定义
                        system = itm[10]
                        frequency = itm[12]
                        # 获取默认设置
                        angle = self.setting[u"默认"][0]
                        length = self.setting[u"默认"][1]
                        # 获取分类
                        case_list = self.setting["case_list"]
                        for (c_system, c_frequency, c_angle, c_length) in case_list:
                            if c_system and (not c_frequency):
                                if system == c_system:
                                    angle = c_angle
                                    length = c_length
                            elif (not c_system) and c_frequency:
                                if frequency == c_frequency:
                                    angle = c_angle
                                    length = c_length
                            elif c_system and c_frequency:
                                if (system == c_system) and (frequency == c_frequency):
                                    angle = c_angle
                                    length = c_length
                    # 根据小区类型生成相应的geometry
                    if itm[5] == u"室分":
                        circle = createCircle(QgsPoint(float(itm[8]), float(itm[9])), length / 2,
                                            self.iface, True, 64)

                        cell_feat = createACellFeature(circle, cell)
                        cell_features.append(cell_feat)
                    else:
                        sector = createSector(QgsPoint(float(itm[8]), float(itm[9])), length, self.iface, True,
                                      itm[7], angle)

                        cell_feat = createACellFeature(sector, cell)
                        cell_features.append(cell_feat)
                # 创建基站feature
                site = [
                    itm[0],  # 基站ID
                    itm[1],  # 基站名
                    itm[6],  # RNC-BSC
                    itm[8],  # 经度
                    itm[9],  # 纬度
                    itm[10],  # 网络制式
                    itm[11],  # 典型环境
                    itm[17],  # 区域
                    itm[18],  # 运营商
                    itm[19],  # 簇
                    itm[20],  # 基站英文名
                    itm[22],  # 基站类型
                    itm[48],  # 站点地址
                    itm[49],  # MCC
                    itm[50],  # MNC
                    itm[51],  # 基站ID2
                    itm[52],  # 话务量
                    itm[53],  # 投诉量
                    itm[54],  # Polygon
                    itm[55]  # 其他
                ]
                site_id = itm[0]
                site_name = itm[1]
                rnc_bsc = itm[6]
                lon = itm[8]
                lat = itm[9]
                site_key = (site_id, site_name, rnc_bsc, lon, lat)
                if site_dict.has_key(site_key):
                    continue
                else:
                    site_dict[site_key] = True
                site_feat = createASiteFeature(QgsPoint(float(itm[8]), float(itm[9])), site)
                site_features.append(site_feat)

            # 导入数据
            siteLayer = getLayerByName(u"基站",self.iface)
            site_result = importFeaturesToLayer(siteLayer, site_features)
            cellLayer = getLayerByName(u"小区", self.iface)
            cell_result = importFeaturesToLayer(cellLayer, cell_features)
            if (site_result is False) or (cell_result is False):
                siteLayer.destroyEditCommand()
                cellLayer.destroyEditCommand()
                return False
            else:
                siteLayer.endEditCommand()
                cellLayer.endEditCommand()
                return True
        except Exception:
            raise Exception, traceback.format_exc()