本文整理汇总了Python中qgis.gui.QgsRubberBand.addGeometry方法的典型用法代码示例。如果您正苦于以下问题:Python QgsRubberBand.addGeometry方法的具体用法?Python QgsRubberBand.addGeometry怎么用?Python QgsRubberBand.addGeometry使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类qgis.gui.QgsRubberBand
的用法示例。
在下文中一共展示了QgsRubberBand.addGeometry方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: Qgis2threejsDialog
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
quadtree = QuadTree(self.iface.mapCanvas().extent(), self.mapTool.point, self.ui.spinBox_Height.value())
self.createRubberBands(quadtree.quads(), self.mapTool.point)
self.setWindowState(self.windowState() & ~Qt.WindowMinimized | Qt.WindowActive)
def mapToolSet(self, mapTool):
if mapTool != self.mapTool:
self.ui.toolButton_PointTool.setVisible(True)
def createQuadTree(self):
ui = self.ui
try:
c = map(float, [ui.lineEdit_xmin.text(), ui.lineEdit_ymin.text(), ui.lineEdit_xmax.text(), ui.lineEdit_ymax.text()])
except:
return None
quadtree = QuadTree(self.iface.mapCanvas().extent())
quadtree.buildTreeByRect(QgsRectangle(c[0], c[1], c[2], c[3]), ui.spinBox_Height.value())
return quadtree
def createRubberBands(self, quads, point=None):
self.clearRubberBands()
# create quads with rubber band
self.rb_quads = QgsRubberBand(self.iface.mapCanvas(), QGis.Line)
self.rb_quads.setColor(Qt.blue)
self.rb_quads.setWidth(1)
for quad in quads:
points = []
extent = quad.extent
points.append(QgsPoint(extent.xMinimum(), extent.yMinimum()))
points.append(QgsPoint(extent.xMinimum(), extent.yMaximum()))
points.append(QgsPoint(extent.xMaximum(), extent.yMaximum()))
points.append(QgsPoint(extent.xMaximum(), extent.yMinimum()))
self.rb_quads.addGeometry(QgsGeometry.fromPolygon([points]), None)
self.log(extent.toString())
self.log("Quad count: %d" % len(quads))
# create a point with rubber band
if point:
self.rb_point = QgsRubberBand(self.iface.mapCanvas(), QGis.Point)
self.rb_point.setColor(Qt.red)
self.rb_point.addPoint(point)
def clearRubberBands(self):
# clear quads and point
if self.rb_quads:
self.iface.mapCanvas().scene().removeItem(self.rb_quads)
self.rb_quads = None
if self.rb_point:
self.iface.mapCanvas().scene().removeItem(self.rb_point)
self.rb_point = None
def browseClicked(self):
directory = self.ui.lineEdit_OutputFilename.text()
if directory == "":
directory = QDir.homePath()
filename = QFileDialog.getSaveFileName(self, self.tr("Output filename"), directory, "HTML file (*.html *.htm)", options=QFileDialog.DontConfirmOverwrite)
if filename != "":
self.ui.lineEdit_OutputFilename.setText(filename)
def samplingModeChanged(self):
ui = self.ui
isSimpleMode = ui.radioButton_Simple.isChecked()
simple_widgets = [ui.horizontalSlider_Resolution, ui.lineEdit_Width, ui.lineEdit_Height, ui.lineEdit_HRes, ui.lineEdit_VRes]
for w in simple_widgets:
w.setEnabled(isSimpleMode)
示例2: MoveTool
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
self.__iface.actionPan().trigger()
self.__removeLayer()
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.__iface)
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)
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)
@staticmethod
def __newCurve(curved, line_v2, dx, dy):
"""
To create a new moved line
:param curved: if the line is curved
:param line_v2: the original line
:param dx: x translation
:param dy: y translation
:return: the new line
"""
if curved:
newCurve = QgsCircularStringV2()
else:
newCurve = QgsLineStringV2()
points = []
for pos in range(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
def __polygonPreview(self, point):
"""
To create a polygon geometry preview (rubberBand)
:param point: new position as mapPoint
示例3: Qgis2threejsDialog
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
# world properties
world = self.properties[ObjectTreeItem.ITEM_WORLD] or {}
verticalExaggeration = world.get("lineEdit_zFactor", 1.5)
verticalShift = world.get("lineEdit_zShift", 0)
# export to javascript (three.js)
mapTo3d = MapTo3D(canvas, verticalExaggeration=float(verticalExaggeration), verticalShift=float(verticalShift))
context = OutputContext(templateName, templateType, mapTo3d, canvas, self.properties, self, self.objectTypeManager, self.localBrowsingMode)
htmlfilename = exportToThreeJS(htmlfilename, context, self.progress)
self.progress(100)
ui.pushButton_Run.setEnabled(True)
if htmlfilename is None:
return
self.clearRubberBands()
# store last selections
settings = QSettings()
settings.setValue("/Qgis2threejs/lastTemplate", templateName)
settings.setValue("/Qgis2threejs/lastControls", context.controls)
# open browser
if not tools.openHTMLFile(htmlfilename):
return
QDialog.accept(self)
def reject(self):
# save properties of current object
item = self.ui.treeWidget.currentItem()
if item and self.currentPage:
self.saveProperties(item, self.currentPage)
self.endPointSelection()
self.clearRubberBands()
QDialog.reject(self)
def startPointSelection(self):
canvas = self.iface.mapCanvas()
if self.previousMapTool != self.mapTool:
self.previousMapTool = canvas.mapTool()
canvas.setMapTool(self.mapTool)
self.pages[ppages.PAGE_DEM].toolButton_PointTool.setVisible(False)
def endPointSelection(self):
self.mapTool.reset()
if self.previousMapTool is not None:
self.iface.mapCanvas().setMapTool(self.previousMapTool)
def mapToolSet(self, mapTool):
return
#TODO: unstable
if mapTool != self.mapTool and self.currentPage is not None:
if self.currentPage.pageType == ppages.PAGE_DEM and self.currentPage.isPrimary:
self.currentPage.toolButton_PointTool.setVisible(True)
def createRubberBands(self, quads, point=None):
self.clearRubberBands()
# create quads with rubber band
self.rb_quads = QgsRubberBand(self.iface.mapCanvas(), QGis.Line)
self.rb_quads.setColor(Qt.blue)
self.rb_quads.setWidth(1)
for quad in quads:
points = []
extent = quad.extent
points.append(QgsPoint(extent.xMinimum(), extent.yMinimum()))
points.append(QgsPoint(extent.xMinimum(), extent.yMaximum()))
points.append(QgsPoint(extent.xMaximum(), extent.yMaximum()))
points.append(QgsPoint(extent.xMaximum(), extent.yMinimum()))
self.rb_quads.addGeometry(QgsGeometry.fromPolygon([points]), None)
self.log(extent.toString())
self.log("Quad count: %d" % len(quads))
# create a point with rubber band
if point:
self.rb_point = QgsRubberBand(self.iface.mapCanvas(), QGis.Point)
self.rb_point.setColor(Qt.red)
self.rb_point.addPoint(point)
def clearRubberBands(self):
# clear quads and point
if self.rb_quads:
self.iface.mapCanvas().scene().removeItem(self.rb_quads)
self.rb_quads = None
if self.rb_point:
self.iface.mapCanvas().scene().removeItem(self.rb_point)
self.rb_point = None
def browseClicked(self):
directory = os.path.split(self.ui.lineEdit_OutputFilename.text())[0]
if directory == "":
directory = QDir.homePath()
filename = QFileDialog.getSaveFileName(self, self.tr("Output filename"), directory, "HTML file (*.html *.htm)", options=QFileDialog.DontConfirmOverwrite)
if filename != "":
self.ui.lineEdit_OutputFilename.setText(filename)
def log(self, msg):
if debug_mode:
qDebug(msg)
示例4: AdvancedIntersectionMapTool
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
class AdvancedIntersectionMapTool(QgsMapTool):
def __init__(self, iface):
self.iface = iface
self.mapCanvas = iface.mapCanvas()
QgsMapTool.__init__(self, self.mapCanvas)
self.settings = MySettings()
self.rubber = QgsRubberBand(self.mapCanvas)
self.tolerance = self.settings.value("selectTolerance")
units = self.settings.value("selectUnits")
if units == "pixels":
self.tolerance *= self.mapCanvas.mapUnitsPerPixel()
def activate(self):
QgsMapTool.activate(self)
self.rubber.setWidth(self.settings.value("rubberWidth"))
self.rubber.setColor(self.settings.value("rubberColor"))
line_layer = MemoryLayers(self.iface).line_layer()
# unset this tool if the layer is removed
line_layer.layerDeleted.connect(self.unsetMapTool)
self.layerId = line_layer.id()
# create snapper for this layer
self.snapLayer = QgsSnapper.SnapLayer()
self.snapLayer.mLayer = line_layer
self.snapLayer.mSnapTo = QgsSnapper.SnapToVertexAndSegment
self.snapLayer.mTolerance = self.settings.value("selectTolerance")
if self.settings.value("selectUnits") == "map":
self.snapLayer.mUnitType = QgsTolerance.MapUnits
else:
self.snapLayer.mUnitType = QgsTolerance.Pixels
def unsetMapTool(self):
self.mapCanvas.unsetMapTool(self)
def deactivate(self):
self.rubber.reset()
line_layer = QgsMapLayerRegistry.instance().mapLayer(self.layerId)
if line_layer is not None:
line_layer.layerDeleted.disconnect(self.unsetMapTool)
QgsMapTool.deactivate(self)
def canvasMoveEvent(self, mouseEvent):
# put the observations within tolerance in the rubber band
self.rubber.reset()
for f in self.getFeatures(mouseEvent.pos()):
self.rubber.addGeometry(f.geometry(), None)
def canvasPressEvent(self, mouseEvent):
pos = mouseEvent.pos()
observations = self.getFeatures(pos)
point = self.toMapCoordinates(pos)
self.doIntersection(point, observations)
def getFeatures(self, pixPoint):
snapper = QgsSnapper(self.mapCanvas.mapRenderer())
snapper.setSnapLayers([self.snapLayer])
snapper.setSnapMode(QgsSnapper.SnapWithResultsWithinTolerances)
ok, snappingResults = snapper.snapPoint(pixPoint, [])
# output snapped features
features = []
alreadyGot = []
for result in snappingResults:
featureId = result.snappedAtGeometry
f = QgsFeature()
if featureId not in alreadyGot:
if result.layer.getFeatures(QgsFeatureRequest().setFilterFid(featureId)).nextFeature(f) is not False:
features.append(QgsFeature(f))
alreadyGot.append(featureId)
return features
def doIntersection(self, initPoint, observations):
nObs = len(observations)
if nObs < 2:
return
self.rubber.reset()
self.dlg = IntersectionDialog(self.iface, observations, initPoint)
if not self.dlg.exec_() or self.dlg.solution is None:
return
intersectedPoint = self.dlg.solution
self.saveIntersectionResult(self.dlg.report, intersectedPoint)
self.saveDimension(intersectedPoint, self.dlg.observations)
def saveIntersectionResult(self, report, intersectedPoint):
# save the intersection result (point) and its report
# check first
while True:
if not self.settings.value("advancedIntersectionWritePoint"):
break # if we do not place any point, skip
layerid = self.settings.value("advancedIntersectionLayer")
message = QCoreApplication.translate("IntersectIt",
"To place the intersection solution,"
" you must select a layer in the settings.")
status, intLayer = self.checkLayerExists(layerid, message)
if status == 2:
continue
if status == 3:
return
if self.settings.value("advancedIntersectionWriteReport"):
reportField = self.settings.value("reportField")
message = QCoreApplication.translate("IntersectIt",
#.........这里部分代码省略.........
示例5: SimpleIntersectionMapTool
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
class SimpleIntersectionMapTool(QgsMapTool):
def __init__(self, iface):
self.iface = iface
self.mapCanvas = iface.mapCanvas()
QgsMapTool.__init__(self, self.mapCanvas)
self.settings = MySettings()
self.rubber = QgsRubberBand(self.mapCanvas)
def deactivate(self):
self.rubber.reset()
self.mapCanvas.layersChanged.disconnect(self.updateSnapperList)
self.mapCanvas.scaleChanged.disconnect(self.updateSnapperList)
QgsMapTool.deactivate(self)
def activate(self):
QgsMapTool.activate(self)
self.rubber.setWidth(self.settings.value("rubberWidth"))
self.rubber.setColor(self.settings.value("rubberColor"))
self.updateSnapperList()
self.mapCanvas.layersChanged.connect(self.updateSnapperList)
self.mapCanvas.scaleChanged.connect(self.updateSnapperList)
self.checkLayer()
def updateSnapperList(self, dummy=None):
# make a snapper list of all line and polygons layers
self.snapperList = []
scale = self.iface.mapCanvas().mapRenderer().scale()
for layer in self.mapCanvas.layers():
if layer.type() == QgsMapLayer.VectorLayer and layer.hasGeometryType():
if layer.geometryType() in (QGis.Line, QGis.Polygon):
if not layer.hasScaleBasedVisibility() or layer.minimumScale() < scale <= layer.maximumScale():
snapLayer = QgsSnapper.SnapLayer()
snapLayer.mLayer = layer
snapLayer.mSnapTo = QgsSnapper.SnapToVertexAndSegment
snapLayer.mTolerance = self.settings.value("selectTolerance")
if self.settings.value("selectUnits") == "map":
snapLayer.mUnitType = QgsTolerance.MapUnits
else:
snapLayer.mUnitType = QgsTolerance.Pixels
self.snapperList.append(snapLayer)
def canvasMoveEvent(self, mouseEvent):
# put the observations within tolerance in the rubber band
self.rubber.reset()
for f in self.getFeatures(mouseEvent.pos()):
self.rubber.addGeometry(f.geometry(), None)
def canvasPressEvent(self, mouseEvent):
self.rubber.reset()
pos = mouseEvent.pos()
features = self.getFeatures(pos)
nFeat = len(features)
if nFeat < 2:
layerNames = " , ".join([feature.layer.name() for feature in features])
self.iface.messageBar().pushMessage("Intersect It", "You need 2 features to proceed a simple intersection."
" %u given (%s)" % (nFeat, layerNames), QgsMessageBar.WARNING, 3)
return
intersectionP = self.intersection(features, pos)
if intersectionP == QgsPoint(0,0):
self.iface.messageBar().pushMessage("Intersect It", "Objects do not intersect.", QgsMessageBar.WARNING, 2)
return
layer = self.checkLayer()
if layer is None:
return
f = QgsFeature()
initFields = layer.dataProvider().fields()
f.setFields(initFields)
f.initAttributes(initFields.size())
f.setGeometry(QgsGeometry().fromPoint(intersectionP))
layer.editBuffer().addFeature(f)
layer.triggerRepaint()
def getFeatures(self, pixPoint):
# do the snapping
snapper = QgsSnapper(self.mapCanvas.mapRenderer())
snapper.setSnapLayers(self.snapperList)
snapper.setSnapMode(QgsSnapper.SnapWithResultsWithinTolerances)
ok, snappingResults = snapper.snapPoint(pixPoint, [])
# output snapped features
features = []
alreadyGot = []
for result in snappingResults:
featureId = result.snappedAtGeometry
f = QgsFeature()
if (result.layer.id(), featureId) not in alreadyGot:
if result.layer.getFeatures(QgsFeatureRequest().setFilterFid(featureId)).nextFeature(f) is False:
continue
if not isFeatureRendered(self.mapCanvas, result.layer, f):
continue
features.append(QgsFeature(f))
features[-1].layer = result.layer
alreadyGot.append((result.layer.id(), featureId))
return features
def intersection(self, features, pos):
# try all the combinations
nFeat = len(features)
intersections = []
for i in range(nFeat-1):
#.........这里部分代码省略.........
示例6: FinderBox
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
self.clearSelection()
self.resultModel.clearResults()
self.resultModel.truncateHistory(MySettings().value("historyLength"))
self.resultModel.setLoading(True)
self.showPopup()
QCoreApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
self.findersToStart = []
for finder in self.finders.values():
if finder.activated():
self.findersToStart.append(finder)
bbox = self.mapCanvas.fullExtent()
while len(self.findersToStart) > 0:
finder = self.findersToStart[0]
self.findersToStart.remove(finder)
self.resultModel.addResult(finder.name)
finder.start(toFind, bbox=bbox)
# For case there is no finder activated
self.finished(None)
def stop(self):
self.findersToStart = []
for finder in self.finders.values():
if finder.isRunning():
finder.stop()
self.finished(None)
def resultFound(self, finder, layername, value, geometry, srid):
self.resultModel.addResult(finder.name, layername, value, geometry, srid)
self.resultView.expandAll()
def limitReached(self, finder, layername):
self.resultModel.addEllipsys(finder.name, layername)
def finished(self, finder):
if len(self.findersToStart) > 0:
return
for finder in self.finders.values():
if finder.isRunning():
return
self.running = False
self.searchFinished.emit()
self.resultModel.setLoading(False)
QCoreApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
def itemActivated(self, index):
item = self.resultModel.itemFromIndex(index)
self.showItem(item)
def itemPressed(self, index):
item = self.resultModel.itemFromIndex(index)
if QApplication.mouseButtons() == Qt.LeftButton:
self.showItem(item)
def showItem(self, item):
if isinstance(item, ResultItem):
self.resultModel.setSelected(item, self.resultView.palette())
geometry = self.transformGeom(item)
self.rubber.reset(geometry.type())
self.rubber.setToGeometry(geometry, None)
self.zoomToRubberBand()
return
if isinstance(item, GroupItem):
child = item.child(0)
if isinstance(child, ResultItem):
self.resultModel.setSelected(item, self.resultView.palette())
self.rubber.reset(child.geometry.type())
for i in xrange(0, item.rowCount()):
geometry = self.transformGeom(item.child(i))
self.rubber.addGeometry(geometry, None)
self.zoomToRubberBand()
return
if item.__class__.__name__ == 'QStandardItem':
self.clearSelection()
def transformGeom(self, item):
src_crs = QgsCoordinateReferenceSystem()
src_crs.createFromSrid(item.srid)
dest_crs = self.mapCanvas.mapRenderer().destinationCrs()
geom = QgsGeometry(item.geometry)
geom.transform(QgsCoordinateTransform(src_crs, dest_crs))
return geom
def zoomToRubberBand(self):
geom = self.rubber.asGeometry()
if geom:
rect = geom.boundingBox()
rect.scale(1.5)
self.mapCanvas.setExtent(rect)
self.mapCanvas.refresh()
示例7: SelectFeatureMapTool
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
class SelectFeatureMapTool(QgsMapTool):
def __init__(self, plugin):
QgsMapTool.__init__(self, plugin.map_canvas)
self.plugin = plugin
self.doubleclick = False
self.__pluginUnloaded = False
settings = QSettings()
qgsLineWidth = 2 # use fixed width
qgsLineRed = settings.value("/qgis/digitizing/line_color_red", 255, type=int)
qgsLineGreen = settings.value("/qgis/digitizing/line_color_green", 0, type=int)
qgsLineBlue = settings.value("/qgis/digitizing/line_color_blue", 0, type=int)
self.rubBandPol = QgsRubberBand(plugin.map_canvas, QGis.Line)
self.rubBandPol.setColor(QColor(qgsLineRed, qgsLineGreen, qgsLineBlue))
self.rubBandPol.setWidth(qgsLineWidth)
def activate(self):
super(SelectFeatureMapTool, self).activate()
self.plugin.iface.mainWindow().statusBar().showMessage(self.tr("Click on a parcel!"))
self.currentDialog = None
self.dialogPosition = None
self.currentPossessionType = "INDIVIDUAL"
# self.plugin.mapCanvas.setCursor(QCursor(Qt.ArrowCursor))
def canvasDoubleClickEvent(self, event):
self.doubleclick = True
def canvasReleaseEvent(self, event):
if self.doubleclick:
self.doubleclick = False
return
if event.button() <> Qt.LeftButton:
return
layer = self.plugin.getLayerByTableName('ca_parcel')
if not layer:
return
# find out map coordinates from mouse click
mapPoint = self.toLayerCoordinates(layer, event.pos())
tolerance = self.plugin.getTolerance(layer)
area = QgsRectangle(mapPoint.x() - tolerance, mapPoint.y() - tolerance, mapPoint.x() + tolerance, mapPoint.y() + tolerance)
request = QgsFeatureRequest()
request.setFilterRect(area).setFlags(QgsFeatureRequest.ExactIntersect)
request.setSubsetOfAttributes([0])
result = False
for feature in layer.getFeatures(request):
self.rubBandPol.reset(True)
self.rubBandPol.addGeometry(feature.geometry(), layer)
parcel_no = int(feature[0])
possession_type = self.__possessionType(parcel_no)
if not self.currentDialog or possession_type != self.currentPossessionType:
if self.currentDialog:
self.dialogPosition = self.currentDialog.pos()
self.currentDialog.reject()
# if possession_type == "INDIVIDUAL":
# self.currentDialog = PossessionDetailsDialog(self.plugin, self.plugin.iface.mainWindow())
# else:
# self.currentDialog = CooperativePossessionDetailsDialog(self.plugin, self.plugin.iface.mainWindow())
self.currentPossessionType = possession_type
self.connect(self.currentDialog, SIGNAL("rejected()"), self.__dialogClosed)
if self.dialogPosition:
self.currentDialog.move(self.dialogPosition)
self.currentDialog.setParcelNo(parcel_no)
if self.currentDialog.isHidden():
self.currentDialog.show()
result = True
break
if not result:
self.__resetTool()
def __resetTool(self):
if self.currentDialog:
self.currentDialog.hide()
#.........这里部分代码省略.........
示例8: Qgis2threejsDialog
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
self.clearRubberBands()
# store last selections
settings = QSettings()
settings.setValue("/Qgis2threejs/lastTemplate", export_settings.templatePath)
settings.setValue("/Qgis2threejs/lastControls", export_settings.controls)
# open web browser
if not tools.openHTMLFile(export_settings.htmlfilename):
ui.toolButton_Settings.setVisible(True)
return
# close dialog
QDialog.accept(self)
def reject(self):
# save properties of current object
item = self.ui.treeWidget.currentItem()
if item and self.currentPage:
self.saveProperties(item, self.currentPage)
self.endPointSelection()
self.clearRubberBands()
QDialog.reject(self)
def help(self):
url = "http://qgis2threejs.readthedocs.org/"
import webbrowser
webbrowser.open(url, new=2) # new=2: new tab if possible
def startPointSelection(self):
canvas = self.iface.mapCanvas()
if self.previousMapTool != self.mapTool:
self.previousMapTool = canvas.mapTool()
canvas.setMapTool(self.mapTool)
self.pages[ppages.PAGE_DEM].toolButton_PointTool.setVisible(False)
def endPointSelection(self):
self.mapTool.reset()
if self.previousMapTool is not None:
self.iface.mapCanvas().setMapTool(self.previousMapTool)
def mapToolSet(self, mapTool):
return
#TODO: unstable
if mapTool != self.mapTool and self.currentPage is not None:
if self.currentPage.pageType == ppages.PAGE_DEM and self.currentPage.isPrimary:
self.currentPage.toolButton_PointTool.setVisible(True)
def createRubberBands(self, baseExtent, quadtree):
self.clearRubberBands()
# create quads with rubber band
self.rb_quads = QgsRubberBand(self.iface.mapCanvas(), QGis.Line)
self.rb_quads.setColor(Qt.blue)
self.rb_quads.setWidth(1)
quads = quadtree.quads()
for quad in quads:
geom = baseExtent.subrectangle(quad.rect).geometry()
self.rb_quads.addGeometry(geom, None)
self.log("Quad count: %d" % len(quads))
if not quadtree.focusRect:
return
# create a point with rubber band
if quadtree.focusRect.width() == 0 or quadtree.focusRect.height() == 0:
npt = quadtree.focusRect.center()
self.rb_point = QgsRubberBand(self.iface.mapCanvas(), QGis.Point)
self.rb_point.setColor(Qt.red)
self.rb_point.addPoint(baseExtent.point(npt))
def clearRubberBands(self):
# clear quads and point
if self.rb_quads:
self.iface.mapCanvas().scene().removeItem(self.rb_quads)
self.rb_quads = None
if self.rb_point:
self.iface.mapCanvas().scene().removeItem(self.rb_point)
self.rb_point = None
def browseClicked(self):
directory = os.path.split(self.ui.lineEdit_OutputFilename.text())[0]
if not directory:
directory = QDir.homePath()
filename = QFileDialog.getSaveFileName(self, self.tr("Output filename"), directory, "HTML file (*.html *.htm)", options=QFileDialog.DontConfirmOverwrite)
if not filename:
return
# append .html extension if filename doesn't have either .html or .htm
if filename[-5:].lower() != ".html" and filename[-4:].lower() != ".htm":
filename += ".html"
self.ui.lineEdit_OutputFilename.setText(filename)
def log(self, msg):
if debug_mode:
qDebug(msg)
示例9: FinderBox
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
if not toFind or toFind == '':
return
self.running = True
self.searchStarted.emit()
self.resultModel.clearResults()
self.resultModel.truncateHistory(MySettings().value("historyLength"))
self.resultModel.setLoading(True)
self.showPopup()
QCoreApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
# create categories in special order and count activated ones
for finder in self.finders.values():
if finder.activated():
self.resultModel.addResult(finder.name)
bbox = self.mapCanvas.fullExtent()
for finder in self.finders.values():
if finder.activated():
finder.start(toFind, bbox=bbox)
def stop(self):
for finder in self.finders.values():
if finder.isRunning():
finder.stop()
def resultFound(self, finder, layername, value, geometry, srid):
self.resultModel.addResult(finder.name, layername, value, geometry, srid)
self.resultView.expandAll()
def limitReached(self, finder, layername):
self.resultModel.addEllipsys(finder.name, layername)
def finished(self, finder):
for finder in self.finders.values():
if finder.isRunning():
return
self.running = False
self.searchFinished.emit()
self.resultModel.setLoading(False)
QCoreApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
def message(self, finder, message, level):
self.iface.messageBar().pushMessage("Quick Finder", message, level, 3)
def itemActivated(self, index):
item = self.resultModel.itemFromIndex(index)
self.showItem(item)
def itemPressed(self, index):
item = self.resultModel.itemFromIndex(index)
if QApplication.mouseButtons() == Qt.LeftButton:
self.showItem(item)
def showItem(self, item):
if isinstance(item, ResultItem):
self.resultModel.setSelected(item, self.resultView.palette())
geometry = self.transformGeom(item)
self.rubber.reset(geometry.type())
self.rubber.setToGeometry(geometry, None)
self.zoomToRubberBand()
return
if isinstance(item, GroupItem):
child = item.child(0)
if isinstance(child, ResultItem):
self.resultModel.setSelected(item, self.resultView.palette())
self.rubber.reset(child.geometry.type())
for i in xrange(0, item.rowCount()):
geometry = self.transformGeom(item.child(i))
self.rubber.addGeometry(geometry, None)
self.zoomToRubberBand()
return
if item.__class__.__name__ == 'QStandardItem':
self.resultModel.setSelected(None, self.resultView.palette())
self.rubber.reset()
return
def transformGeom(self, item):
geometry = item.geometry
src_crs = QgsCoordinateReferenceSystem()
src_crs.createFromSrid(item.srid)
dest_crs = self.mapCanvas.mapRenderer().destinationCrs()
geom = item.geometry
geom.transform( QgsCoordinateTransform(src_crs, dest_crs) )
return geom
def zoomToRubberBand(self):
geom = self.rubber.asGeometry()
if geom:
rect = geom.boundingBox()
rect.scale(1.5)
self.mapCanvas.setExtent(rect)
self.mapCanvas.refresh()
示例10: __init__
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
def toMGRS(self):
'''Display the to MGRS dialog box'''
results = processing.execAlgorithmDialog('latlontools:point2mgrs', {})
def MGRStoLayer(self):
'''Display the to MGRS dialog box'''
results = processing.execAlgorithmDialog('latlontools:mgrs2point', {})
def toPlusCodes(self):
results = processing.execAlgorithmDialog('latlontools:point2pluscodes', {})
def PlusCodestoLayer(self):
results = processing.execAlgorithmDialog('latlontools:pluscodes2point', {})
def settings(self):
'''Show the settings dialog box'''
self.settingsDialog.show()
def help(self):
'''Display a help page'''
url = QUrl.fromLocalFile(os.path.dirname(__file__) + "/index.html").toString()
webbrowser.open(url, new=2)
def settingsChanged(self):
# Settings may have changed so we need to make sure the zoomToDialog window is configured properly
self.zoomToDialog.configure()
self.multiZoomDialog.settingsChanged()
def zoomTo(self, srcCrs, lat, lon):
canvasCrs = self.canvas.mapSettings().destinationCrs()
transform = QgsCoordinateTransform(srcCrs, canvasCrs, QgsProject.instance())
x, y = transform.transform(float(lon), float(lat))
rect = QgsRectangle(x, y, x, y)
self.canvas.setExtent(rect)
pt = QgsPointXY(x, y)
self.highlight(pt)
self.canvas.refresh()
return pt
def highlight(self, point):
currExt = self.canvas.extent()
leftPt = QgsPoint(currExt.xMinimum(), point.y())
rightPt = QgsPoint(currExt.xMaximum(), point.y())
topPt = QgsPoint(point.x(), currExt.yMaximum())
bottomPt = QgsPoint(point.x(), currExt.yMinimum())
horizLine = QgsGeometry.fromPolyline( [ leftPt , rightPt ] )
vertLine = QgsGeometry.fromPolyline( [ topPt , bottomPt ] )
self.crossRb.reset(QgsWkbTypes.LineGeometry)
self.crossRb.addGeometry(horizLine, None)
self.crossRb.addGeometry(vertLine, None)
QTimer.singleShot(700, self.resetRubberbands)
def resetRubberbands(self):
self.crossRb.reset()
def digitizeClicked(self):
if self.digitizerDialog == None:
from .digitizer import DigitizerWidget
self.digitizerDialog = DigitizerWidget(self, self.iface, self.iface.mainWindow())
self.digitizerDialog.show()
def currentLayerChanged(self):
layer = self.iface.activeLayer()
if layer != None:
try:
layer.editingStarted.disconnect(self.layerEditingChanged)
except:
pass
try:
layer.editingStopped.disconnect(self.layerEditingChanged)
except:
pass
if isinstance(layer, QgsVectorLayer):
layer.editingStarted.connect(self.layerEditingChanged)
layer.editingStopped.connect(self.layerEditingChanged)
self.enableDigitizeTool()
def layerEditingChanged(self):
self.enableDigitizeTool()
def enableDigitizeTool(self):
self.digitizeAction.setEnabled(False)
layer = self.iface.activeLayer()
if layer != None and isinstance(layer, QgsVectorLayer) and (layer.geometryType() == QgsWkbTypes.PointGeometry) and layer.isEditable():
self.digitizeAction.setEnabled(True)
else:
if self.digitizerDialog != None:
self.digitizerDialog.close()
示例11: EditTool
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
class EditTool(MapTool):
"""
Inspection tool which copies the feature to a new layer
and copies selected data from the underlying feature.
"""
finished = pyqtSignal(QgsVectorLayer, QgsFeature)
def __init__(self, canvas, layers, snapradius = 2):
MapTool.__init__(self, canvas, layers)
self.canvas = canvas
self.radius = snapradius
self.band = QgsRubberBand(self.canvas)
self.band.setColor(QColor.fromRgb(224,162,16))
self.band.setWidth(3)
self.cursor = QCursor(QPixmap(["16 16 3 1",
" c None",
". c #FF0000",
"+ c #FFFFFF",
" ",
" +.+ ",
" ++.++ ",
" +.....+ ",
" +. .+ ",
" +. . .+ ",
" +. . .+ ",
" ++. . .++",
" ... ...+... ...",
" ++. . .++",
" +. . .+ ",
" +. . .+ ",
" ++. .+ ",
" ++.....+ ",
" ++.++ ",
" +.+ "]))
def getFeatures(self, point):
searchRadius = (QgsTolerance.toleranceInMapUnits( self.radius, self.layers[0],
self.canvas.mapRenderer(),
QgsTolerance.Pixels))
point = self.toMapCoordinates(point)
rect = QgsRectangle()
rect.setXMinimum(point.x() - searchRadius)
rect.setXMaximum(point.x() + searchRadius)
rect.setYMinimum(point.y() - searchRadius)
rect.setYMaximum(point.y() + searchRadius)
rq = QgsFeatureRequest().setFilterRect(rect)
self.band.reset()
for layer in self.layers:
rq = QgsFeatureRequest().setFilterRect(rect)
for feature in layer.getFeatures(rq):
if feature.isValid():
yield feature, layer
def canvasMoveEvent(self, event):
for feature, _ in self.getFeatures(point = event.pos()):
self.band.addGeometry(feature.geometry(), None)
def canvasReleaseEvent(self, event):
features = list(self.getFeatures(point = event.pos()))
if len(features) == 1:
feature = features[0]
self.finished.emit(feature[1], feature[0])
elif len(features) > 0:
listUi = ListFeaturesForm()
listUi.loadFeatureList(features)
listUi.openFeatureForm.connect(self.finished)
listUi.exec_()
def activate(self):
"""
Set the tool as the active tool in the canvas.
@note: Should be moved out into qmap.py
and just expose a cursor to be used
"""
self.canvas.setCursor(self.cursor)
def deactivate(self):
"""
Deactive the tool.
"""
pass
def isZoomTool(self):
return False
def isTransient(self):
return False
def isEditTool(self):
return True
示例12: MultiLayerSelection
# 需要导入模块: from qgis.gui import QgsRubberBand [as 别名]
# 或者: from qgis.gui.QgsRubberBand import addGeometry [as 别名]
#.........这里部分代码省略.........
def filterStrongestGeometry(self, dictLayerFeature):
"""
Filter a given dict of features for its strongest geometry.
:param dictLayerFeature: (dict) a dict of layers and its features to be filtered.
:return: (dict) filtered dict with only layers of the strongest geometry on original dict.
"""
strongest_geometry = 3
outDict = dict()
if dictLayerFeature:
for lyr in dictLayerFeature.keys():
# to retrieve strongest geometry value
if strongest_geometry > lyr.geometryType():
strongest_geometry = lyr.geometryType()
if strongest_geometry == 0:
break
for lyr in dictLayerFeature.keys():
if lyr.geometryType() == strongest_geometry:
outDict[lyr] = dictLayerFeature[lyr]
return outDict
def createRubberBand(self, feature, layer, geom):
"""
Creates a rubber band around from a given a standard feature string.
:param feature: taget feature to be highlighted
:param layer: layer containing the target feature
:param geom: int indicating geometry type of target feature
"""
if geom == 0:
self.hoverRubberBand.reset(QGis.Point)
elif geom == 1:
self.hoverRubberBand.reset(QGis.Line)
else:
self.hoverRubberBand.reset(QGis.Polygon)
self.hoverRubberBand.addGeometry(feature.geometry(), layer)
# to inform the code that menu has been hovered over
self.menuHovered = True
def createMultipleRubberBand(self, dictLayerFeature):
"""
Creates rubberbands around features.
:param dictLayerFeature: (dict) dict of layer/features to have rubberbands built around.
"""
# only one type of geometry at a time will have rubberbands around it
geom = dictLayerFeature.keys()[0].geometryType()
if geom == 0:
self.hoverRubberBand.reset(QGis.Point)
elif geom == 1:
self.hoverRubberBand.reset(QGis.Line)
else:
self.hoverRubberBand.reset(QGis.Polygon)
for layer, features in dictLayerFeature.iteritems():
for feat in features:
self.hoverRubberBand.addGeometry(feat.geometry(), layer)
self.menuHovered = True
def checkSelectedLayers(self):
"""
Checks if there are layers selected on canvas. If there are, returns the geometry type of
selected feature(s). If more than one type of feature is selected, the "strongest" geometry
is returned.
"""
geom = None
for layer in self.iface.legendInterface().layers():
if isinstance(layer, QgsVectorLayer):
selection = layer.selectedFeatures()
if len(selection):