|
| 1 | +from qgis.PyQt.QtCore import Qt |
| 2 | +from qgis.PyQt.QtWidgets import QApplication |
| 3 | +from qgis.core import Qgis, QgsCoordinateTransform, QgsCoordinateReferenceSystem, QgsProject |
| 4 | +from qgis.gui import QgsMapToolExtent |
| 5 | +# import traceback |
| 6 | +from .util import epsg4326 |
| 7 | +from .settings import settings, CopyExtent |
| 8 | + |
| 9 | +def getExtentString(bbox, src_crs, dst_crs): |
| 10 | + if src_crs != dst_crs: |
| 11 | + transform = QgsCoordinateTransform(src_crs, dst_crs, QgsProject.instance()) |
| 12 | + bbox = transform.transformBoundingBox(bbox) |
| 13 | + delim = settings.bBoxDelimiter |
| 14 | + prefix = settings.bBoxPrefix |
| 15 | + suffix = settings.bBoxSuffix |
| 16 | + precision = settings.bBoxDigits |
| 17 | + outStr = '' |
| 18 | + minX = bbox.xMinimum() |
| 19 | + minY = bbox.yMinimum() |
| 20 | + maxX = bbox.xMaximum() |
| 21 | + maxY = bbox.yMaximum() |
| 22 | + if settings.bBoxFormat == CopyExtent.WSEN: # minX,minY,maxX,maxY (W,S,E,N) |
| 23 | + outStr = '{:.{prec}f}{}{:.{prec}f}{}{:.{prec}f}{}{:.{prec}f}'.format( |
| 24 | + minX, delim, minY, delim, maxX, delim, maxY, prec=precision) |
| 25 | + elif settings.bBoxFormat == CopyExtent.WESN: # minX,maxX,minY,maxY (W,E,S,N) |
| 26 | + outStr = '{:.{prec}f}{}{:.{prec}f}{}{:.{prec}f}{}{:.{prec}f}'.format( |
| 27 | + minX, delim, maxX, delim, minY, delim, maxY, prec=precision) |
| 28 | + elif settings.bBoxFormat == CopyExtent.SWNE: # minY,minX,maxY,maxX (S,W,N,E) |
| 29 | + outStr = '{:.{prec}f}{}{:.{prec}f}{}{:.{prec}f}{}{:.{prec}f}'.format( |
| 30 | + minY, delim, minX, delim, maxY, delim, maxX, prec=precision) |
| 31 | + elif settings.bBoxFormat == CopyExtent.Poly1: # x1 y1,x2 y2,x3 y3,x4 y4,x1 y1 - Polygon format |
| 32 | + outStr = '{:.{prec}f} {:.{prec}f},{:.{prec}f} {:.{prec}f},{:.{prec}f} {:.{prec}f},{:.{prec}f} {:.{prec}f},{:.{prec}f} {:.{prec}f}'.format( |
| 33 | + minX, minY, minX, maxY, maxX, maxY, maxX, minY, minX, minY, prec=precision) |
| 34 | + elif settings.bBoxFormat == CopyExtent.Poly2: # x1,y1 x2,y2 x3,y3 x4,y4 x1,y1 - Polygon format |
| 35 | + outStr = '{:.{prec}f},{:.{prec}f} {:.{prec}f},{:.{prec}f} {:.{prec}f},{:.{prec}f} {:.{prec}f},{:.{prec}f} {:.{prec}f},{:.{prec}f}'.format( |
| 36 | + minX, minY, minX, maxY, maxX, maxY, maxX, minY, minX, minY, prec=precision) |
| 37 | + elif settings.bBoxFormat == CopyExtent.PolyWkt: # WKT Polygon |
| 38 | + outStr = bbox.asWktPolygon() |
| 39 | + elif settings.bBoxFormat == CopyExtent.MapProxy: # bbox: [minX, minY, maxX, maxY] - MapProxy |
| 40 | + outStr = 'bbox: [{}, {}, {}, {}]'.format( |
| 41 | + minX, minY, maxX, maxY) |
| 42 | + elif settings.bBoxFormat == CopyExtent.GeoServer: # bbox=minX,minY,maxX,maxY - GeoServer |
| 43 | + outStr = 'bbox={},{},{},{}'.format( |
| 44 | + minX, minY, maxX, maxY) |
| 45 | + outStr = '{}{}{}'.format(prefix, outStr, suffix) |
| 46 | + return(outStr) |
| 47 | + |
| 48 | +class CaptureExtentTool(QgsMapToolExtent): |
| 49 | + def __init__(self, iface, parent): |
| 50 | + self.iface = iface |
| 51 | + self.canvas = iface.mapCanvas() |
| 52 | + QgsMapToolExtent.__init__(self, self.canvas) |
| 53 | + self.extentChanged.connect(self.getExtent) |
| 54 | + |
| 55 | + def activate(self): |
| 56 | + '''When activated set the cursor to a crosshair.''' |
| 57 | + self.canvas.setCursor(Qt.CrossCursor) |
| 58 | + |
| 59 | + def deactivate(self): |
| 60 | + QgsMapToolExtent.deactivate(self) |
| 61 | + action = self.action() |
| 62 | + if action: |
| 63 | + action.setChecked(False) |
| 64 | + |
| 65 | + def getExtent(self, bbox): |
| 66 | + if bbox.isNull(): |
| 67 | + return |
| 68 | + canvasCRS = self.canvas.mapSettings().destinationCrs() |
| 69 | + if settings.bBoxCrs == 0: |
| 70 | + dstCRS = epsg4326 |
| 71 | + else: |
| 72 | + dstCRS = canvasCRS |
| 73 | + |
| 74 | + outStr = getExtentString(bbox, canvasCRS, dstCRS) |
| 75 | + |
| 76 | + clipboard = QApplication.clipboard() |
| 77 | + clipboard.setText(outStr) |
| 78 | + self.iface.messageBar().pushMessage("", "'{}' copied to the clipboard".format(outStr), level=Qgis.Info, duration=4) |
0 commit comments