From 71b84a0f67edc7e4dc9bf7048e782592866783e5 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Sun, 15 Oct 2017 15:59:04 -0400 Subject: [PATCH 01/31] Added ImageButtons and Navigation: - imagebutton.py has a map-based button (QObject wrapper for QGraphicsPixmap) - mapnavitem.py creates and wraps +/- map buttons - mapscene.py has addNavItem to include buttons - main_gs.py adds a nav button set - MANIFEST.in needed to include .png files - setup.py ammended to include data files - __init__.py includes new classes - zoom_in_symbol.png, zoom_out_symbol.png created --- MANIFEST.in | 1 + example/main_gs.py | 2 + pytilemap/__init__.py | 3 + pytilemap/imagebutton.py | 39 +++++++++ pytilemap/mapnavitem.py | 150 ++++++++++++++++++++++++++++++++++ pytilemap/mapscene.py | 24 +++++- pytilemap/zoom_in_symbol.png | Bin 0 -> 557 bytes pytilemap/zoom_out_symbol.png | Bin 0 -> 419 bytes setup.py | 3 + 9 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 MANIFEST.in create mode 100644 pytilemap/imagebutton.py create mode 100644 pytilemap/mapnavitem.py create mode 100644 pytilemap/zoom_in_symbol.png create mode 100644 pytilemap/zoom_out_symbol.png diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..daa7862 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include pytilemap/*.png diff --git a/example/main_gs.py b/example/main_gs.py index 33904d5..19599b8 100644 --- a/example/main_gs.py +++ b/example/main_gs.py @@ -134,6 +134,8 @@ def __init__(self): legendItem.addRect('Sphere 4', '#00FFFF', border=None) legendItem.addPoint('Polygon 5', '#FF00FF', border=None) + navItem = view.scene().addNavItem(anchor=Qt.TopRightCorner) + scaleItem = view.scene().addScale(anchor=Qt.BottomRightCorner) diff --git a/pytilemap/__init__.py b/pytilemap/__init__.py index 133b0cc..2e09070 100644 --- a/pytilemap/__init__.py +++ b/pytilemap/__init__.py @@ -9,6 +9,7 @@ from .mapescaleitem import MapScaleItem from .maptilesources import MapTileSource, MapTileSourceHere, MapTileSourceHereDemo, \ MapTileSourceOSM, MapTileSourceHTTP +from .mapnavitem import MapNavItem __all__ = [ @@ -26,6 +27,8 @@ 'MapTileSourceHereDemo', 'MapTileSourceOSM', 'MapTileSourceHTTP', + "MapNavItem", + "ImageButton" ] __version__ = '1.0.0' diff --git a/pytilemap/imagebutton.py b/pytilemap/imagebutton.py new file mode 100644 index 0000000..ffd1803 --- /dev/null +++ b/pytilemap/imagebutton.py @@ -0,0 +1,39 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Signal +from qtpy.QtWidgets import QGraphicsObject, QGraphicsItemGroup, QGraphicsPixmapItem + +class ImageButton(QGraphicsObject): + ''' + Custom Image Holder Class that Allows for event handling - + - QGraphicsPixmapItem is not a QObject, so cannot catch events. + ''' + QtParentClass = QGraphicsObject + + clicked = Signal(int) + + def __init__(self, img, parent=None): + ''' + Args: + img: A QPixmap instance + + Keyword Args: + parent: A pyqt window instance + ''' + QGraphicsObject.__init__(self, parent=parent) + self.image = QGraphicsPixmapItem(img, parent=self) + self.parent = parent + + def paint(self, painter, option, widget): + self.image.paint(painter,option,widget) + + def boundingRect(self): + return self.image.boundingRect() + + def mouseReleaseEvent(self, event): + self.clicked.emit(1) + + def mousePressEvent(self, event): + pass +# end ImageButton + diff --git a/pytilemap/mapnavitem.py b/pytilemap/mapnavitem.py new file mode 100644 index 0000000..1432e9f --- /dev/null +++ b/pytilemap/mapnavitem.py @@ -0,0 +1,150 @@ +from __future__ import print_function, absolute_import + +import os +from qtpy.QtCore import Qt, Slot, QRectF, QPointF, QObject, Signal +from qtpy.QtGui import QPen, QBrush, QColor, QPixmap +from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ + QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem, QGraphicsPixmapItem + +from .imagebutton import ImageButton +from .mapitems import MapItem +from .functions import makePen, makeBrush +from .qtsupport import getQVariantValue + +from .maplegenditem import * + + +class MapNavItem(QGraphicsObject, MapItem): + + QtParentClass = QGraphicsObject + + _posForAnchors = { + Qt.TopLeftCorner: QPointF(20.0, 75.0), + Qt.TopRightCorner: QPointF(40.0, -15.0), + Qt.BottomLeftCorner: QPointF(20.0, -15.0), + Qt.BottomRightCorner: QPointF(30.0, 75.0), + } + + + def __init__(self, anchor, parent=None): + QGraphicsObject.__init__(self, parent=parent) + MapItem.__init__(self) + self.setZValue(200.0) + + anchorPos = self._posForAnchors[anchor] + self._anchorPos = QPointF(anchorPos) + self._anchor = anchor + + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(QPen(Qt.NoPen)) + self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) + + self._entries = list() + + imgfile = os.path.dirname(__file__) + os.sep + 'zoom_in_symbol.png' + img = QPixmap(24,24) + img.load(imgfile) + img = img.scaled(24,24) + img = ImageButton(img, parent=self) + self.zoom_in_button = img + self.addEntry(self.zoom_in_button) + + imgfile = os.path.dirname(__file__) + os.sep + 'zoom_out_symbol.png' + img2 = QPixmap(24,24) + img2.load(imgfile) + img2 = img2.scaled(24,24) + img2 = ImageButton(img2, parent=self) + self.zoom_out_button = img2 + self.addEntry(self.zoom_out_button) + + def _sceneChanged(self, oldScene, newScene): + if oldScene is not None: + oldScene.sceneRectChanged.disconnect(self.setSceneRect) + if newScene is not None: + newScene.sceneRectChanged.connect(self.setSceneRect) + # Setup the new position of the item + self.setSceneRect(newScene.sceneRect()) + + def updatePosition(self, scene): + pass + + def addRect(self, text, color, border=None, size=20.0): + shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) + brush = makeBrush(color) + shape.setBrush(brush) + shape.setPen(makePen(border)) + + self.addEntry(MapLegendEntryItem(shape, text)) + + def addEntry(self, entry): + self._entries.append(entry) + self._updateLayout() + + def boundingRect(self): + return self._border.boundingRect() + + def paint(*args, **kwargs): + pass + + @Slot(QRectF) + def setSceneRect(self, rect): + anchorPos = self._anchorPos + anchor = self._anchor + newPos = None + if anchor == Qt.BottomRightCorner: + newPos = rect.bottomRight() - anchorPos + elif anchor == Qt.TopRightCorner: + newPos = rect.topRight() - anchorPos + elif anchor == Qt.TopLeftCorner: + newPos = rect.topLeft() + anchorPos + elif anchor == Qt.BottomLeftCorner: + newPos = rect.bottomLeft() + anchorPos + else: + raise NotImplementedError('Other corner have not actually been implemented') + + self.setPos(newPos) + + + def _updateLayout(self): + self.prepareGeometryChange() + + bottom = 0.0 + left = 0.0 + right = 0.0 + for entry in self._entries: + entry.setPos(left, bottom) + bottom += entry.boundingRect().bottom() + right = max(right, entry.boundingRect().right() + 1.0) + + self._border.setRect(0.0, 0.0, right, bottom + 1.0) + + def pen(self): + """Pen for the background of the legend + + Returns: + QPen: Pen for the background of the legend + """ + return self._border.pen() + + def brush(self): + """Brush for the background of the legend + + Returns: + QBrush: Brush for the background of the legend + """ + return self._border.brush() + + def setPen(self, *args, **kwargs): + """Set the pen for the background of the legend + + The arguments are the same of the :func:`makePen` function + """ + return self._border.setPen(makePen(*args, **kwargs)) + + def setBrush(self, *args, **kwargs): + """Set the brush for the background of the legend + + The arguments are the same of the :func:`makeBrush` function + """ + return self._border.setBrush(makeBrush(*args, **kwargs)) + diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 604ea1e..88e67cf 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -2,7 +2,7 @@ from numpy import floor -from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF +from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint from qtpy.QtGui import QPixmap from qtpy.QtWidgets import QGraphicsScene @@ -11,6 +11,7 @@ MapGraphicsRectItem, MapGraphicsLinesGroupItem from .maplegenditem import MapLegendItem from .mapescaleitem import MapScaleItem +from .mapnavitem import MapNavItem from .functions import iterRange from .tileutils import posFromLonLat, lonLatFromPos @@ -176,7 +177,7 @@ def zoomIn(self, pos=None): current center position. """ if pos is None: - pos = self.sceneRect().center() + pos = QPoint(self.width()/2, self.height()/2) self.zoomTo(pos, self._zoom + 1) def zoomOut(self, pos=None): @@ -187,9 +188,17 @@ def zoomOut(self, pos=None): current center position. """ if pos is None: - pos = self.sceneRect().center() + pos = QPoint(self.width()/2, self.height()/2) self.zoomTo(pos, self._zoom - 1) + @Slot() + def handleZoomIn(self): + self.zoomIn() + + @Slot() + def handleZoomOut(self): + self.zoomOut() + def zoom(self): return self._zoom @@ -274,6 +283,7 @@ def setCenter(self, lon, lat): rect.moveCenter(QPointF(pos[0], pos[1])) self.setSceneRect(rect) + def center(self): centerPos = self.sceneRect().center() centerCoord = self.lonLatFromPos(centerPos.x(), centerPos.y()) @@ -425,6 +435,14 @@ def addText(self, longitude, latitude, text): self.addItem(item) return item + def addNavItem(self, anchor): + self.nav_item = MapNavItem(anchor) + self.addItem(self.nav_item) + self.nav_item.zoom_in_button.clicked.connect(self.handleZoomIn) + self.nav_item.zoom_out_button.clicked.connect(self.handleZoomOut) + return self.nav_item + + def addLegend(self, pos=QPointF(10.0, 10.0)): legend = MapLegendItem(pos=pos) self.addItem(legend) diff --git a/pytilemap/zoom_in_symbol.png b/pytilemap/zoom_in_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..6787135d2006942484c9cd269deba64e2fa0e34d GIT binary patch literal 557 zcmV+|0@D47P)WFU8GbZ8()Nlj2>E@cM*00EUrL_t(o!|j(rO2a@DhQCSD zv=P&aluD_KLKlL25!~t-+_-S-F+75&@EWeXfJ+e(3N2_YsZiUdCUG;`q{Wy{5>Uu{ zn+(kS|IGXUyh)&lBC?Ki4!I^!%pPZ)#1mX7gMZ~|Ji%RRf}1FySRx2AD02i;%Ujg{ zPhhMyyB~UPW=~M3j17Rp3!Z}FzqqK*hyY)%^Rjo5%@!U3`_!oBBl0U91YMk@1zO)l zj|99W-@l4YTOg%QEpnd&hD-t2V2qB3pvnXd7n=$uf&msI<}sK{1dE(e1$22*O)eG^ zKt#+QUYEE;bK2-qPG8z{0TG0DEL1i4h(GQ(h9W@;FcT51VU_6RQKk{9b_Fo7R^SaZ zdOvAk#I`nr8Z~B&nP4$O;N!_XZ!)C}K!YdMUeu3_I!p;LaS=4RrJWEnrbN+fArP4C z0DCd>l;7lcGy+^~bh>$5IKDjm0E&0N;E!;)FaAV}$TmI!60zQ)9pwj000000NkvXXu0mjfOy1XA literal 0 HcmV?d00001 diff --git a/pytilemap/zoom_out_symbol.png b/pytilemap/zoom_out_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..c49ba6af241054476af96343d52237b8f51a39e0 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+`=Ht$S`Y;1W=H@#M9T6{UH}Wv$~YpzxifBA=%83h!W@g+}zZ>5+Ij>!MP|ku_QG` zp**uBL&4qCHy}kXm7Rfsk=xV7F(l&f+v(PRhaE&*`(|QNT*pB9^wDY|;GW4At%kP@xn?$R_umU))o@_^&rr~^b%tCJ?ff#Zvvj`_3R202oF2_ zO?{T!Os;?irf-4;w{I6_`mJ{SeMbRI0w}yZUHx3v IIVCg!01@7wTL1t6 literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py index 2f236e7..5f1bc61 100644 --- a/setup.py +++ b/setup.py @@ -19,6 +19,9 @@ description='Widget for tile maps in PyQt', long_description=long_description, + # Required for image files + include_package_data=True, + # The project's main homepage. url='https://github.com/allebacco/PyTileMap', From 54012d48f05c14012c8c8cfc034cfba68a2106e9 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Wed, 17 Jan 2018 09:57:15 -0500 Subject: [PATCH 02/31] added zoom level to mapscene setCenter --- example/main_gs.py | 3 ++- pytilemap/mapscene.py | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/example/main_gs.py b/example/main_gs.py index 19599b8..aa87e79 100644 --- a/example/main_gs.py +++ b/example/main_gs.py @@ -77,7 +77,7 @@ def __init__(self): self.setCentralWidget(view) - view.scene().setCenter(10.065990, 44.861041) + view.scene().setCenter(10.065990, 44.861041, zoom=7) view.setOptimizationFlag(QGraphicsView.DontSavePainterState, True) view.setRenderHint(QPainter.Antialiasing, True) view.setRenderHint(QPainter.SmoothPixmapTransform, True) @@ -139,6 +139,7 @@ def __init__(self): scaleItem = view.scene().addScale(anchor=Qt.BottomRightCorner) + def main(): w = MapZoom() w.setWindowTitle("OpenStreetMap") diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 88e67cf..93528f5 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -269,7 +269,7 @@ def setSize(self, width, height): rect = QRectF(self.sceneRect().topLeft(), QSizeF(width, height)) self.setSceneRect(rect) - def setCenter(self, lon, lat): + def setCenter(self, lon, lat, zoom=None): """Move the center of the visible area to new coordinates. Update the scene rect. @@ -277,7 +277,11 @@ def setCenter(self, lon, lat): Args: lon(float): New longitude of the center. lat(float): New latitude of the center. + zoom(int [1:15]): Zoom Level """ + if zoom != None and zoom < 15 and zoom > 0: + self._zoom = zoom + rect = QRectF(self.sceneRect()) pos = self.posFromLonLat(lon, lat) rect.moveCenter(QPointF(pos[0], pos[1])) From 46e5476a8743c76b1714c41d07642e60ea7970dd Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 25 Jan 2018 12:49:38 -0500 Subject: [PATCH 03/31] pytilemap commit did not go well --- pytilemap/__init__.py | 34 -- pytilemap/functions.py | 181 ------- pytilemap/imagebutton.py | 39 -- pytilemap/mapescaleitem.py | 268 ---------- pytilemap/mapitems.py | 409 --------------- pytilemap/maplegenditem.py | 151 ------ pytilemap/mapnavitem.py | 150 ------ pytilemap/mapscene.py | 478 ------------------ pytilemap/maptilesources/__init__.py | 6 - pytilemap/maptilesources/maptilesource.py | 39 -- pytilemap/maptilesources/maptilesourcehere.py | 71 --- pytilemap/maptilesources/maptilesourcehttp.py | 116 ----- .../maptilesources/maptilesourcelocal.py | 33 -- pytilemap/maptilesources/maptilesourceosm.py | 13 - pytilemap/mapview.py | 90 ---- pytilemap/qtsupport.py | 48 -- pytilemap/tileutils.py | 105 ---- pytilemap/zoom_in_symbol.png | Bin 557 -> 0 bytes pytilemap/zoom_out_symbol.png | Bin 419 -> 0 bytes 19 files changed, 2231 deletions(-) delete mode 100644 pytilemap/__init__.py delete mode 100644 pytilemap/functions.py delete mode 100644 pytilemap/imagebutton.py delete mode 100644 pytilemap/mapescaleitem.py delete mode 100644 pytilemap/mapitems.py delete mode 100644 pytilemap/maplegenditem.py delete mode 100644 pytilemap/mapnavitem.py delete mode 100644 pytilemap/mapscene.py delete mode 100644 pytilemap/maptilesources/__init__.py delete mode 100644 pytilemap/maptilesources/maptilesource.py delete mode 100644 pytilemap/maptilesources/maptilesourcehere.py delete mode 100644 pytilemap/maptilesources/maptilesourcehttp.py delete mode 100644 pytilemap/maptilesources/maptilesourcelocal.py delete mode 100644 pytilemap/maptilesources/maptilesourceosm.py delete mode 100644 pytilemap/mapview.py delete mode 100644 pytilemap/qtsupport.py delete mode 100644 pytilemap/tileutils.py delete mode 100644 pytilemap/zoom_in_symbol.png delete mode 100644 pytilemap/zoom_out_symbol.png diff --git a/pytilemap/__init__.py b/pytilemap/__init__.py deleted file mode 100644 index 2e09070..0000000 --- a/pytilemap/__init__.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import print_function, absolute_import - -from .mapscene import MapGraphicsScene -from .mapview import MapGraphicsView -from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ - MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ - MapGraphicsRectItem -from .maplegenditem import MapLegendItem -from .mapescaleitem import MapScaleItem -from .maptilesources import MapTileSource, MapTileSourceHere, MapTileSourceHereDemo, \ - MapTileSourceOSM, MapTileSourceHTTP -from .mapnavitem import MapNavItem - - -__all__ = [ - 'MapGraphicsScene', - 'MapGraphicsView', - 'MapGraphicsCircleItem', - 'MapGraphicsLineItem', - 'MapGraphicsPolylineItem', - 'MapGraphicsPixmapItem', - 'MapGraphicsTextItem', - 'MapGraphicsRectItem', - 'MapLegendItem', - 'MapTileSource', - 'MapTileSourceHere', - 'MapTileSourceHereDemo', - 'MapTileSourceOSM', - 'MapTileSourceHTTP', - "MapNavItem", - "ImageButton" -] - -__version__ = '1.0.0' diff --git a/pytilemap/functions.py b/pytilemap/functions.py deleted file mode 100644 index c97f992..0000000 --- a/pytilemap/functions.py +++ /dev/null @@ -1,181 +0,0 @@ -import sys -import sip -import numpy as np - -from qtpy.QtCore import Qt -from qtpy.QtGui import QColor, QBrush, QPen - -SolidLine = Qt.SolidLine -SolidPattern = Qt.SolidPattern -SquareCap = Qt.SquareCap -BevelJoin = Qt.BevelJoin - - -__all__ = [ - 'iterRange', - 'makeColorFromInts', - 'makeColorFromFloats', - 'makeColorFromStr', - 'makeColorFromNdArray', - 'makeColorFromList', - 'makeColor', - 'makeBrush', - 'makePen', - 'clip', -] - -PYTHON_VERSION = sys.version_info[0] - -if PYTHON_VERSION == 2: - iterRange = xrange - import itertools - izip = itertools.izip -else: - iterRange = range - izip = zip - - -def makeColorFromInts(ints): - """Create a color from list or tuple of integers - - Args: - ints (tuple[int]): Integers [0, 255] values for the color. May be 3 or 4 for the alpha color. - - Retuns: - QColor: color - """ - r = ints[0] - g = ints[1] - b = ints[2] - a = ints[3] if len(ints) == 4 else 255 - return QColor(r, g, b, a) - - -def makeColorFromFloats(floats): - """Create a color from list or tuple of floats - - Args: - floats (tuple[float]): Float [0.0, 1.0] values for the color. May be 3 or 4 for the alpha color. - - Retuns: - QColor: color - """ - r = int(floats[0] * 255.0) - g = int(floats[1] * 255.0) - b = int(floats[2] * 255.0) - a = int(floats[3] * 255.0) if len(floats) == 4 else 255 - return QColor(r, g, b, a) - - -def makeColorFromStr(name): - """Create a color from a string - - Args: - name (str): name or html string of the color - - Retuns: - QColor: color - """ - return QColor(name) - - -def makeColorFromNdArray(array): - """Create a list of colors from a numpy array - - Args: - array (numpy.ndarray): (Nx3) or (Nx4) numpy array with number in range [0, 255] or [0.0, 1.0] - - Retuns: - list[QColor]: List of colors - """ - if array.dtype in [np.float32, np.float64]: - array = np.asarray(array * 255.0, dtype=np.int32) - - return [makeColorFromInts(row) for row in array] - - -def makeColorFromList(colorList): - """Create a list of colors from a list, tuple or numpy array - - Args: - colorList (list,tuplenumpy.ndarray): List, tuple or numpy array. The elements must have length of 3 or 4 - and the numbers must be in range [0, 255] or [0.0, 1.0] - - Retuns: - list[QColor]: List of colors - """ - colors = list() - if len(colorList) == 0: - return colors - - element = colorList[0][0] - if isinstance(element, (float, np.floating)): - makeFunction = makeColorFromFloats - elif isinstance(element, (int, np.integer)): - makeFunction = makeColorFromInts - elif isinstance(element, str): - makeFunction = makeColorFromStr - else: - makeFunction = QColor - - return [makeFunction(row) for row in colorList] - - -def makeColor(args): - """Convenience function for creating a QColor or a list of QColors. - - Args: - args: Argument for creating QColor[s] - - Return: - list[QColor],QColor: Created QColor[s]. - - See: - :func:`makeColorFromInts` - :func:`makeColorFromFloats` - :func:`makeColorFromStr` - :func:`makeColorFromNdArray` - :func:`makeColorFromList` - """ - makeFunction = QColor - if isinstance(args, str): - makeFunction = makeColorFromStr - elif isinstance(args, tuple): - if isinstance(args[0], int): - makeFunction = makeColorFromInts - else: - makeFunction = makeColorFromFloats - elif isinstance(args, np.ndarray): - makeFunction = makeColorFromNdArray - elif isinstance(args, list): - makeFunction = makeColorFromList - - return makeFunction(args) - - -def makeBrush(color, style=SolidPattern): - if color is None: - return QBrush(Qt.NoBrush) - if isinstance(color, QBrush): - return QBrush(color) - color = makeColor(color) - if isinstance(color, list): - return [QBrush(c, style) for c in color] - return QBrush(color, style) - - -def makePen(color, width=1.0, style=SolidLine, cap=SquareCap, join=BevelJoin): - if color is None: - return QPen(Qt.NoPen) - if isinstance(color, QPen): - return QPen(color) - brush = makeBrush(color) - if isinstance(brush, list): - if not hasattr(width, '__iter__'): - width = np.full(len(brush), width, dtype=np.float64) - return [QPen(b, w, style=style) for b, w in izip(brush, width)] - return QPen(brush, width, style=style, cap=cap, join=join) - - -def clip(value, minValue, maxValue): - return min(maxValue, max(minValue, value)) diff --git a/pytilemap/imagebutton.py b/pytilemap/imagebutton.py deleted file mode 100644 index ffd1803..0000000 --- a/pytilemap/imagebutton.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Signal -from qtpy.QtWidgets import QGraphicsObject, QGraphicsItemGroup, QGraphicsPixmapItem - -class ImageButton(QGraphicsObject): - ''' - Custom Image Holder Class that Allows for event handling - - - QGraphicsPixmapItem is not a QObject, so cannot catch events. - ''' - QtParentClass = QGraphicsObject - - clicked = Signal(int) - - def __init__(self, img, parent=None): - ''' - Args: - img: A QPixmap instance - - Keyword Args: - parent: A pyqt window instance - ''' - QGraphicsObject.__init__(self, parent=parent) - self.image = QGraphicsPixmapItem(img, parent=self) - self.parent = parent - - def paint(self, painter, option, widget): - self.image.paint(painter,option,widget) - - def boundingRect(self): - return self.image.boundingRect() - - def mouseReleaseEvent(self, event): - self.clicked.emit(1) - - def mousePressEvent(self, event): - pass -# end ImageButton - diff --git a/pytilemap/mapescaleitem.py b/pytilemap/mapescaleitem.py deleted file mode 100644 index eb982c4..0000000 --- a/pytilemap/mapescaleitem.py +++ /dev/null @@ -1,268 +0,0 @@ -import numpy as np - -from qtpy.QtCore import Qt, Slot, QPointF, QRectF -from qtpy.QtGui import QFontMetrics, QFont -from qtpy.QtWidgets import QGraphicsObject - - -from .mapitems import MapItem -from .functions import makePen, makeBrush, clip -from .qtsupport import getQVariantValue - - -class MapScaleItem(QGraphicsObject, MapItem): - """Scale bar for the visualization of the scale of teh map. - - The scale bar is located on the bottom right of the map and can' be moved. - The scale bar accepts hover events and change its color. - """ - - QtParentClass = QGraphicsObject - - EarthCircumference = 1000.0 * 6372.7982 * 2.0 * np.pi - DegToRad = np.pi / 180.0 - - _defaultScaleVisualization = { - 21: 5, - 20: 10, - 19: 20, - 18: 20, - 17: 50, - 16: 100, - 15: 200, - 14: 500, - 13: 1 * 1000, - 12: 2 * 1000, - 11: 5 * 1000, - 10: 10 * 1000, - 9: 20 * 1000, - 8: 50 * 1000, - 7: 100 * 1000, - 6: 200 * 1000, - 5: 200 * 1000, - 4: 500 * 1000, - 3: 1000 * 1000, - } - """dict: Default meters that will be shown within the scale for each zoom value. - """ - - _posForAnchors = { - Qt.TopLeftCorner: QPointF(20.0, 15.0), - Qt.TopRightCorner: QPointF(20.0, -15.0), - Qt.BottomLeftCorner: QPointF(20.0, -15.0), - Qt.BottomRightCorner: QPointF(20.0, 15.0), - } - - def __init__(self, textPen='black', barBrush=(190, 190, 190, 160), barPen=(190, 190, 190, 240), - barBrushHover=(110, 110, 110, 255), barPenHover=(90, 90, 90, 255), - anchor=Qt.BottomRightCorner, anchorPos=None, parent=None): - """Construct a scale bar with text on the right bottom of the map - - Keyword Args: - textPen: QPen to use for drawing the text. Default 'black'. - barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) - barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) - barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. - Default (110, 110, 110, 255). - barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. - Default (90, 90, 90, 255). - parent: Parent item - anchor (Qt.Corner): The *corner* used as anchor for the item, Valid values are within the - Qt.Corner enum - anchorPos (QPointF): The distance between the item and the *corner* - - Note: - Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() - are accepted. - """ - QGraphicsObject.__init__(self, parent=parent) - MapItem.__init__(self) - - self.setZValue(100) - - self._textPen = makePen(textPen) - self._barBrush = makeBrush(barBrush) - self._barPen = makePen(barPen) - self._barBrushHover = makeBrush(barBrushHover) - self._barPenHover = makePen(barPenHover) - - self._scaleView = MapScaleItem._defaultScaleVisualization.copy() - self._minZoomScale = min(self._scaleView.keys()) - self._maxZoomScale = max(self._scaleView.keys()) - - self.setAcceptHoverEvents(True) - self._hover = False - - if anchorPos is None: - anchorPos = self._posForAnchors[anchor] - self._anchorPos = QPointF(anchorPos) - self._anchor = anchor - - self._barWidth = 0 # The width of the scale bar - self._text = '' # The text to display near the scale bar - self._zoom = 0 # The current zoom level - self._meters = 0 # The number of meters used to evaluate the size of the scale bar and its text - self._meterPerPixelsEquator = 0 # The number of meters each pixel represents at the equator - self._textRect = QRectF() # The bounding rect of text - - def _sceneChanged(self, oldScene, newScene): - if oldScene is not None: - oldScene.sceneRectChanged.disconnect(self._setSceneRect) - if newScene is not None: - newScene.sceneRectChanged.connect(self._setSceneRect) - # Setup the new position of the item - self.setZoom(newScene.zoom()) - self._setSceneRect(newScene.sceneRect()) - - def updatePosition(self, scene): - # Nothing to do here - pass - - def boundingRect(self): - anchor = self._anchor - if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: - return QRectF(0, 0, self._barWidth + 3, 10).united(self._textRect) - else: - textRect = self._textRect.translated(self._barWidth + 10, 0) - return QRectF(0, 0, self._barWidth + 3, 10).united(textRect) - - def paint(self, painter, option, widget): - if self._hover: - painter.setPen(self._barPenHover) - painter.setBrush(self._barBrushHover) - else: - painter.setPen(self._barPen) - painter.setBrush(self._barBrush) - painter.drawRoundedRect(0, 0, self._barWidth, 10, 3, 3) - - anchor = self._anchor - if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: - textRect = self._textRect - else: - textRect = self._textRect.translated(self._barWidth + 10, 0) - painter.setPen(self._textPen) - painter.drawText(textRect, Qt.TextSingleLine, self._text) - - @Slot(QRectF) - def _setSceneRect(self, rect): - self._updateScaleBar() - - anchorPos = self._anchorPos - anchor = self._anchor - newPos = None - if anchor == Qt.BottomRightCorner: - newPos = rect.bottomRight() - anchorPos - QPointF(self._barWidth, 0.0) - elif anchor == Qt.TopRightCorner: - newPos = rect.topRight() - anchorPos - QPointF(self._barWidth, 0.0) - elif anchor == Qt.TopLeftCorner: - newPos = rect.topLeft() + anchorPos - elif anchor == Qt.BottomLeftCorner: - newPos = rect.bottomLeft() + anchorPos - else: - raise NotImplementedError('Other corner have not actually been implemented') - - self.setPos(newPos) - - def _updateScaleBar(self): - scene = self.scene() - if scene is None: - self.setVisible(False) - return - self.setVisible(True) - - centerYRad = scene.center().y() * self.DegToRad - meterPerPixels = self._meterPerPixelsEquator * np.cos(centerYRad) - self._barWidth = int(self._meters / meterPerPixels) - - def setZoom(self, zoom): - '''Set a new zoom level. - Args: - zoom (int): The new zoom level. - ''' - self._zoom = zoom - zoomSelector = clip(zoom, self._minZoomScale, self._maxZoomScale) - meters = self._scaleView[zoomSelector] - if meters >= 1000: - self._text = '%d km' % (meters / 1000.0) - else: - self._text = '%d m' % meters - self._meters = meters - self._meterPerPixelsEquator = self.EarthCircumference / np.power(2.0, zoom + 8) - - # Evaluate the bounding box of the current text - anchor = self._anchor - textRect = QFontMetrics(QFont()).boundingRect(self._text) - if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: - textRect.moveLeft(-textRect.width() - 10) - textRect.moveTop(-textRect.height() + 10) - else: - textRect.moveTop(-textRect.height() + 14) - self._textRect = QRectF(textRect) - self.update() - - def setScaleForZoom(self, zoomLevel, metersInScaleBar): - """Set the scale in meters/kilometers to be shown for a zoom level - - Args: - zoomLevel(int): Level of the zoom - metersInScaleBar(int): Meters to be shown in the scale bar - """ - if zoomLevel > self._maxZoomScale + 1: - raise ValueError('zoomLevel must be at least %d' % (self._maxZoomScale + 1)) - if zoomLevel < self._minZoomScale - 1: - raise ValueError('zoomLevel must be at minimum %d' % (self._minZoomScale + 1)) - - self._scaleView[zoomLevel] = metersInScaleBar - self._minZoomScale = min(self._scaleView.keys()) - self._maxZoomScale = max(self._scaleView.keys()) - - # Re-evaluate the scale bar for the current zoom - self.setZoom(self._zoom) - - self.update() - - def restoreDefaultScaleLevels(self): - """Restore the default meter scale for the zoom levels - """ - self._scaleView = MapScaleItem._defaultScaleVisualization.copy() - self._minZoomScale = min(self._scaleView.keys()) - self._maxZoomScale = max(self._scaleView.keys()) - - # Re-evaluate the scale bar for the current zoom - self.setZoom(self._zoom) - - self.update() - - def setColors(self, **kwargs): - """Set a new color for the scale bar and the text - - Keyword Args: - textPen: QPen to use for drawing the text. Default do not change. - barBrush: QBrush to use for drawing the scale bar. Default do not change. - barPen: QPen to use for drawing the scale bar border.Default do not change. - barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. - Default do not change. - barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. - Default do not change. - """ - if 'textPen' in kwargs: - self._textPen = makePen(kwargs['textPen']) - if 'barBrush' in kwargs: - self._barBrush = makeBrush(kwargs['barBrush']) - if 'barPen' in kwargs: - self._barPen = makePen(kwargs['barPen']) - if 'barBrushHover' in kwargs: - self._barBrushHover = makeBrush(kwargs['barBrushHover']) - if 'barPenHover' in kwargs: - self._barPenHover = makePen(kwargs['barPenHover']) - self.update() - - def hoverEnterEvent(self, event): - event.accept() - self._hover = True - self.update() - - def hoverLeaveEvent(self, event): - event.accept() - self._hover = False - self.update() diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py deleted file mode 100644 index 581bda9..0000000 --- a/pytilemap/mapitems.py +++ /dev/null @@ -1,409 +0,0 @@ -from __future__ import print_function, absolute_import - -import numpy as np - -from qtpy.QtCore import Qt, QLineF, QPointF, QRectF -from qtpy.QtGui import QPainterPath -from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ - QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem - -from .functions import iterRange, makePen, izip -from .qtsupport import getQVariantValue - -SolidLine = Qt.SolidLine - - -class MapItem(object): - """Base class for each item in the MapGraphicScene - - The default implementation connects the MapGraphicScene.sigZoomChanged() signal - to the MapItem.setZoom() slot. This slot call the MapItem.updatePosition() method - for updating the position of the item in reaction to a change in the zoom level. - """ - - QtParentClass = None - - def __init__(self): - if not isinstance(self, QGraphicsItem): - raise RuntimeError('MapItem must be an instance of QGraphicsItem') - - def itemChange(self, change, value): - if change == self.ItemSceneChange: - # Disconnect the old scene, if any - oldScene = self.scene() - if oldScene is not None: - oldScene.sigZoomChanged.disconnect(self.setZoom) - # Connect the new scene, if any - newScene = getQVariantValue(value) - if newScene is not None: - newScene.sigZoomChanged.connect(self.setZoom) - - # Notify the item that the scene is changed - self._sceneChanged(oldScene, newScene) - - # Setup the new position of the item - if newScene is not None: - self.updatePosition(newScene) - - return self.QtParentClass.itemChange(self, change, value) - - def _sceneChanged(self, oldScene, newScene): - """Called when the current scene change. - - - This function can be reimplemented for notifying that the scene has changed. - The function is called when the scene has changed, just before the - :meth:`~updatePosition` method. - - Default - - Args: - oldScene (QGraphicsScene): The old scene, or ``None``. - newScene (QGraphicsScene): The new scene, or ``None``. - - Note: - :meth:`~scene` method is pointing to the ``oldScene``. - """ - pass - - def setZoom(self, zoom): - '''Set a new zoom level. - - Args: - zoom (int): The new zoom level. - ''' - scene = self.scene() - self.updatePosition(scene) - - def updatePosition(self, scene): - raise NotImplementedError() - - -class MapGraphicsCircleItem(QGraphicsEllipseItem, MapItem): - """Circle item for the MapGraphicsScene - """ - - QtParentClass = QGraphicsEllipseItem - - def __init__(self, longitude, latitude, radius, parent=None): - """Constructor. - - Args: - longitude(float): Longitude of the center of the circle. - latitude(float): Latitude of the center of the circle. - radius(float): Radius of the circle in pixels. - scene(MapGraphicsScene): Scene to which the circle belongs. - parent(QGraphicsItem): Parent item, default None. - - Note: - The management of the parent item is work in progress. - """ - QGraphicsEllipseItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon = longitude - self._lat = latitude - self._radius = radius - - def updatePosition(self, scene): - """Update the position of the circle. - - Args: - scene(MapGraphicsScene): Scene to which the circle belongs. - """ - pos = scene.posFromLonLat(self._lon, self._lat) - r = self._radius - d = r * 2 - self.prepareGeometryChange() - self.setRect(pos[0] - r, pos[1] - r, d, d) - - def setLonLat(self, longitude, latitude): - """Set the center coordinates of the circle. - - Args: - longitude(float): Longitude of the center of the circle. - latitude(float): Latitude of the center of the circle. - """ - self._lon = longitude - self._lat = latitude - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - def setRadius(self, radius): - self._radius = radius - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - -class MapGraphicsRectItem(QGraphicsRectItem, MapItem): - """Circle item for the MapGraphicsScene - """ - - QtParentClass = QGraphicsRectItem - - def __init__(self, lon0, lat0, lon1, lat1, parent=None): - """Constructor. - - Args: - lon0(float): Longitude of the top left point. - lat0(float): Latitude of the top left point. - lon1(float): Longitude of the bottom right point. - lat1(float): Latitude of the bottom right point. - parent(QGraphicsItem): Parent item, default None. - - Note: - The management of the parent item is work in progress. - """ - QGraphicsRectItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - - def updatePosition(self, scene): - """Update the position of the circle. - - Args: - scene(MapGraphicsScene): Scene to which the circle belongs. - """ - pos0 = scene.posFromLonLat(self._lon0, self._lat0) - pos1 = scene.posFromLonLat(self._lon1, self._lat1) - - self.prepareGeometryChange() - rect = QRectF(pos0, pos1).normalized() - self.setRect(rect) - self.setPos(QPointF(0.0, 0.0)) - - def setLonLat(self, lon0, lat0, lon1, lat1): - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - scene = self.scene() - if scene is not None: - self.updatePosition(self.scene()) - - -class MapGraphicsLineItem(QGraphicsLineItem, MapItem): - - QtParentClass = QGraphicsLineItem - - def __init__(self, lon0, lat0, lon1, lat1, parent=None): - QGraphicsLineItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - - def updatePosition(self, scene): - pos0 = scene.posFromLonLat(self._lon0, self._lat0) - pos1 = scene.posFromLonLat(self._lon1, self._lat1) - deltaPos = QPointF(pos1[0] - pos0[0], pos1[1] - pos0[1]) - - self.prepareGeometryChange() - self.setLine(QLineF(QPointF(0.0, 0.0), deltaPos)) - self.setPos(pos0[0], pos0[1]) - - def setLonLat(self, lon0, lat0, lon1, lat1): - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - scene = self.scene() - if scene is not None: - self.updatePosition(self.scene()) - - -class MapGraphicsPolylineItem(QGraphicsPathItem, MapItem): - - QtParentClass = QGraphicsPathItem - - def __init__(self, longitudes, latitudes, parent=None): - QGraphicsPathItem.__init__(self, parent=parent) - MapItem.__init__(self) - - assert len(longitudes) == len(latitudes) - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - - def updatePosition(self, scene): - path = QPainterPath() - - self.prepareGeometryChange() - - count = len(self._longitudes) - if count > 0: - x, y = scene.posFromLonLat(self._longitudes, self._latitudes) - path.moveTo(x[0], y[0]) - for i in iterRange(1, count): - path.lineTo(x[i], y[i]) - - self.setPath(path) - - def setLonLat(self, longitudes, latitudes): - assert len(longitudes) == len(latitudes) - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - -class MapGraphicsPixmapItem(QGraphicsPixmapItem, MapItem): - """Item for showing a pixmap in a MapGraphicsScene. - """ - - QtParentClass = QGraphicsPixmapItem - - def __init__(self, longitude, latitude, pixmap, parent=None): - """Constructor. - - Args: - longitude(float): Longitude of the origin of the pixmap. - latitude(float): Latitude of the center of the pixmap. - pixmap(QPixmap): Pixmap. - scene(MapGraphicsScene): Scene the item belongs to. - parent(QGraphicsItem): Parent item. - """ - QGraphicsPixmapItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon = longitude - self._lat = latitude - self.setPixmap(pixmap) - - def updatePosition(self, scene): - """Update the origin position of the item. - - Origin coordinates are unchanged. - - Args: - scene(MapGraphicsScene): Scene the item belongs to. - """ - pos = scene.posFromLonLat(self._lon, self._lat) - self.prepareGeometryChange() - self.setPos(pos[0], pos[1]) - - def setLonLat(self, longitude, latitude): - """Update the origin coordinates of the item. - - Origin position will be updated. - - Args: - longitude(float): Longitude of the origin of the pixmap. - latitude(float): Latitude of the center of the pixmap. - """ - self._lon = longitude - self._lat = latitude - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - -class MapGraphicsTextItem(QGraphicsSimpleTextItem, MapItem): - """Text item for the MapGraphicsScene - """ - - QtParentClass = QGraphicsSimpleTextItem - - def __init__(self, longitude, latitude, text, parent=None, min_zoom_visibility=None): - QGraphicsSimpleTextItem.__init__(self, text, parent=parent) - MapItem.__init__(self) - self._min_zoom = min_zoom_visibility - self._lon, self._lat = longitude, latitude - - def resetMinZoomVisibility(self): - """Delete level of zoom under which the text disappears. """ - self._min_zoom = None - - def setMinZoomVisibility(self, zoom_level): - """Update level of zoom under which the text disappears. """ - self._min_zoom = zoom_level - - def updatePosition(self, scene): - """Update the origin position of the item.""" - - pos = scene.posFromLonLat(self._lon, self._lat) - self.setPos(pos) - if self._min_zoom is not None: - self.setVisible(scene._zoom >= self._min_zoom) - - -class MapGraphicsLinesGroupItem(QGraphicsItem, MapItem): - - QtParentClass = QGraphicsItem - - def __init__(self, longitudes, latitudes, parent=None): - QGraphicsItem.__init__(self, parent=parent) - MapItem.__init__(self) - - assert len(longitudes) == len(latitudes) - assert len(longitudes) >= 2 - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - - # Setup internal lines - linesGroup = QGraphicsItemGroup(parent=self) - self._linesGroup = linesGroup - self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] - - def paint(self, painter, option, widget=None): - pass - - def boundingRect(self): - return self._linesGroup.boundingRect() - - def setLineStyle(self, colors, width=1., style=SolidLine): - pen = makePen(colors, width=width, style=style) - - if isinstance(pen, list): - if len(pen) != len(self._lines): - raise ValueError('The number of colors must be equal to the number of lines') - for line, p in izip(self._lines, pen): - line.setPen(p) - else: - for line in self._lines: - line.setPen(pen) - - def updatePosition(self, scene): - self.prepareGeometryChange() - - x, y = scene.posFromLonLat(self._longitudes, self._latitudes) - lines = self._lines - for i in iterRange(0, len(lines)-1): - lines[i].setLine(x[i], y[i], x[i+1], y[i+1]) - - def setLonLat(self, longitudes, latitudes): - assert len(longitudes) == len(latitudes) - assert len(longitudes) >= 2 - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - - old_lines = self._lines - for line in old_lines: - line.setParentItem(None) - - scene = self.scene() - if scene is not None: - for line in old_lines: - scene.removeItem(line) - - linesGroup = self._linesGroup - self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] - - if scene is not None: - self.updatePosition(scene) - - def __getitem__(self, index): - return self._lines[index] diff --git a/pytilemap/maplegenditem.py b/pytilemap/maplegenditem.py deleted file mode 100644 index 8823920..0000000 --- a/pytilemap/maplegenditem.py +++ /dev/null @@ -1,151 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Slot, QRectF, QPointF -from qtpy.QtGui import QPen, QBrush, QColor -from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem - -from .mapitems import MapItem -from .functions import makePen, makeBrush -from .qtsupport import getQVariantValue - - -class MapLegendEntryItem(QGraphicsItemGroup): - - def __init__(self, shape, text, parent=None): - QGraphicsItemGroup.__init__(self, parent=parent) - - text = QGraphicsSimpleTextItem(text, parent=shape) - br = shape.boundingRect() - x = br.right() + 10 - y = br.top() + 3 - text.setPos(x, y) - self.addToGroup(shape) - - self._text = text - - def top(self): - return self.boundingRect().top() - - def bottom(self): - return self.boundingRect().bottom() - - def right(self): - return self.boundingRect().right() - - def left(self): - return self.boundingRect().left() - - def text(self): - return self._text - - -class MapLegendItem(QGraphicsObject, MapItem): - - QtParentClass = QGraphicsObject - - def __init__(self, pos=None, parent=None): - QGraphicsObject.__init__(self, parent=parent) - MapItem.__init__(self) - self.setZValue(200.0) - - self._anchorPos = QPointF(pos) if pos is not None else QPointF(10.0, 10.0) - - self._border = QGraphicsRectItem(parent=self) - self._border.setPen(QPen(Qt.NoPen)) - self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) - - self._entries = list() - self._entriesGroup = QGraphicsItemGroup(parent=self) - - def _sceneChanged(self, oldScene, newScene): - if oldScene is not None: - oldScene.sceneRectChanged.disconnect(self.setSceneRect) - if newScene is not None: - newScene.sceneRectChanged.connect(self.setSceneRect) - # Setup the new position of the item - self.setSceneRect(newScene.sceneRect()) - - def updatePosition(self, scene): - pass - - def addPoint(self, text, color, border=None, size=20.0): - shape = QGraphicsEllipseItem(size / 2.0, size / 2.0, size, size) - brush = makeBrush(color) - shape.setBrush(brush) - shape.setPen(makePen(border)) - - self.addEntry(MapLegendEntryItem(shape, text)) - - def addRect(self, text, color, border=None, size=20.0): - shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) - brush = makeBrush(color) - shape.setBrush(brush) - shape.setPen(makePen(border)) - - self.addEntry(MapLegendEntryItem(shape, text)) - - def addLine(self, text, color, width=1.): - shape = QGraphicsLineItem(10., 10., 20., 20.) - pen = makePen(color, width=width) - shape.setPen(pen) - self.addEntry(MapLegendEntryItem(shape, text)) - - def addEntry(self, entry): - self._entries.append(entry) - self._entriesGroup.addToGroup(entry) - self._updateLayout() - - def boundingRect(self): - return self._border.boundingRect() - - def paint(*args, **kwargs): - pass - - @Slot(QRectF) - def setSceneRect(self, rect): - self.setPos(rect.topLeft() + self._anchorPos) - - def _updateLayout(self): - self.prepareGeometryChange() - - bottom = 0.0 - left = 0.0 - right = 0.0 - for entry in self._entries: - entry.setPos(left, bottom) - bottom += entry.bottom() + 5.0 - right = max(right, entry.right() + 5.0) - - self._border.setRect(0.0, 0.0, right, bottom + 5.0) - - def pen(self): - """Pen for the background of the legend - - Returns: - QPen: Pen for the background of the legend - """ - return self._border.pen() - - def brush(self): - """Brush for the background of the legend - - Returns: - QBrush: Brush for the background of the legend - """ - return self._border.brush() - - def setPen(self, *args, **kwargs): - """Set the pen for the background of the legend - - The arguments are the same of the :func:`makePen` function - """ - return self._border.setPen(makePen(*args, **kwargs)) - - def setBrush(self, *args, **kwargs): - """Set the brush for the background of the legend - - The arguments are the same of the :func:`makeBrush` function - """ - return self._border.setBrush(makeBrush(*args, **kwargs)) - diff --git a/pytilemap/mapnavitem.py b/pytilemap/mapnavitem.py deleted file mode 100644 index 1432e9f..0000000 --- a/pytilemap/mapnavitem.py +++ /dev/null @@ -1,150 +0,0 @@ -from __future__ import print_function, absolute_import - -import os -from qtpy.QtCore import Qt, Slot, QRectF, QPointF, QObject, Signal -from qtpy.QtGui import QPen, QBrush, QColor, QPixmap -from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem, QGraphicsPixmapItem - -from .imagebutton import ImageButton -from .mapitems import MapItem -from .functions import makePen, makeBrush -from .qtsupport import getQVariantValue - -from .maplegenditem import * - - -class MapNavItem(QGraphicsObject, MapItem): - - QtParentClass = QGraphicsObject - - _posForAnchors = { - Qt.TopLeftCorner: QPointF(20.0, 75.0), - Qt.TopRightCorner: QPointF(40.0, -15.0), - Qt.BottomLeftCorner: QPointF(20.0, -15.0), - Qt.BottomRightCorner: QPointF(30.0, 75.0), - } - - - def __init__(self, anchor, parent=None): - QGraphicsObject.__init__(self, parent=parent) - MapItem.__init__(self) - self.setZValue(200.0) - - anchorPos = self._posForAnchors[anchor] - self._anchorPos = QPointF(anchorPos) - self._anchor = anchor - - self._border = QGraphicsRectItem(parent=self) - self._border.setPen(QPen(Qt.NoPen)) - self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) - - self._entries = list() - - imgfile = os.path.dirname(__file__) + os.sep + 'zoom_in_symbol.png' - img = QPixmap(24,24) - img.load(imgfile) - img = img.scaled(24,24) - img = ImageButton(img, parent=self) - self.zoom_in_button = img - self.addEntry(self.zoom_in_button) - - imgfile = os.path.dirname(__file__) + os.sep + 'zoom_out_symbol.png' - img2 = QPixmap(24,24) - img2.load(imgfile) - img2 = img2.scaled(24,24) - img2 = ImageButton(img2, parent=self) - self.zoom_out_button = img2 - self.addEntry(self.zoom_out_button) - - def _sceneChanged(self, oldScene, newScene): - if oldScene is not None: - oldScene.sceneRectChanged.disconnect(self.setSceneRect) - if newScene is not None: - newScene.sceneRectChanged.connect(self.setSceneRect) - # Setup the new position of the item - self.setSceneRect(newScene.sceneRect()) - - def updatePosition(self, scene): - pass - - def addRect(self, text, color, border=None, size=20.0): - shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) - brush = makeBrush(color) - shape.setBrush(brush) - shape.setPen(makePen(border)) - - self.addEntry(MapLegendEntryItem(shape, text)) - - def addEntry(self, entry): - self._entries.append(entry) - self._updateLayout() - - def boundingRect(self): - return self._border.boundingRect() - - def paint(*args, **kwargs): - pass - - @Slot(QRectF) - def setSceneRect(self, rect): - anchorPos = self._anchorPos - anchor = self._anchor - newPos = None - if anchor == Qt.BottomRightCorner: - newPos = rect.bottomRight() - anchorPos - elif anchor == Qt.TopRightCorner: - newPos = rect.topRight() - anchorPos - elif anchor == Qt.TopLeftCorner: - newPos = rect.topLeft() + anchorPos - elif anchor == Qt.BottomLeftCorner: - newPos = rect.bottomLeft() + anchorPos - else: - raise NotImplementedError('Other corner have not actually been implemented') - - self.setPos(newPos) - - - def _updateLayout(self): - self.prepareGeometryChange() - - bottom = 0.0 - left = 0.0 - right = 0.0 - for entry in self._entries: - entry.setPos(left, bottom) - bottom += entry.boundingRect().bottom() - right = max(right, entry.boundingRect().right() + 1.0) - - self._border.setRect(0.0, 0.0, right, bottom + 1.0) - - def pen(self): - """Pen for the background of the legend - - Returns: - QPen: Pen for the background of the legend - """ - return self._border.pen() - - def brush(self): - """Brush for the background of the legend - - Returns: - QBrush: Brush for the background of the legend - """ - return self._border.brush() - - def setPen(self, *args, **kwargs): - """Set the pen for the background of the legend - - The arguments are the same of the :func:`makePen` function - """ - return self._border.setPen(makePen(*args, **kwargs)) - - def setBrush(self, *args, **kwargs): - """Set the brush for the background of the legend - - The arguments are the same of the :func:`makeBrush` function - """ - return self._border.setBrush(makeBrush(*args, **kwargs)) - diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py deleted file mode 100644 index 93528f5..0000000 --- a/pytilemap/mapscene.py +++ /dev/null @@ -1,478 +0,0 @@ -from __future__ import print_function, absolute_import, division - -from numpy import floor - -from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint -from qtpy.QtGui import QPixmap -from qtpy.QtWidgets import QGraphicsScene - -from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ - MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ - MapGraphicsRectItem, MapGraphicsLinesGroupItem -from .maplegenditem import MapLegendItem -from .mapescaleitem import MapScaleItem -from .mapnavitem import MapNavItem -from .functions import iterRange -from .tileutils import posFromLonLat, lonLatFromPos - - -class MapGraphicsScene(QGraphicsScene): - """Graphics scene for showing a slippy map. - """ - - sigZoomChanged = Signal(int) - - def __init__(self, tileSource, parent=None): - """Constructor. - - Args: - tileSource(MapTileSource): Source for loading the tiles. - parent(QObject): Parent object, default `None` - """ - QGraphicsScene.__init__(self, parent=parent) - - self._zoom = 15 - - self._tileSource = tileSource - self._tileSource.setParent(self) - self._tileSource.tileReceived.connect(self.setTilePixmap) - tdim = self._tileSource.tileSize() - - self._emptyTile = QPixmap(tdim, tdim) - self._emptyTile.fill(Qt.lightGray) - - self._tilesRect = QRect() - self._tilePixmaps = {} - - self._tileInDownload = list() - - self.setSceneRect(0.0, 0.0, 400, 300) - self.sceneRectChanged.connect(self.onSceneRectChanged) - - @Slot() - def close(self): - self._tileSource.close() - - def setTileSource(self, newTileSource): - self._tileSource.tileReceived.disconnect(self.setTilePixmap) - self._tileSource.close() - - self._tilePixmaps.clear() - self._tileInDownload = list() - - self._tileSource = newTileSource - self._tileSource.setParent(self) - self._tileSource.tileReceived.connect(self.setTilePixmap) - - self.requestTiles() - - self.invalidate() - self.update() - - @Slot(QRectF) - def onSceneRectChanged(self, rect): - """Callback for the changing of the visible rect. - - Evaluate the visible tiles and request to load the new tiles. - - Args: - rect(QRectF): Current visible area. - """ - tdim = self._tileSource.tileSize() - center = rect.center() - ct = self.tileFromPos(center.x(), center.y()) - tx = ct.x() - ty = ct.y() - - width = rect.width() - height = rect.height() - # top left corner of the center tile - xp = int(width / 2.0 - (tx - floor(tx)) * tdim) - yp = int(height / 2.0 - (ty - floor(ty)) * tdim) - - # first tile vertical and horizontal - xs = tx - (xp + tdim - 1) / tdim - ys = ty - (yp + tdim - 1) / tdim - - # last tile vertical and horizontal - xe = (width - xp - 1) / tdim - xs + 1 + tx - ye = (height - yp - 1) / tdim - ys + 1 + ty - - # define the rect of visible tiles - self._tilesRect = QRect(xs, ys, xe, ye) - - # Request the loading of new tiles (if needed) - self.requestTiles() - - self.invalidate() - self.update() - - def drawBackground(self, painter, rect): - """Draw the background tiles. - - If a tile is not available, draw a gray rectangle. - - Args: - painter(QPainter): Painter for drawing. - rect(QRectF): Current visible area. - """ - tilesRect = self._tilesRect - left = tilesRect.left() - top = tilesRect.top() - numXtiles = tilesRect.width() - numYtiles = tilesRect.height() - tdim = self._tileSource.tileSize() - pixRect = QRectF(0.0, 0.0, tdim, tdim) - emptyTilePix = self._emptyTile - tilePixmaps = self._tilePixmaps - - for x in iterRange(numXtiles+1): - for y in iterRange(numYtiles+1): - tp = (x + left, y + top) - box = self.tileRect(tp[0], tp[1]) - # Use default gray image if tile image is missing - pix = tilePixmaps.get(tp, emptyTilePix) - painter.drawPixmap(box, pix, pixRect) - - def zoomTo(self, pos, zoomlevel): - """Zoom to a specific zoom level. - - If the level is out of range, the zoom action is ignored. - - clear the current tile cache, evaluate the new center and - update the position of all the items. - - Args: - zoomlevel(int): New zoom level. - """ - - tileSource = self._tileSource - if zoomlevel > tileSource.maxZoom() or zoomlevel < tileSource.minZoom(): - return - - # Get the coordinates of the center using the position in pixels of the mouse - pos_corr = self.views()[0].mapToScene(pos) - coord = self.lonLatFromPos(pos_corr.x(), pos_corr.y()) - - # Set the new zoom level - self._zoom = zoomlevel - - # Clear cache and abort active requests - self._tileSource.abortAllRequests() - self._tilePixmaps.clear() - - # Re-center map so that the point on which it was zoomed is in the same position - self.setCenter(coord[0], coord[1]) - pos_corr = self.views()[0].mapToScene(pos) - center = self.sceneRect().center() - self.translate(center.x() - pos_corr.x(), center.y() - pos_corr.y()) - - self.sigZoomChanged.emit(zoomlevel) - - def zoomIn(self, pos=None): - """Increments the zoom level - - Args: - pos (QPointF): Center position, Latitude and Longitude. Default None for the - current center position. - """ - if pos is None: - pos = QPoint(self.width()/2, self.height()/2) - self.zoomTo(pos, self._zoom + 1) - - def zoomOut(self, pos=None): - """Decrements the zoom level - - Args: - pos (QPointF): Center position, Latitude and Longitude. Default None for the - current center position. - """ - if pos is None: - pos = QPoint(self.width()/2, self.height()/2) - self.zoomTo(pos, self._zoom - 1) - - @Slot() - def handleZoomIn(self): - self.zoomIn() - - @Slot() - def handleZoomOut(self): - self.zoomOut() - - def zoom(self): - return self._zoom - - @Slot(int, int, int, QPixmap) - def setTilePixmap(self, x, y, zoom, pixmap): - """Set the image of the tile. - - Args: - x(int): X coordinate of the tile. - y(int): Y coordinate of the tile. - zoom(int): Zoom coordinate of the tile. - pixmap(QPixmap): Image for the tile. - """ - if self._zoom == zoom: - self._tilePixmaps[(x, y)] = pixmap - self.update() - - def requestTiles(self): - """Request the loading of tiles. - - Check the loaded tiles and requests only - the missing tiles. - """ - tilesRect = self._tilesRect - tilePixmaps = self._tilePixmaps - - numXtiles = tilesRect.width() - numYtiles = tilesRect.height() - left = tilesRect.left() - top = tilesRect.top() - tileSource = self._tileSource - zoom = self._zoom - - # Request load of new tiles - for x in iterRange(numXtiles): - for y in iterRange(numYtiles): - tp = (left + x, top + y) - # Request tile only if missing - if tp not in tilePixmaps: - pix = tileSource.requestTile(tp[0], tp[1], zoom) - if pix is not None: - tilePixmaps[tp] = pix - - self.update() - - def tileRect(self, tx, ty): - """Area for a specific tile. - - Args: - tx(int): X coordinate of the tile. - ty(int): Y coordinate of the tile. - - Returns: - QRectF, the area of the tile. - """ - tdim = self._tileSource.tileSize() - return QRectF(tx * tdim, ty * tdim, tdim, tdim) - - def setSize(self, width, height): - """Set the size of the visible area in pixels. - - Update the scene rect. - - Args: - width(int): Width of the visible area. - height(int): Height of the visible area. - """ - rect = QRectF(self.sceneRect().topLeft(), QSizeF(width, height)) - self.setSceneRect(rect) - - def setCenter(self, lon, lat, zoom=None): - """Move the center of the visible area to new coordinates. - - Update the scene rect. - - Args: - lon(float): New longitude of the center. - lat(float): New latitude of the center. - zoom(int [1:15]): Zoom Level - """ - if zoom != None and zoom < 15 and zoom > 0: - self._zoom = zoom - - rect = QRectF(self.sceneRect()) - pos = self.posFromLonLat(lon, lat) - rect.moveCenter(QPointF(pos[0], pos[1])) - self.setSceneRect(rect) - - - def center(self): - centerPos = self.sceneRect().center() - centerCoord = self.lonLatFromPos(centerPos.x(), centerPos.y()) - return QPointF(centerCoord[0], centerCoord[1]) - - def translate(self, dx, dy): - """Translate the visible area by dx, dy pixels. - - Update the scene rect. - - Args: - dx(int): Increments for the center x coord in pixels. - dy(int): Increments for the center y coord in pixels. - """ - self.setSceneRect(self.sceneRect().translated(dx, dy)) - - def posFromLonLat(self, lon, lat): - """Position in scene coordinate of the WGS84 coordinates. - - Convert from WGS84 reference system to scene reference system. - - Args: - lon(float or numpy.ndarray): Longitude value or values. - lat(float or numpy.ndarray): Latitude value or values. - - Returns: - tuple: (x, y) with the positions of the input coordinates. - """ - return posFromLonLat(lon, lat, self._zoom, self._tileSource.tileSize()) - - def lonLatFromPos(self, x, y): - """Position in WGS84 coordinate of the scene coordinates. - - Convert from scene reference system to WGS84 reference system. - - Args: - x(float, int or numpy.ndarray): X value or values. - y(float, int or numpy.ndarray): Y value or values. - - Returns: - tuple: (lon, lat) with the coordinates of the input positions. - """ - return lonLatFromPos(x, y, self._zoom, self._tileSource.tileSize()) - - def tileFromPos(self, x, y): - """Tile in the selected position. - - Args: - x(float, int): X value for position. - y(float, int): Y value for position. - - Returns: - QPointF with the coordinates of the tile. - """ - tdim = float(self._tileSource.tileSize()) - return QPointF(x / tdim, y / tdim) - - def addCircle(self, longitude, latitude, radius): - """Add a new circle to the graphics scene. - - Args: - longitude(float): Longitude of the center of the circle. - latitude(float): Latitude of the center of the circle. - radius(float): Longitude of the center of the circle. - - Returns: - MapGraphicsCircleItem added to the scene. - """ - item = MapGraphicsCircleItem(longitude, latitude, radius) - self.addItem(item) - return item - - def addLine(self, lon0, lat0, lon1, lat1): - """Add a newline) to the graphics scene. - - Args: - lon0(float): Longitude of the start point. - lat0(float): Latitude of the start point. - lon1(float): Longitude of the end point. - lat1(float): Latitude of the end point. - - Returns: - MapGraphicsLineItem added to the scene. - """ - item = MapGraphicsLineItem(lon0, lat0, lon1, lat1) - self.addItem(item) - return item - - def addRect(self, lon0, lat0, lon1, lat1): - """Add a newline) to the graphics scene. - - Args: - lon0(float): Longitude of the top left point. - lat0(float): Latitude of the top left point. - lon1(float): Longitude of the bottom right point. - lat1(float): Latitude of the bottom right point. - - Returns: - MapGraphicsLineItem added to the scene. - """ - item = MapGraphicsRectItem(lon0, lat0, lon1, lat1) - self.addItem(item) - return item - - def addPolyline(self, longitudes, latitudes): - """Add a new circle (point) to the graphics scene. - - Args: - longitudes(iterable): Longitudes of all the points of the polyline. - latitudes(iterable): Latitudes of all the points of the polyline. - - Returns: - MapGraphicsPolylineItem added to the scene. - """ - item = MapGraphicsPolylineItem(longitudes, latitudes) - self.addItem(item) - return item - - def addPixmap(self, longitude, latitude, pixmap): - """Add a new circle (point) to the graphics scene. - - Args: - longitude(float): Longitude of the origin of the pixmap. - latitude(float): Latitude of the center of the pixmap. - pixmap(QPixmap): Pixmap. - - Returns: - MapGraphicsPixmapItem added to the scene. - - Note: - Use `MapGraphicsPixmapItem.setOffset(off)` to translate by `off` pixels - the pixmap respect the origin coordinates. - """ - item = MapGraphicsPixmapItem(longitude, latitude, pixmap) - self.addItem(item) - return item - - def addText(self, longitude, latitude, text): - """Add a test item to the graphics scene. - - Args: - longitude(float): Longitude of the origin of the text - latitude(float): Latitude of the origin of the text - - Returns: - MapGraphicsTextItem added to the scene. - """ - item = MapGraphicsTextItem(longitude, latitude, text) - self.addItem(item) - return item - - def addNavItem(self, anchor): - self.nav_item = MapNavItem(anchor) - self.addItem(self.nav_item) - self.nav_item.zoom_in_button.clicked.connect(self.handleZoomIn) - self.nav_item.zoom_out_button.clicked.connect(self.handleZoomOut) - return self.nav_item - - - def addLegend(self, pos=QPointF(10.0, 10.0)): - legend = MapLegendItem(pos=pos) - self.addItem(legend) - return legend - - def addScale(self, **kwargs): - """Add a scale bar with text on the right bottom of the map - - Keyword Args: - textPen: QPen to use for drawing the text. Default 'black'. - barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) - barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) - barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. - Default (110, 110, 110, 255). - barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. - Default (90, 90, 90, 255). - - Note: - Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() - are accepted. - """ - scaleItem = MapScaleItem(**kwargs) - self.addItem(scaleItem) - return scaleItem - - def addLinesGroup(self, longitudes, latitudes): - item = MapGraphicsLinesGroupItem(longitudes, latitudes) - self.addItem(item) - return item diff --git a/pytilemap/maptilesources/__init__.py b/pytilemap/maptilesources/__init__.py deleted file mode 100644 index b54daaf..0000000 --- a/pytilemap/maptilesources/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import print_function, absolute_import - -from .maptilesource import MapTileSource -from .maptilesourcehere import MapTileSourceHere, MapTileSourceHereDemo -from .maptilesourceosm import MapTileSourceOSM -from .maptilesourcehttp import MapTileSourceHTTP \ No newline at end of file diff --git a/pytilemap/maptilesources/maptilesource.py b/pytilemap/maptilesources/maptilesource.py deleted file mode 100644 index 92b3db9..0000000 --- a/pytilemap/maptilesources/maptilesource.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Signal, Slot, QObject -from qtpy.QtGui import QPixmap - - -class MapTileSource(QObject): - - tileReceived = Signal(int, int, int, QPixmap) - - _tileSize = None - _minZoom = None - _maxZoom = None - - def __init__(self, tileSize=256, minZoom=2, maxZoom=18, parent=None): - QObject.__init__(self, parent=parent) - self._tileSize = tileSize - self._minZoom = minZoom - self._maxZoom = maxZoom - - def tileSize(self): - return self._tileSize - - def maxZoom(self): - return self._maxZoom - - def minZoom(self): - return self._minZoom - - def requestTile(self, x, y, zoom): - raise NotImplementedError() - - @Slot() - def abortAllRequests(self): - pass - - @Slot() - def close(self): - pass diff --git a/pytilemap/maptilesources/maptilesourcehere.py b/pytilemap/maptilesources/maptilesourcehere.py deleted file mode 100644 index 62c5ffa..0000000 --- a/pytilemap/maptilesources/maptilesourcehere.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import print_function, absolute_import - -from .maptilesourcehttp import MapTileSourceHTTP - - -class MapTileSourceHereDemo(MapTileSourceHTTP): - - _server = None - - def __init__(self, tileSize=256, parent=None): - MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=2, maxZoom=20, parent=parent) - assert tileSize == 256 or tileSize == 512 - self._server = 0 - - def url(self, x, y, zoom): - self._server += 1 - if self._server > 4: - self._server = 0 - url = "http://%d.base.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server - url += "newest/normal.day/%d/%d/%d/%d/png8" % (zoom, x, y, self._tileSize) - url += '?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg' - return url - - -class MapTileSourceHere(MapTileSourceHTTP): - - def __init__(self, tileSize=256, app_id='DemoAppId01082013GAL', app_code='AJKnXv84fjrb0KIHawS0Tg', - scheme='normal.day', cit=True, tileType='maptile', mapType='base', imageFmt='png8', - userAgent='(PyQt) TileMap 1.0 - HERE', mapHttpLoader=None, - minZoom=2, maxZoom=20, parent=None): - MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, - mapHttpLoader=mapHttpLoader, parent=parent) - assert tileSize == 256 or tileSize == 512 - self._server = 0 - - self._app_id = app_id - self._app_code = app_code - - self._mapType = mapType - self._tileType = tileType - self._scheme = scheme - self._cit = '.cit' if cit else '' - self._imageFmt = imageFmt - - self._buildBaseUrl() - - def _buildBaseUrl(self): - url = 'http://%d.' + self._mapType + '.maps' + self._cit + '.api.here.com' - url += '/maptile/2.1/' + self._tileType + '/newest/' + self._scheme + \ - '/%d/%d/%d/' + str(self._tileSize) + '/' + self._imageFmt - url += '?app_id=%s&app_code=%s' % (self._app_id, self._app_code) - self._baseurl = url - - def setOptions(self, scheme=None, tileType=None, mapType=None): - if mapType is not None: - self._mapType = mapType - if tileType is not None: - self._tileType = tileType - if scheme is not None: - self._scheme = scheme - - self._buildBaseUrl() - - def url(self, x, y, zoom): - self._server += 1 - if self._server > 4: - self._server = 0 - - args = (self._server, zoom, x, y) - url = self._baseurl % args - return url diff --git a/pytilemap/maptilesources/maptilesourcehttp.py b/pytilemap/maptilesources/maptilesourcehttp.py deleted file mode 100644 index 4cb47ca..0000000 --- a/pytilemap/maptilesources/maptilesourcehttp.py +++ /dev/null @@ -1,116 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Signal, Slot, QObject, QByteArray, QUrl, QThread -from qtpy.QtGui import QPixmap -from qtpy.QtNetwork import QNetworkRequest, QNetworkDiskCache, QNetworkAccessManager, \ - QNetworkReply - -from .maptilesource import MapTileSource -from ..qtsupport import getQVariantValue, getCacheFolder - -DEFAULT_CACHE_SIZE = 1024 * 1024 * 100 - - -class MapTileHTTPLoader(QObject): - - tileLoaded = Signal(int, int, int, QByteArray) - - def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', parent=None): - QObject.__init__(self, parent=parent) - self._manager = None - self._cache = None - self._cacheSize = cacheSize - - try: - # Convert user agent to bytes - userAgent = userAgent.encode() - except: - # no encode method exists. This hsould be the Python 2 case - pass - - self._userAgent = userAgent - self._tileInDownload = dict() - - @Slot(int, int, int, str) - def loadTile(self, x, y, zoom, url): - if self._manager is None: - self._manager = QNetworkAccessManager(parent=self) - self._manager.finished.connect(self.handleNetworkData) - cache = QNetworkDiskCache() - cacheDir = getCacheFolder() - cache.setCacheDirectory(cacheDir) - cache.setMaximumCacheSize(self._cacheSize) - self._manager.setCache(cache) - - key = (x, y, zoom) - url = QUrl(url) - if key not in self._tileInDownload: - # Request the image to the map service - request = QNetworkRequest(url=url) - request.setRawHeader(b'User-Agent', self._userAgent) - request.setAttribute(QNetworkRequest.User, key) - request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) - self._tileInDownload[key] = self._manager.get(request) - - @Slot(QNetworkReply) - def handleNetworkData(self, reply): - tp = getQVariantValue(reply.request().attribute(QNetworkRequest.User)) - if tp in self._tileInDownload: - del self._tileInDownload[tp] - - if not reply.error(): - data = reply.readAll() - self.tileLoaded.emit(tp[0], tp[1], tp[2], data) - reply.close() - reply.deleteLater() - - @Slot() - def abortRequest(self, x, y, zoom): - p = (x, y, zoom) - if p in self._tileInDownload: - reply = self._tileInDownload[p] - del self._tileInDownload[p] - reply.close() - reply.deleteLater() - - @Slot() - def abortAllRequests(self): - for x, y, zoom in list(self._tileInDownload.keys()): - self.abortRequest(x, y, zoom) - - -class MapTileSourceHTTP(MapTileSource): - - def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', - tileSize=256, minZoom=2, maxZoom=18, mapHttpLoader=None, parent=None): - MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) - - if mapHttpLoader is not None: - self._loader = mapHttpLoader - else: - self._loader = MapTileHTTPLoader(cacheSize=cacheSize, userAgent=userAgent) - - self._loader.tileLoaded.connect(self.handleTileDataLoaded) - - @Slot() - def close(self): - self._loader.abortAllRequests() - - def url(self, x, y, zoom): - raise NotImplementedError() - - def requestTile(self, x, y, zoom): - url = self.url(x, y, zoom) - self._loader.loadTile(x, y, zoom, url) - - @Slot(int, int, int, QByteArray) - def handleTileDataLoaded(self, x, y, zoom, data): - pix = QPixmap() - pix.loadFromData(data) - self.tileReceived.emit(x, y, zoom, pix) - - def abortAllRequests(self): - self._loader.abortAllRequests() - - def imageFormat(self): - return 'PNG' diff --git a/pytilemap/maptilesources/maptilesourcelocal.py b/pytilemap/maptilesources/maptilesourcelocal.py deleted file mode 100644 index ced639f..0000000 --- a/pytilemap/maptilesources/maptilesourcelocal.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import print_function, absolute_import - -import os - -from qtpy.QtGui import QPixmap - -from .maptilesource import MapTileSource - - -class MapTileSourceDirectory(MapTileSource): - - _directory = None - _fnameSuffix = None - - def __init__(self, directory, filenameSuffix='.png', tileSize=256, minZoom=2, maxZoom=18, parent=None): - MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) - self._directory = directory - self._fnameSuffix = filenameSuffix - - def tileSize(self): - return self._tileSize - - def maxZoom(self): - return self._maxZoom - - def minZoom(self): - return self._minZoom - - def requestTile(self, x, y, zoom): - filename = os.path.join(self._directory, str(zoom), str(x), str(y)+self._fnameSuffix) - if os.path.exists(filename): - return QPixmap(filename) - return None diff --git a/pytilemap/maptilesources/maptilesourceosm.py b/pytilemap/maptilesources/maptilesourceosm.py deleted file mode 100644 index 72d6c4a..0000000 --- a/pytilemap/maptilesources/maptilesourceosm.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import print_function, absolute_import - -from .maptilesourcehttp import MapTileSourceHTTP - - -class MapTileSourceOSM(MapTileSourceHTTP): - - def __init__(self, parent=None): - MapTileSourceHTTP.__init__(self, parent=parent) - - def url(self, x, y, zoom): - url = "http://tile.openstreetmap.org/%d/%d/%d.png" % (zoom, x, y) - return url diff --git a/pytilemap/mapview.py b/pytilemap/mapview.py deleted file mode 100644 index 27dc50b..0000000 --- a/pytilemap/mapview.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Slot -from qtpy.QtWidgets import QGraphicsView - -from .mapscene import MapGraphicsScene -from .maptilesources.maptilesourceosm import MapTileSourceOSM -from .qtsupport import wheelAngleDelta - - -class MapGraphicsView(QGraphicsView): - """Graphics view for showing a slippy map. - """ - - def __init__(self, tileSource=None, parent=None): - """Constructor. - - Args: - tileSource(MapTileSource): Source for the tiles, default `MapTileSourceOSM`. - parent(QObject): Parent object, default `None` - """ - QGraphicsView.__init__(self, parent=parent) - if tileSource is None: - tileSource = MapTileSourceOSM() - scene = MapGraphicsScene(tileSource) - self.setScene(scene) - self._lastMousePos = None - - @Slot() - def close(self): - self.scene().close() - QGraphicsView.close(self) - - def resizeEvent(self, event): - """Resize the widget. Reimplemented from `QGraphicsView`. - - Resize the `MapGraphicsScene`. - - Args: - event(QResizeEvent): Resize event. - """ - QGraphicsView.resizeEvent(self, event) - size = event.size() - self.scene().setSize(size.width(), size.height()) - - def mousePressEvent(self, event): - """Manage the mouse pressing. - - Args: - event(QMouseEvent): Mouse event. - """ - QGraphicsView.mousePressEvent(self, event) - if event.buttons() == Qt.LeftButton: - self._lastMousePos = event.pos() - - def mouseMoveEvent(self, event): - """Manage the mouse movement while it is pressed. - - Args: - event(QMouseEvent): Mouse event. - """ - QGraphicsView.mouseMoveEvent(self, event) - if event.buttons() == Qt.LeftButton: - delta = self._lastMousePos - event.pos() - self._lastMousePos = event.pos() - self.scene().translate(delta.x(), delta.y()) - - def mouseReleaseEvent(self, event): - """Manage the mouse releasing. - - Args: - event(QMouseEvent): Mouse event. - """ - QGraphicsView.mouseReleaseEvent(self, event) - - def wheelEvent(self, event): - """Manage the mouse wheel rotation. - - Change the zoom on the map. If the delta is positive, zoom in, if the - delta is negative, zoom out. - - Args: - event(QWheelEvent): Mouse wheel event. - """ - event.accept() - delta = wheelAngleDelta(event) - if delta > 0: - self.scene().zoomIn(event.pos()) - elif delta < 0: - self.scene().zoomOut(event.pos()) diff --git a/pytilemap/qtsupport.py b/pytilemap/qtsupport.py deleted file mode 100644 index f83767e..0000000 --- a/pytilemap/qtsupport.py +++ /dev/null @@ -1,48 +0,0 @@ - -import sys -import sip - -import qtpy - - -__all__ = [ - 'getQVariantValue', - 'wheelAngleDelta', -] - - -try: - if qtpy.PYQT5: - QVARIANT_API = 2 - else: - QVARIANT_API = sip.getapi('QVariant') -except ValueError: - QVARIANT_API = 1 - - -if QVARIANT_API == 1: - def getQVariantValue(variant): - return variant.toPyObject() -else: - def getQVariantValue(variant): - return variant - -if qtpy.PYQT5: - def wheelAngleDelta(wheelEvent): - return wheelEvent.angleDelta().y() -else: - def wheelAngleDelta(wheelEvent): - return wheelEvent.delta() - - -if qtpy.PYQT5: - from qtpy.QtCore import QStandardPaths - - def getCacheFolder(): - return QStandardPaths.writableLocation(QStandardPaths.CacheLocation) - -else: - from qtpy.QtGui import QDesktopServices - - def getCacheFolder(): - return QDesktopServices.storageLocation(QDesktopServices.CacheLocation) diff --git a/pytilemap/tileutils.py b/pytilemap/tileutils.py deleted file mode 100644 index e6938e2..0000000 --- a/pytilemap/tileutils.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import division - -import numpy as np -from numpy import log, tan, cos, arctan, exp -from numpy import pi as PI - - -Deg2Rad = PI / 180.0 -PI2 = PI * 2.0 - - -def posFromLonLat(lon, lat, zoom, tileSize): - """Position in scene coordinate of the WGS84 coordinates. - - Convert from WGS84 reference system to scene reference system. - - Args: - lon(float or numpy.ndarray): Longitude value or values. - lat(float or numpy.ndarray): Latitude value or values. - zoom(int): The zoom level. - tileSize(int): The size of the tile. - - Returns: - tuple: (x, y) with the positions of the input coordinates. - """ - if isinstance(lat, np.ndarray): - return _posFromLonLatArray(lon, lat, zoom, tileSize) - - tx = lon + 180.0 - tx /= 360.0 - ty = (1.0 - log(tan(lat * Deg2Rad) + 1.0 / cos(lat * Deg2Rad)) / PI) / 2.0 - zn = (1 << zoom) * float(tileSize) - tx *= zn - ty *= zn - return tx, ty - - -def _posFromLonLatArray(lon, lat, zoom, tileSize): - # Optimized implementation of posFromLonLat() function for numpy arrays - tx = lon + 180.0 - tx /= 360.0 - - tmp = lat * Deg2Rad - ty = cos(tmp) - np.divide(1.0, ty, out=ty) - tan(tmp, out=tmp) - ty += tmp - log(ty, out=ty) - ty /= PI - np.subtract(1.0, ty, out=ty) - ty /= 2.0 - - zn = (1 << zoom) * float(tileSize) - tx *= zn - ty *= zn - return tx, ty - - -def lonLatFromPos(x, y, zoom, tileSize): - """Position in WGS84 coordinate of the scene coordinates. - - Convert from scene reference system to WGS84 reference system. - - Args: - x(float, int or numpy.ndarray): X value or values. - y(float, int or numpy.ndarray): Y value or values. - zoom(int): The zoom level. - tileSize(int): The size of the tile. - - Returns: - tuple: (lon, lat) with the coordinates of the input positions. - """ - if isinstance(y, np.ndarray): - return _lonLatFromPosArray(x, y, zoom, tileSize) - - tx = x / tileSize - ty = y / tileSize - zn = 1 << zoom - lon = tx / zn * 360.0 - 180.0 - n = PI - PI2 * ty / zn - lat = arctan(0.5 * (exp(n) - exp(-n))) / Deg2Rad - return lon, lat - - -def _lonLatFromPosArray(x, y, zoom, tileSize): - # Optimized implementation of posFromLonLat() function for numpy arrays - zn = 1 << zoom - - lon = x / tileSize - lon /= zn - lon *= 360 - lon -= 180 - - lat = y / tileSize - lat *= -PI2 / zn - lat += PI - tmp = lat * -1.0 - exp(lat, out=lat) - exp(tmp, out=tmp) - lat -= tmp - lat *= 0.5 - arctan(lat, out=lat) - lat /= Deg2Rad - - return lon, lat diff --git a/pytilemap/zoom_in_symbol.png b/pytilemap/zoom_in_symbol.png deleted file mode 100644 index 6787135d2006942484c9cd269deba64e2fa0e34d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmV+|0@D47P)WFU8GbZ8()Nlj2>E@cM*00EUrL_t(o!|j(rO2a@DhQCSD zv=P&aluD_KLKlL25!~t-+_-S-F+75&@EWeXfJ+e(3N2_YsZiUdCUG;`q{Wy{5>Uu{ zn+(kS|IGXUyh)&lBC?Ki4!I^!%pPZ)#1mX7gMZ~|Ji%RRf}1FySRx2AD02i;%Ujg{ zPhhMyyB~UPW=~M3j17Rp3!Z}FzqqK*hyY)%^Rjo5%@!U3`_!oBBl0U91YMk@1zO)l zj|99W-@l4YTOg%QEpnd&hD-t2V2qB3pvnXd7n=$uf&msI<}sK{1dE(e1$22*O)eG^ zKt#+QUYEE;bK2-qPG8z{0TG0DEL1i4h(GQ(h9W@;FcT51VU_6RQKk{9b_Fo7R^SaZ zdOvAk#I`nr8Z~B&nP4$O;N!_XZ!)C}K!YdMUeu3_I!p;LaS=4RrJWEnrbN+fArP4C z0DCd>l;7lcGy+^~bh>$5IKDjm0E&0N;E!;)FaAV}$TmI!60zQ)9pwj000000NkvXXu0mjfOy1XA diff --git a/pytilemap/zoom_out_symbol.png b/pytilemap/zoom_out_symbol.png deleted file mode 100644 index c49ba6af241054476af96343d52237b8f51a39e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+`=Ht$S`Y;1W=H@#M9T6{UH}Wv$~YpzxifBA=%83h!W@g+}zZ>5+Ij>!MP|ku_QG` zp**uBL&4qCHy}kXm7Rfsk=xV7F(l&f+v(PRhaE&*`(|QNT*pB9^wDY|;GW4At%kP@xn?$R_umU))o@_^&rr~^b%tCJ?ff#Zvvj`_3R202oF2_ zO?{T!Os;?irf-4;w{I6_`mJ{SeMbRI0w}yZUHx3v IIVCg!01@7wTL1t6 From 919f97f0422e5367c5d81b9312025bde557b3916 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 25 Jan 2018 13:12:36 -0500 Subject: [PATCH 04/31] unable to undo accidentail delete of pytilemap directory, so adding it from commit 54012d48f05c14012c8c8cfc034cfba68a2106e9 --- pytilemap/__init__.py | 34 ++ pytilemap/functions.py | 181 +++++++ pytilemap/imagebutton.py | 39 ++ pytilemap/mapescaleitem.py | 268 ++++++++++ pytilemap/mapitems.py | 409 +++++++++++++++ pytilemap/maplegenditem.py | 151 ++++++ pytilemap/mapnavitem.py | 150 ++++++ pytilemap/mapscene.py | 478 ++++++++++++++++++ pytilemap/maptilesources/__init__.py | 6 + pytilemap/maptilesources/maptilesource.py | 39 ++ pytilemap/maptilesources/maptilesourcehere.py | 71 +++ pytilemap/maptilesources/maptilesourcehttp.py | 116 +++++ .../maptilesources/maptilesourcelocal.py | 33 ++ pytilemap/maptilesources/maptilesourceosm.py | 13 + pytilemap/mapview.py | 90 ++++ pytilemap/qtsupport.py | 48 ++ pytilemap/tileutils.py | 105 ++++ pytilemap/zoom_in_symbol.png | Bin 0 -> 557 bytes pytilemap/zoom_out_symbol.png | Bin 0 -> 419 bytes 19 files changed, 2231 insertions(+) create mode 100644 pytilemap/__init__.py create mode 100644 pytilemap/functions.py create mode 100644 pytilemap/imagebutton.py create mode 100644 pytilemap/mapescaleitem.py create mode 100644 pytilemap/mapitems.py create mode 100644 pytilemap/maplegenditem.py create mode 100644 pytilemap/mapnavitem.py create mode 100644 pytilemap/mapscene.py create mode 100644 pytilemap/maptilesources/__init__.py create mode 100644 pytilemap/maptilesources/maptilesource.py create mode 100644 pytilemap/maptilesources/maptilesourcehere.py create mode 100644 pytilemap/maptilesources/maptilesourcehttp.py create mode 100644 pytilemap/maptilesources/maptilesourcelocal.py create mode 100644 pytilemap/maptilesources/maptilesourceosm.py create mode 100644 pytilemap/mapview.py create mode 100644 pytilemap/qtsupport.py create mode 100644 pytilemap/tileutils.py create mode 100644 pytilemap/zoom_in_symbol.png create mode 100644 pytilemap/zoom_out_symbol.png diff --git a/pytilemap/__init__.py b/pytilemap/__init__.py new file mode 100644 index 0000000..2e09070 --- /dev/null +++ b/pytilemap/__init__.py @@ -0,0 +1,34 @@ +from __future__ import print_function, absolute_import + +from .mapscene import MapGraphicsScene +from .mapview import MapGraphicsView +from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ + MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ + MapGraphicsRectItem +from .maplegenditem import MapLegendItem +from .mapescaleitem import MapScaleItem +from .maptilesources import MapTileSource, MapTileSourceHere, MapTileSourceHereDemo, \ + MapTileSourceOSM, MapTileSourceHTTP +from .mapnavitem import MapNavItem + + +__all__ = [ + 'MapGraphicsScene', + 'MapGraphicsView', + 'MapGraphicsCircleItem', + 'MapGraphicsLineItem', + 'MapGraphicsPolylineItem', + 'MapGraphicsPixmapItem', + 'MapGraphicsTextItem', + 'MapGraphicsRectItem', + 'MapLegendItem', + 'MapTileSource', + 'MapTileSourceHere', + 'MapTileSourceHereDemo', + 'MapTileSourceOSM', + 'MapTileSourceHTTP', + "MapNavItem", + "ImageButton" +] + +__version__ = '1.0.0' diff --git a/pytilemap/functions.py b/pytilemap/functions.py new file mode 100644 index 0000000..c97f992 --- /dev/null +++ b/pytilemap/functions.py @@ -0,0 +1,181 @@ +import sys +import sip +import numpy as np + +from qtpy.QtCore import Qt +from qtpy.QtGui import QColor, QBrush, QPen + +SolidLine = Qt.SolidLine +SolidPattern = Qt.SolidPattern +SquareCap = Qt.SquareCap +BevelJoin = Qt.BevelJoin + + +__all__ = [ + 'iterRange', + 'makeColorFromInts', + 'makeColorFromFloats', + 'makeColorFromStr', + 'makeColorFromNdArray', + 'makeColorFromList', + 'makeColor', + 'makeBrush', + 'makePen', + 'clip', +] + +PYTHON_VERSION = sys.version_info[0] + +if PYTHON_VERSION == 2: + iterRange = xrange + import itertools + izip = itertools.izip +else: + iterRange = range + izip = zip + + +def makeColorFromInts(ints): + """Create a color from list or tuple of integers + + Args: + ints (tuple[int]): Integers [0, 255] values for the color. May be 3 or 4 for the alpha color. + + Retuns: + QColor: color + """ + r = ints[0] + g = ints[1] + b = ints[2] + a = ints[3] if len(ints) == 4 else 255 + return QColor(r, g, b, a) + + +def makeColorFromFloats(floats): + """Create a color from list or tuple of floats + + Args: + floats (tuple[float]): Float [0.0, 1.0] values for the color. May be 3 or 4 for the alpha color. + + Retuns: + QColor: color + """ + r = int(floats[0] * 255.0) + g = int(floats[1] * 255.0) + b = int(floats[2] * 255.0) + a = int(floats[3] * 255.0) if len(floats) == 4 else 255 + return QColor(r, g, b, a) + + +def makeColorFromStr(name): + """Create a color from a string + + Args: + name (str): name or html string of the color + + Retuns: + QColor: color + """ + return QColor(name) + + +def makeColorFromNdArray(array): + """Create a list of colors from a numpy array + + Args: + array (numpy.ndarray): (Nx3) or (Nx4) numpy array with number in range [0, 255] or [0.0, 1.0] + + Retuns: + list[QColor]: List of colors + """ + if array.dtype in [np.float32, np.float64]: + array = np.asarray(array * 255.0, dtype=np.int32) + + return [makeColorFromInts(row) for row in array] + + +def makeColorFromList(colorList): + """Create a list of colors from a list, tuple or numpy array + + Args: + colorList (list,tuplenumpy.ndarray): List, tuple or numpy array. The elements must have length of 3 or 4 + and the numbers must be in range [0, 255] or [0.0, 1.0] + + Retuns: + list[QColor]: List of colors + """ + colors = list() + if len(colorList) == 0: + return colors + + element = colorList[0][0] + if isinstance(element, (float, np.floating)): + makeFunction = makeColorFromFloats + elif isinstance(element, (int, np.integer)): + makeFunction = makeColorFromInts + elif isinstance(element, str): + makeFunction = makeColorFromStr + else: + makeFunction = QColor + + return [makeFunction(row) for row in colorList] + + +def makeColor(args): + """Convenience function for creating a QColor or a list of QColors. + + Args: + args: Argument for creating QColor[s] + + Return: + list[QColor],QColor: Created QColor[s]. + + See: + :func:`makeColorFromInts` + :func:`makeColorFromFloats` + :func:`makeColorFromStr` + :func:`makeColorFromNdArray` + :func:`makeColorFromList` + """ + makeFunction = QColor + if isinstance(args, str): + makeFunction = makeColorFromStr + elif isinstance(args, tuple): + if isinstance(args[0], int): + makeFunction = makeColorFromInts + else: + makeFunction = makeColorFromFloats + elif isinstance(args, np.ndarray): + makeFunction = makeColorFromNdArray + elif isinstance(args, list): + makeFunction = makeColorFromList + + return makeFunction(args) + + +def makeBrush(color, style=SolidPattern): + if color is None: + return QBrush(Qt.NoBrush) + if isinstance(color, QBrush): + return QBrush(color) + color = makeColor(color) + if isinstance(color, list): + return [QBrush(c, style) for c in color] + return QBrush(color, style) + + +def makePen(color, width=1.0, style=SolidLine, cap=SquareCap, join=BevelJoin): + if color is None: + return QPen(Qt.NoPen) + if isinstance(color, QPen): + return QPen(color) + brush = makeBrush(color) + if isinstance(brush, list): + if not hasattr(width, '__iter__'): + width = np.full(len(brush), width, dtype=np.float64) + return [QPen(b, w, style=style) for b, w in izip(brush, width)] + return QPen(brush, width, style=style, cap=cap, join=join) + + +def clip(value, minValue, maxValue): + return min(maxValue, max(minValue, value)) diff --git a/pytilemap/imagebutton.py b/pytilemap/imagebutton.py new file mode 100644 index 0000000..ffd1803 --- /dev/null +++ b/pytilemap/imagebutton.py @@ -0,0 +1,39 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Signal +from qtpy.QtWidgets import QGraphicsObject, QGraphicsItemGroup, QGraphicsPixmapItem + +class ImageButton(QGraphicsObject): + ''' + Custom Image Holder Class that Allows for event handling - + - QGraphicsPixmapItem is not a QObject, so cannot catch events. + ''' + QtParentClass = QGraphicsObject + + clicked = Signal(int) + + def __init__(self, img, parent=None): + ''' + Args: + img: A QPixmap instance + + Keyword Args: + parent: A pyqt window instance + ''' + QGraphicsObject.__init__(self, parent=parent) + self.image = QGraphicsPixmapItem(img, parent=self) + self.parent = parent + + def paint(self, painter, option, widget): + self.image.paint(painter,option,widget) + + def boundingRect(self): + return self.image.boundingRect() + + def mouseReleaseEvent(self, event): + self.clicked.emit(1) + + def mousePressEvent(self, event): + pass +# end ImageButton + diff --git a/pytilemap/mapescaleitem.py b/pytilemap/mapescaleitem.py new file mode 100644 index 0000000..eb982c4 --- /dev/null +++ b/pytilemap/mapescaleitem.py @@ -0,0 +1,268 @@ +import numpy as np + +from qtpy.QtCore import Qt, Slot, QPointF, QRectF +from qtpy.QtGui import QFontMetrics, QFont +from qtpy.QtWidgets import QGraphicsObject + + +from .mapitems import MapItem +from .functions import makePen, makeBrush, clip +from .qtsupport import getQVariantValue + + +class MapScaleItem(QGraphicsObject, MapItem): + """Scale bar for the visualization of the scale of teh map. + + The scale bar is located on the bottom right of the map and can' be moved. + The scale bar accepts hover events and change its color. + """ + + QtParentClass = QGraphicsObject + + EarthCircumference = 1000.0 * 6372.7982 * 2.0 * np.pi + DegToRad = np.pi / 180.0 + + _defaultScaleVisualization = { + 21: 5, + 20: 10, + 19: 20, + 18: 20, + 17: 50, + 16: 100, + 15: 200, + 14: 500, + 13: 1 * 1000, + 12: 2 * 1000, + 11: 5 * 1000, + 10: 10 * 1000, + 9: 20 * 1000, + 8: 50 * 1000, + 7: 100 * 1000, + 6: 200 * 1000, + 5: 200 * 1000, + 4: 500 * 1000, + 3: 1000 * 1000, + } + """dict: Default meters that will be shown within the scale for each zoom value. + """ + + _posForAnchors = { + Qt.TopLeftCorner: QPointF(20.0, 15.0), + Qt.TopRightCorner: QPointF(20.0, -15.0), + Qt.BottomLeftCorner: QPointF(20.0, -15.0), + Qt.BottomRightCorner: QPointF(20.0, 15.0), + } + + def __init__(self, textPen='black', barBrush=(190, 190, 190, 160), barPen=(190, 190, 190, 240), + barBrushHover=(110, 110, 110, 255), barPenHover=(90, 90, 90, 255), + anchor=Qt.BottomRightCorner, anchorPos=None, parent=None): + """Construct a scale bar with text on the right bottom of the map + + Keyword Args: + textPen: QPen to use for drawing the text. Default 'black'. + barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) + barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) + barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. + Default (110, 110, 110, 255). + barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. + Default (90, 90, 90, 255). + parent: Parent item + anchor (Qt.Corner): The *corner* used as anchor for the item, Valid values are within the + Qt.Corner enum + anchorPos (QPointF): The distance between the item and the *corner* + + Note: + Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() + are accepted. + """ + QGraphicsObject.__init__(self, parent=parent) + MapItem.__init__(self) + + self.setZValue(100) + + self._textPen = makePen(textPen) + self._barBrush = makeBrush(barBrush) + self._barPen = makePen(barPen) + self._barBrushHover = makeBrush(barBrushHover) + self._barPenHover = makePen(barPenHover) + + self._scaleView = MapScaleItem._defaultScaleVisualization.copy() + self._minZoomScale = min(self._scaleView.keys()) + self._maxZoomScale = max(self._scaleView.keys()) + + self.setAcceptHoverEvents(True) + self._hover = False + + if anchorPos is None: + anchorPos = self._posForAnchors[anchor] + self._anchorPos = QPointF(anchorPos) + self._anchor = anchor + + self._barWidth = 0 # The width of the scale bar + self._text = '' # The text to display near the scale bar + self._zoom = 0 # The current zoom level + self._meters = 0 # The number of meters used to evaluate the size of the scale bar and its text + self._meterPerPixelsEquator = 0 # The number of meters each pixel represents at the equator + self._textRect = QRectF() # The bounding rect of text + + def _sceneChanged(self, oldScene, newScene): + if oldScene is not None: + oldScene.sceneRectChanged.disconnect(self._setSceneRect) + if newScene is not None: + newScene.sceneRectChanged.connect(self._setSceneRect) + # Setup the new position of the item + self.setZoom(newScene.zoom()) + self._setSceneRect(newScene.sceneRect()) + + def updatePosition(self, scene): + # Nothing to do here + pass + + def boundingRect(self): + anchor = self._anchor + if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: + return QRectF(0, 0, self._barWidth + 3, 10).united(self._textRect) + else: + textRect = self._textRect.translated(self._barWidth + 10, 0) + return QRectF(0, 0, self._barWidth + 3, 10).united(textRect) + + def paint(self, painter, option, widget): + if self._hover: + painter.setPen(self._barPenHover) + painter.setBrush(self._barBrushHover) + else: + painter.setPen(self._barPen) + painter.setBrush(self._barBrush) + painter.drawRoundedRect(0, 0, self._barWidth, 10, 3, 3) + + anchor = self._anchor + if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: + textRect = self._textRect + else: + textRect = self._textRect.translated(self._barWidth + 10, 0) + painter.setPen(self._textPen) + painter.drawText(textRect, Qt.TextSingleLine, self._text) + + @Slot(QRectF) + def _setSceneRect(self, rect): + self._updateScaleBar() + + anchorPos = self._anchorPos + anchor = self._anchor + newPos = None + if anchor == Qt.BottomRightCorner: + newPos = rect.bottomRight() - anchorPos - QPointF(self._barWidth, 0.0) + elif anchor == Qt.TopRightCorner: + newPos = rect.topRight() - anchorPos - QPointF(self._barWidth, 0.0) + elif anchor == Qt.TopLeftCorner: + newPos = rect.topLeft() + anchorPos + elif anchor == Qt.BottomLeftCorner: + newPos = rect.bottomLeft() + anchorPos + else: + raise NotImplementedError('Other corner have not actually been implemented') + + self.setPos(newPos) + + def _updateScaleBar(self): + scene = self.scene() + if scene is None: + self.setVisible(False) + return + self.setVisible(True) + + centerYRad = scene.center().y() * self.DegToRad + meterPerPixels = self._meterPerPixelsEquator * np.cos(centerYRad) + self._barWidth = int(self._meters / meterPerPixels) + + def setZoom(self, zoom): + '''Set a new zoom level. + Args: + zoom (int): The new zoom level. + ''' + self._zoom = zoom + zoomSelector = clip(zoom, self._minZoomScale, self._maxZoomScale) + meters = self._scaleView[zoomSelector] + if meters >= 1000: + self._text = '%d km' % (meters / 1000.0) + else: + self._text = '%d m' % meters + self._meters = meters + self._meterPerPixelsEquator = self.EarthCircumference / np.power(2.0, zoom + 8) + + # Evaluate the bounding box of the current text + anchor = self._anchor + textRect = QFontMetrics(QFont()).boundingRect(self._text) + if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: + textRect.moveLeft(-textRect.width() - 10) + textRect.moveTop(-textRect.height() + 10) + else: + textRect.moveTop(-textRect.height() + 14) + self._textRect = QRectF(textRect) + self.update() + + def setScaleForZoom(self, zoomLevel, metersInScaleBar): + """Set the scale in meters/kilometers to be shown for a zoom level + + Args: + zoomLevel(int): Level of the zoom + metersInScaleBar(int): Meters to be shown in the scale bar + """ + if zoomLevel > self._maxZoomScale + 1: + raise ValueError('zoomLevel must be at least %d' % (self._maxZoomScale + 1)) + if zoomLevel < self._minZoomScale - 1: + raise ValueError('zoomLevel must be at minimum %d' % (self._minZoomScale + 1)) + + self._scaleView[zoomLevel] = metersInScaleBar + self._minZoomScale = min(self._scaleView.keys()) + self._maxZoomScale = max(self._scaleView.keys()) + + # Re-evaluate the scale bar for the current zoom + self.setZoom(self._zoom) + + self.update() + + def restoreDefaultScaleLevels(self): + """Restore the default meter scale for the zoom levels + """ + self._scaleView = MapScaleItem._defaultScaleVisualization.copy() + self._minZoomScale = min(self._scaleView.keys()) + self._maxZoomScale = max(self._scaleView.keys()) + + # Re-evaluate the scale bar for the current zoom + self.setZoom(self._zoom) + + self.update() + + def setColors(self, **kwargs): + """Set a new color for the scale bar and the text + + Keyword Args: + textPen: QPen to use for drawing the text. Default do not change. + barBrush: QBrush to use for drawing the scale bar. Default do not change. + barPen: QPen to use for drawing the scale bar border.Default do not change. + barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. + Default do not change. + barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. + Default do not change. + """ + if 'textPen' in kwargs: + self._textPen = makePen(kwargs['textPen']) + if 'barBrush' in kwargs: + self._barBrush = makeBrush(kwargs['barBrush']) + if 'barPen' in kwargs: + self._barPen = makePen(kwargs['barPen']) + if 'barBrushHover' in kwargs: + self._barBrushHover = makeBrush(kwargs['barBrushHover']) + if 'barPenHover' in kwargs: + self._barPenHover = makePen(kwargs['barPenHover']) + self.update() + + def hoverEnterEvent(self, event): + event.accept() + self._hover = True + self.update() + + def hoverLeaveEvent(self, event): + event.accept() + self._hover = False + self.update() diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py new file mode 100644 index 0000000..581bda9 --- /dev/null +++ b/pytilemap/mapitems.py @@ -0,0 +1,409 @@ +from __future__ import print_function, absolute_import + +import numpy as np + +from qtpy.QtCore import Qt, QLineF, QPointF, QRectF +from qtpy.QtGui import QPainterPath +from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ + QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ + QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem + +from .functions import iterRange, makePen, izip +from .qtsupport import getQVariantValue + +SolidLine = Qt.SolidLine + + +class MapItem(object): + """Base class for each item in the MapGraphicScene + + The default implementation connects the MapGraphicScene.sigZoomChanged() signal + to the MapItem.setZoom() slot. This slot call the MapItem.updatePosition() method + for updating the position of the item in reaction to a change in the zoom level. + """ + + QtParentClass = None + + def __init__(self): + if not isinstance(self, QGraphicsItem): + raise RuntimeError('MapItem must be an instance of QGraphicsItem') + + def itemChange(self, change, value): + if change == self.ItemSceneChange: + # Disconnect the old scene, if any + oldScene = self.scene() + if oldScene is not None: + oldScene.sigZoomChanged.disconnect(self.setZoom) + # Connect the new scene, if any + newScene = getQVariantValue(value) + if newScene is not None: + newScene.sigZoomChanged.connect(self.setZoom) + + # Notify the item that the scene is changed + self._sceneChanged(oldScene, newScene) + + # Setup the new position of the item + if newScene is not None: + self.updatePosition(newScene) + + return self.QtParentClass.itemChange(self, change, value) + + def _sceneChanged(self, oldScene, newScene): + """Called when the current scene change. + + + This function can be reimplemented for notifying that the scene has changed. + The function is called when the scene has changed, just before the + :meth:`~updatePosition` method. + + Default + + Args: + oldScene (QGraphicsScene): The old scene, or ``None``. + newScene (QGraphicsScene): The new scene, or ``None``. + + Note: + :meth:`~scene` method is pointing to the ``oldScene``. + """ + pass + + def setZoom(self, zoom): + '''Set a new zoom level. + + Args: + zoom (int): The new zoom level. + ''' + scene = self.scene() + self.updatePosition(scene) + + def updatePosition(self, scene): + raise NotImplementedError() + + +class MapGraphicsCircleItem(QGraphicsEllipseItem, MapItem): + """Circle item for the MapGraphicsScene + """ + + QtParentClass = QGraphicsEllipseItem + + def __init__(self, longitude, latitude, radius, parent=None): + """Constructor. + + Args: + longitude(float): Longitude of the center of the circle. + latitude(float): Latitude of the center of the circle. + radius(float): Radius of the circle in pixels. + scene(MapGraphicsScene): Scene to which the circle belongs. + parent(QGraphicsItem): Parent item, default None. + + Note: + The management of the parent item is work in progress. + """ + QGraphicsEllipseItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon = longitude + self._lat = latitude + self._radius = radius + + def updatePosition(self, scene): + """Update the position of the circle. + + Args: + scene(MapGraphicsScene): Scene to which the circle belongs. + """ + pos = scene.posFromLonLat(self._lon, self._lat) + r = self._radius + d = r * 2 + self.prepareGeometryChange() + self.setRect(pos[0] - r, pos[1] - r, d, d) + + def setLonLat(self, longitude, latitude): + """Set the center coordinates of the circle. + + Args: + longitude(float): Longitude of the center of the circle. + latitude(float): Latitude of the center of the circle. + """ + self._lon = longitude + self._lat = latitude + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + def setRadius(self, radius): + self._radius = radius + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + +class MapGraphicsRectItem(QGraphicsRectItem, MapItem): + """Circle item for the MapGraphicsScene + """ + + QtParentClass = QGraphicsRectItem + + def __init__(self, lon0, lat0, lon1, lat1, parent=None): + """Constructor. + + Args: + lon0(float): Longitude of the top left point. + lat0(float): Latitude of the top left point. + lon1(float): Longitude of the bottom right point. + lat1(float): Latitude of the bottom right point. + parent(QGraphicsItem): Parent item, default None. + + Note: + The management of the parent item is work in progress. + """ + QGraphicsRectItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + + def updatePosition(self, scene): + """Update the position of the circle. + + Args: + scene(MapGraphicsScene): Scene to which the circle belongs. + """ + pos0 = scene.posFromLonLat(self._lon0, self._lat0) + pos1 = scene.posFromLonLat(self._lon1, self._lat1) + + self.prepareGeometryChange() + rect = QRectF(pos0, pos1).normalized() + self.setRect(rect) + self.setPos(QPointF(0.0, 0.0)) + + def setLonLat(self, lon0, lat0, lon1, lat1): + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + + +class MapGraphicsLineItem(QGraphicsLineItem, MapItem): + + QtParentClass = QGraphicsLineItem + + def __init__(self, lon0, lat0, lon1, lat1, parent=None): + QGraphicsLineItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + + def updatePosition(self, scene): + pos0 = scene.posFromLonLat(self._lon0, self._lat0) + pos1 = scene.posFromLonLat(self._lon1, self._lat1) + deltaPos = QPointF(pos1[0] - pos0[0], pos1[1] - pos0[1]) + + self.prepareGeometryChange() + self.setLine(QLineF(QPointF(0.0, 0.0), deltaPos)) + self.setPos(pos0[0], pos0[1]) + + def setLonLat(self, lon0, lat0, lon1, lat1): + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + + +class MapGraphicsPolylineItem(QGraphicsPathItem, MapItem): + + QtParentClass = QGraphicsPathItem + + def __init__(self, longitudes, latitudes, parent=None): + QGraphicsPathItem.__init__(self, parent=parent) + MapItem.__init__(self) + + assert len(longitudes) == len(latitudes) + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + + def updatePosition(self, scene): + path = QPainterPath() + + self.prepareGeometryChange() + + count = len(self._longitudes) + if count > 0: + x, y = scene.posFromLonLat(self._longitudes, self._latitudes) + path.moveTo(x[0], y[0]) + for i in iterRange(1, count): + path.lineTo(x[i], y[i]) + + self.setPath(path) + + def setLonLat(self, longitudes, latitudes): + assert len(longitudes) == len(latitudes) + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + +class MapGraphicsPixmapItem(QGraphicsPixmapItem, MapItem): + """Item for showing a pixmap in a MapGraphicsScene. + """ + + QtParentClass = QGraphicsPixmapItem + + def __init__(self, longitude, latitude, pixmap, parent=None): + """Constructor. + + Args: + longitude(float): Longitude of the origin of the pixmap. + latitude(float): Latitude of the center of the pixmap. + pixmap(QPixmap): Pixmap. + scene(MapGraphicsScene): Scene the item belongs to. + parent(QGraphicsItem): Parent item. + """ + QGraphicsPixmapItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon = longitude + self._lat = latitude + self.setPixmap(pixmap) + + def updatePosition(self, scene): + """Update the origin position of the item. + + Origin coordinates are unchanged. + + Args: + scene(MapGraphicsScene): Scene the item belongs to. + """ + pos = scene.posFromLonLat(self._lon, self._lat) + self.prepareGeometryChange() + self.setPos(pos[0], pos[1]) + + def setLonLat(self, longitude, latitude): + """Update the origin coordinates of the item. + + Origin position will be updated. + + Args: + longitude(float): Longitude of the origin of the pixmap. + latitude(float): Latitude of the center of the pixmap. + """ + self._lon = longitude + self._lat = latitude + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + +class MapGraphicsTextItem(QGraphicsSimpleTextItem, MapItem): + """Text item for the MapGraphicsScene + """ + + QtParentClass = QGraphicsSimpleTextItem + + def __init__(self, longitude, latitude, text, parent=None, min_zoom_visibility=None): + QGraphicsSimpleTextItem.__init__(self, text, parent=parent) + MapItem.__init__(self) + self._min_zoom = min_zoom_visibility + self._lon, self._lat = longitude, latitude + + def resetMinZoomVisibility(self): + """Delete level of zoom under which the text disappears. """ + self._min_zoom = None + + def setMinZoomVisibility(self, zoom_level): + """Update level of zoom under which the text disappears. """ + self._min_zoom = zoom_level + + def updatePosition(self, scene): + """Update the origin position of the item.""" + + pos = scene.posFromLonLat(self._lon, self._lat) + self.setPos(pos) + if self._min_zoom is not None: + self.setVisible(scene._zoom >= self._min_zoom) + + +class MapGraphicsLinesGroupItem(QGraphicsItem, MapItem): + + QtParentClass = QGraphicsItem + + def __init__(self, longitudes, latitudes, parent=None): + QGraphicsItem.__init__(self, parent=parent) + MapItem.__init__(self) + + assert len(longitudes) == len(latitudes) + assert len(longitudes) >= 2 + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + + # Setup internal lines + linesGroup = QGraphicsItemGroup(parent=self) + self._linesGroup = linesGroup + self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] + + def paint(self, painter, option, widget=None): + pass + + def boundingRect(self): + return self._linesGroup.boundingRect() + + def setLineStyle(self, colors, width=1., style=SolidLine): + pen = makePen(colors, width=width, style=style) + + if isinstance(pen, list): + if len(pen) != len(self._lines): + raise ValueError('The number of colors must be equal to the number of lines') + for line, p in izip(self._lines, pen): + line.setPen(p) + else: + for line in self._lines: + line.setPen(pen) + + def updatePosition(self, scene): + self.prepareGeometryChange() + + x, y = scene.posFromLonLat(self._longitudes, self._latitudes) + lines = self._lines + for i in iterRange(0, len(lines)-1): + lines[i].setLine(x[i], y[i], x[i+1], y[i+1]) + + def setLonLat(self, longitudes, latitudes): + assert len(longitudes) == len(latitudes) + assert len(longitudes) >= 2 + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + + old_lines = self._lines + for line in old_lines: + line.setParentItem(None) + + scene = self.scene() + if scene is not None: + for line in old_lines: + scene.removeItem(line) + + linesGroup = self._linesGroup + self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] + + if scene is not None: + self.updatePosition(scene) + + def __getitem__(self, index): + return self._lines[index] diff --git a/pytilemap/maplegenditem.py b/pytilemap/maplegenditem.py new file mode 100644 index 0000000..8823920 --- /dev/null +++ b/pytilemap/maplegenditem.py @@ -0,0 +1,151 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Slot, QRectF, QPointF +from qtpy.QtGui import QPen, QBrush, QColor +from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ + QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem + +from .mapitems import MapItem +from .functions import makePen, makeBrush +from .qtsupport import getQVariantValue + + +class MapLegendEntryItem(QGraphicsItemGroup): + + def __init__(self, shape, text, parent=None): + QGraphicsItemGroup.__init__(self, parent=parent) + + text = QGraphicsSimpleTextItem(text, parent=shape) + br = shape.boundingRect() + x = br.right() + 10 + y = br.top() + 3 + text.setPos(x, y) + self.addToGroup(shape) + + self._text = text + + def top(self): + return self.boundingRect().top() + + def bottom(self): + return self.boundingRect().bottom() + + def right(self): + return self.boundingRect().right() + + def left(self): + return self.boundingRect().left() + + def text(self): + return self._text + + +class MapLegendItem(QGraphicsObject, MapItem): + + QtParentClass = QGraphicsObject + + def __init__(self, pos=None, parent=None): + QGraphicsObject.__init__(self, parent=parent) + MapItem.__init__(self) + self.setZValue(200.0) + + self._anchorPos = QPointF(pos) if pos is not None else QPointF(10.0, 10.0) + + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(QPen(Qt.NoPen)) + self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) + + self._entries = list() + self._entriesGroup = QGraphicsItemGroup(parent=self) + + def _sceneChanged(self, oldScene, newScene): + if oldScene is not None: + oldScene.sceneRectChanged.disconnect(self.setSceneRect) + if newScene is not None: + newScene.sceneRectChanged.connect(self.setSceneRect) + # Setup the new position of the item + self.setSceneRect(newScene.sceneRect()) + + def updatePosition(self, scene): + pass + + def addPoint(self, text, color, border=None, size=20.0): + shape = QGraphicsEllipseItem(size / 2.0, size / 2.0, size, size) + brush = makeBrush(color) + shape.setBrush(brush) + shape.setPen(makePen(border)) + + self.addEntry(MapLegendEntryItem(shape, text)) + + def addRect(self, text, color, border=None, size=20.0): + shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) + brush = makeBrush(color) + shape.setBrush(brush) + shape.setPen(makePen(border)) + + self.addEntry(MapLegendEntryItem(shape, text)) + + def addLine(self, text, color, width=1.): + shape = QGraphicsLineItem(10., 10., 20., 20.) + pen = makePen(color, width=width) + shape.setPen(pen) + self.addEntry(MapLegendEntryItem(shape, text)) + + def addEntry(self, entry): + self._entries.append(entry) + self._entriesGroup.addToGroup(entry) + self._updateLayout() + + def boundingRect(self): + return self._border.boundingRect() + + def paint(*args, **kwargs): + pass + + @Slot(QRectF) + def setSceneRect(self, rect): + self.setPos(rect.topLeft() + self._anchorPos) + + def _updateLayout(self): + self.prepareGeometryChange() + + bottom = 0.0 + left = 0.0 + right = 0.0 + for entry in self._entries: + entry.setPos(left, bottom) + bottom += entry.bottom() + 5.0 + right = max(right, entry.right() + 5.0) + + self._border.setRect(0.0, 0.0, right, bottom + 5.0) + + def pen(self): + """Pen for the background of the legend + + Returns: + QPen: Pen for the background of the legend + """ + return self._border.pen() + + def brush(self): + """Brush for the background of the legend + + Returns: + QBrush: Brush for the background of the legend + """ + return self._border.brush() + + def setPen(self, *args, **kwargs): + """Set the pen for the background of the legend + + The arguments are the same of the :func:`makePen` function + """ + return self._border.setPen(makePen(*args, **kwargs)) + + def setBrush(self, *args, **kwargs): + """Set the brush for the background of the legend + + The arguments are the same of the :func:`makeBrush` function + """ + return self._border.setBrush(makeBrush(*args, **kwargs)) + diff --git a/pytilemap/mapnavitem.py b/pytilemap/mapnavitem.py new file mode 100644 index 0000000..1432e9f --- /dev/null +++ b/pytilemap/mapnavitem.py @@ -0,0 +1,150 @@ +from __future__ import print_function, absolute_import + +import os +from qtpy.QtCore import Qt, Slot, QRectF, QPointF, QObject, Signal +from qtpy.QtGui import QPen, QBrush, QColor, QPixmap +from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ + QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem, QGraphicsPixmapItem + +from .imagebutton import ImageButton +from .mapitems import MapItem +from .functions import makePen, makeBrush +from .qtsupport import getQVariantValue + +from .maplegenditem import * + + +class MapNavItem(QGraphicsObject, MapItem): + + QtParentClass = QGraphicsObject + + _posForAnchors = { + Qt.TopLeftCorner: QPointF(20.0, 75.0), + Qt.TopRightCorner: QPointF(40.0, -15.0), + Qt.BottomLeftCorner: QPointF(20.0, -15.0), + Qt.BottomRightCorner: QPointF(30.0, 75.0), + } + + + def __init__(self, anchor, parent=None): + QGraphicsObject.__init__(self, parent=parent) + MapItem.__init__(self) + self.setZValue(200.0) + + anchorPos = self._posForAnchors[anchor] + self._anchorPos = QPointF(anchorPos) + self._anchor = anchor + + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(QPen(Qt.NoPen)) + self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) + + self._entries = list() + + imgfile = os.path.dirname(__file__) + os.sep + 'zoom_in_symbol.png' + img = QPixmap(24,24) + img.load(imgfile) + img = img.scaled(24,24) + img = ImageButton(img, parent=self) + self.zoom_in_button = img + self.addEntry(self.zoom_in_button) + + imgfile = os.path.dirname(__file__) + os.sep + 'zoom_out_symbol.png' + img2 = QPixmap(24,24) + img2.load(imgfile) + img2 = img2.scaled(24,24) + img2 = ImageButton(img2, parent=self) + self.zoom_out_button = img2 + self.addEntry(self.zoom_out_button) + + def _sceneChanged(self, oldScene, newScene): + if oldScene is not None: + oldScene.sceneRectChanged.disconnect(self.setSceneRect) + if newScene is not None: + newScene.sceneRectChanged.connect(self.setSceneRect) + # Setup the new position of the item + self.setSceneRect(newScene.sceneRect()) + + def updatePosition(self, scene): + pass + + def addRect(self, text, color, border=None, size=20.0): + shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) + brush = makeBrush(color) + shape.setBrush(brush) + shape.setPen(makePen(border)) + + self.addEntry(MapLegendEntryItem(shape, text)) + + def addEntry(self, entry): + self._entries.append(entry) + self._updateLayout() + + def boundingRect(self): + return self._border.boundingRect() + + def paint(*args, **kwargs): + pass + + @Slot(QRectF) + def setSceneRect(self, rect): + anchorPos = self._anchorPos + anchor = self._anchor + newPos = None + if anchor == Qt.BottomRightCorner: + newPos = rect.bottomRight() - anchorPos + elif anchor == Qt.TopRightCorner: + newPos = rect.topRight() - anchorPos + elif anchor == Qt.TopLeftCorner: + newPos = rect.topLeft() + anchorPos + elif anchor == Qt.BottomLeftCorner: + newPos = rect.bottomLeft() + anchorPos + else: + raise NotImplementedError('Other corner have not actually been implemented') + + self.setPos(newPos) + + + def _updateLayout(self): + self.prepareGeometryChange() + + bottom = 0.0 + left = 0.0 + right = 0.0 + for entry in self._entries: + entry.setPos(left, bottom) + bottom += entry.boundingRect().bottom() + right = max(right, entry.boundingRect().right() + 1.0) + + self._border.setRect(0.0, 0.0, right, bottom + 1.0) + + def pen(self): + """Pen for the background of the legend + + Returns: + QPen: Pen for the background of the legend + """ + return self._border.pen() + + def brush(self): + """Brush for the background of the legend + + Returns: + QBrush: Brush for the background of the legend + """ + return self._border.brush() + + def setPen(self, *args, **kwargs): + """Set the pen for the background of the legend + + The arguments are the same of the :func:`makePen` function + """ + return self._border.setPen(makePen(*args, **kwargs)) + + def setBrush(self, *args, **kwargs): + """Set the brush for the background of the legend + + The arguments are the same of the :func:`makeBrush` function + """ + return self._border.setBrush(makeBrush(*args, **kwargs)) + diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py new file mode 100644 index 0000000..93528f5 --- /dev/null +++ b/pytilemap/mapscene.py @@ -0,0 +1,478 @@ +from __future__ import print_function, absolute_import, division + +from numpy import floor + +from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint +from qtpy.QtGui import QPixmap +from qtpy.QtWidgets import QGraphicsScene + +from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ + MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ + MapGraphicsRectItem, MapGraphicsLinesGroupItem +from .maplegenditem import MapLegendItem +from .mapescaleitem import MapScaleItem +from .mapnavitem import MapNavItem +from .functions import iterRange +from .tileutils import posFromLonLat, lonLatFromPos + + +class MapGraphicsScene(QGraphicsScene): + """Graphics scene for showing a slippy map. + """ + + sigZoomChanged = Signal(int) + + def __init__(self, tileSource, parent=None): + """Constructor. + + Args: + tileSource(MapTileSource): Source for loading the tiles. + parent(QObject): Parent object, default `None` + """ + QGraphicsScene.__init__(self, parent=parent) + + self._zoom = 15 + + self._tileSource = tileSource + self._tileSource.setParent(self) + self._tileSource.tileReceived.connect(self.setTilePixmap) + tdim = self._tileSource.tileSize() + + self._emptyTile = QPixmap(tdim, tdim) + self._emptyTile.fill(Qt.lightGray) + + self._tilesRect = QRect() + self._tilePixmaps = {} + + self._tileInDownload = list() + + self.setSceneRect(0.0, 0.0, 400, 300) + self.sceneRectChanged.connect(self.onSceneRectChanged) + + @Slot() + def close(self): + self._tileSource.close() + + def setTileSource(self, newTileSource): + self._tileSource.tileReceived.disconnect(self.setTilePixmap) + self._tileSource.close() + + self._tilePixmaps.clear() + self._tileInDownload = list() + + self._tileSource = newTileSource + self._tileSource.setParent(self) + self._tileSource.tileReceived.connect(self.setTilePixmap) + + self.requestTiles() + + self.invalidate() + self.update() + + @Slot(QRectF) + def onSceneRectChanged(self, rect): + """Callback for the changing of the visible rect. + + Evaluate the visible tiles and request to load the new tiles. + + Args: + rect(QRectF): Current visible area. + """ + tdim = self._tileSource.tileSize() + center = rect.center() + ct = self.tileFromPos(center.x(), center.y()) + tx = ct.x() + ty = ct.y() + + width = rect.width() + height = rect.height() + # top left corner of the center tile + xp = int(width / 2.0 - (tx - floor(tx)) * tdim) + yp = int(height / 2.0 - (ty - floor(ty)) * tdim) + + # first tile vertical and horizontal + xs = tx - (xp + tdim - 1) / tdim + ys = ty - (yp + tdim - 1) / tdim + + # last tile vertical and horizontal + xe = (width - xp - 1) / tdim - xs + 1 + tx + ye = (height - yp - 1) / tdim - ys + 1 + ty + + # define the rect of visible tiles + self._tilesRect = QRect(xs, ys, xe, ye) + + # Request the loading of new tiles (if needed) + self.requestTiles() + + self.invalidate() + self.update() + + def drawBackground(self, painter, rect): + """Draw the background tiles. + + If a tile is not available, draw a gray rectangle. + + Args: + painter(QPainter): Painter for drawing. + rect(QRectF): Current visible area. + """ + tilesRect = self._tilesRect + left = tilesRect.left() + top = tilesRect.top() + numXtiles = tilesRect.width() + numYtiles = tilesRect.height() + tdim = self._tileSource.tileSize() + pixRect = QRectF(0.0, 0.0, tdim, tdim) + emptyTilePix = self._emptyTile + tilePixmaps = self._tilePixmaps + + for x in iterRange(numXtiles+1): + for y in iterRange(numYtiles+1): + tp = (x + left, y + top) + box = self.tileRect(tp[0], tp[1]) + # Use default gray image if tile image is missing + pix = tilePixmaps.get(tp, emptyTilePix) + painter.drawPixmap(box, pix, pixRect) + + def zoomTo(self, pos, zoomlevel): + """Zoom to a specific zoom level. + + If the level is out of range, the zoom action is ignored. + + clear the current tile cache, evaluate the new center and + update the position of all the items. + + Args: + zoomlevel(int): New zoom level. + """ + + tileSource = self._tileSource + if zoomlevel > tileSource.maxZoom() or zoomlevel < tileSource.minZoom(): + return + + # Get the coordinates of the center using the position in pixels of the mouse + pos_corr = self.views()[0].mapToScene(pos) + coord = self.lonLatFromPos(pos_corr.x(), pos_corr.y()) + + # Set the new zoom level + self._zoom = zoomlevel + + # Clear cache and abort active requests + self._tileSource.abortAllRequests() + self._tilePixmaps.clear() + + # Re-center map so that the point on which it was zoomed is in the same position + self.setCenter(coord[0], coord[1]) + pos_corr = self.views()[0].mapToScene(pos) + center = self.sceneRect().center() + self.translate(center.x() - pos_corr.x(), center.y() - pos_corr.y()) + + self.sigZoomChanged.emit(zoomlevel) + + def zoomIn(self, pos=None): + """Increments the zoom level + + Args: + pos (QPointF): Center position, Latitude and Longitude. Default None for the + current center position. + """ + if pos is None: + pos = QPoint(self.width()/2, self.height()/2) + self.zoomTo(pos, self._zoom + 1) + + def zoomOut(self, pos=None): + """Decrements the zoom level + + Args: + pos (QPointF): Center position, Latitude and Longitude. Default None for the + current center position. + """ + if pos is None: + pos = QPoint(self.width()/2, self.height()/2) + self.zoomTo(pos, self._zoom - 1) + + @Slot() + def handleZoomIn(self): + self.zoomIn() + + @Slot() + def handleZoomOut(self): + self.zoomOut() + + def zoom(self): + return self._zoom + + @Slot(int, int, int, QPixmap) + def setTilePixmap(self, x, y, zoom, pixmap): + """Set the image of the tile. + + Args: + x(int): X coordinate of the tile. + y(int): Y coordinate of the tile. + zoom(int): Zoom coordinate of the tile. + pixmap(QPixmap): Image for the tile. + """ + if self._zoom == zoom: + self._tilePixmaps[(x, y)] = pixmap + self.update() + + def requestTiles(self): + """Request the loading of tiles. + + Check the loaded tiles and requests only + the missing tiles. + """ + tilesRect = self._tilesRect + tilePixmaps = self._tilePixmaps + + numXtiles = tilesRect.width() + numYtiles = tilesRect.height() + left = tilesRect.left() + top = tilesRect.top() + tileSource = self._tileSource + zoom = self._zoom + + # Request load of new tiles + for x in iterRange(numXtiles): + for y in iterRange(numYtiles): + tp = (left + x, top + y) + # Request tile only if missing + if tp not in tilePixmaps: + pix = tileSource.requestTile(tp[0], tp[1], zoom) + if pix is not None: + tilePixmaps[tp] = pix + + self.update() + + def tileRect(self, tx, ty): + """Area for a specific tile. + + Args: + tx(int): X coordinate of the tile. + ty(int): Y coordinate of the tile. + + Returns: + QRectF, the area of the tile. + """ + tdim = self._tileSource.tileSize() + return QRectF(tx * tdim, ty * tdim, tdim, tdim) + + def setSize(self, width, height): + """Set the size of the visible area in pixels. + + Update the scene rect. + + Args: + width(int): Width of the visible area. + height(int): Height of the visible area. + """ + rect = QRectF(self.sceneRect().topLeft(), QSizeF(width, height)) + self.setSceneRect(rect) + + def setCenter(self, lon, lat, zoom=None): + """Move the center of the visible area to new coordinates. + + Update the scene rect. + + Args: + lon(float): New longitude of the center. + lat(float): New latitude of the center. + zoom(int [1:15]): Zoom Level + """ + if zoom != None and zoom < 15 and zoom > 0: + self._zoom = zoom + + rect = QRectF(self.sceneRect()) + pos = self.posFromLonLat(lon, lat) + rect.moveCenter(QPointF(pos[0], pos[1])) + self.setSceneRect(rect) + + + def center(self): + centerPos = self.sceneRect().center() + centerCoord = self.lonLatFromPos(centerPos.x(), centerPos.y()) + return QPointF(centerCoord[0], centerCoord[1]) + + def translate(self, dx, dy): + """Translate the visible area by dx, dy pixels. + + Update the scene rect. + + Args: + dx(int): Increments for the center x coord in pixels. + dy(int): Increments for the center y coord in pixels. + """ + self.setSceneRect(self.sceneRect().translated(dx, dy)) + + def posFromLonLat(self, lon, lat): + """Position in scene coordinate of the WGS84 coordinates. + + Convert from WGS84 reference system to scene reference system. + + Args: + lon(float or numpy.ndarray): Longitude value or values. + lat(float or numpy.ndarray): Latitude value or values. + + Returns: + tuple: (x, y) with the positions of the input coordinates. + """ + return posFromLonLat(lon, lat, self._zoom, self._tileSource.tileSize()) + + def lonLatFromPos(self, x, y): + """Position in WGS84 coordinate of the scene coordinates. + + Convert from scene reference system to WGS84 reference system. + + Args: + x(float, int or numpy.ndarray): X value or values. + y(float, int or numpy.ndarray): Y value or values. + + Returns: + tuple: (lon, lat) with the coordinates of the input positions. + """ + return lonLatFromPos(x, y, self._zoom, self._tileSource.tileSize()) + + def tileFromPos(self, x, y): + """Tile in the selected position. + + Args: + x(float, int): X value for position. + y(float, int): Y value for position. + + Returns: + QPointF with the coordinates of the tile. + """ + tdim = float(self._tileSource.tileSize()) + return QPointF(x / tdim, y / tdim) + + def addCircle(self, longitude, latitude, radius): + """Add a new circle to the graphics scene. + + Args: + longitude(float): Longitude of the center of the circle. + latitude(float): Latitude of the center of the circle. + radius(float): Longitude of the center of the circle. + + Returns: + MapGraphicsCircleItem added to the scene. + """ + item = MapGraphicsCircleItem(longitude, latitude, radius) + self.addItem(item) + return item + + def addLine(self, lon0, lat0, lon1, lat1): + """Add a newline) to the graphics scene. + + Args: + lon0(float): Longitude of the start point. + lat0(float): Latitude of the start point. + lon1(float): Longitude of the end point. + lat1(float): Latitude of the end point. + + Returns: + MapGraphicsLineItem added to the scene. + """ + item = MapGraphicsLineItem(lon0, lat0, lon1, lat1) + self.addItem(item) + return item + + def addRect(self, lon0, lat0, lon1, lat1): + """Add a newline) to the graphics scene. + + Args: + lon0(float): Longitude of the top left point. + lat0(float): Latitude of the top left point. + lon1(float): Longitude of the bottom right point. + lat1(float): Latitude of the bottom right point. + + Returns: + MapGraphicsLineItem added to the scene. + """ + item = MapGraphicsRectItem(lon0, lat0, lon1, lat1) + self.addItem(item) + return item + + def addPolyline(self, longitudes, latitudes): + """Add a new circle (point) to the graphics scene. + + Args: + longitudes(iterable): Longitudes of all the points of the polyline. + latitudes(iterable): Latitudes of all the points of the polyline. + + Returns: + MapGraphicsPolylineItem added to the scene. + """ + item = MapGraphicsPolylineItem(longitudes, latitudes) + self.addItem(item) + return item + + def addPixmap(self, longitude, latitude, pixmap): + """Add a new circle (point) to the graphics scene. + + Args: + longitude(float): Longitude of the origin of the pixmap. + latitude(float): Latitude of the center of the pixmap. + pixmap(QPixmap): Pixmap. + + Returns: + MapGraphicsPixmapItem added to the scene. + + Note: + Use `MapGraphicsPixmapItem.setOffset(off)` to translate by `off` pixels + the pixmap respect the origin coordinates. + """ + item = MapGraphicsPixmapItem(longitude, latitude, pixmap) + self.addItem(item) + return item + + def addText(self, longitude, latitude, text): + """Add a test item to the graphics scene. + + Args: + longitude(float): Longitude of the origin of the text + latitude(float): Latitude of the origin of the text + + Returns: + MapGraphicsTextItem added to the scene. + """ + item = MapGraphicsTextItem(longitude, latitude, text) + self.addItem(item) + return item + + def addNavItem(self, anchor): + self.nav_item = MapNavItem(anchor) + self.addItem(self.nav_item) + self.nav_item.zoom_in_button.clicked.connect(self.handleZoomIn) + self.nav_item.zoom_out_button.clicked.connect(self.handleZoomOut) + return self.nav_item + + + def addLegend(self, pos=QPointF(10.0, 10.0)): + legend = MapLegendItem(pos=pos) + self.addItem(legend) + return legend + + def addScale(self, **kwargs): + """Add a scale bar with text on the right bottom of the map + + Keyword Args: + textPen: QPen to use for drawing the text. Default 'black'. + barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) + barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) + barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. + Default (110, 110, 110, 255). + barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. + Default (90, 90, 90, 255). + + Note: + Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() + are accepted. + """ + scaleItem = MapScaleItem(**kwargs) + self.addItem(scaleItem) + return scaleItem + + def addLinesGroup(self, longitudes, latitudes): + item = MapGraphicsLinesGroupItem(longitudes, latitudes) + self.addItem(item) + return item diff --git a/pytilemap/maptilesources/__init__.py b/pytilemap/maptilesources/__init__.py new file mode 100644 index 0000000..b54daaf --- /dev/null +++ b/pytilemap/maptilesources/__init__.py @@ -0,0 +1,6 @@ +from __future__ import print_function, absolute_import + +from .maptilesource import MapTileSource +from .maptilesourcehere import MapTileSourceHere, MapTileSourceHereDemo +from .maptilesourceosm import MapTileSourceOSM +from .maptilesourcehttp import MapTileSourceHTTP \ No newline at end of file diff --git a/pytilemap/maptilesources/maptilesource.py b/pytilemap/maptilesources/maptilesource.py new file mode 100644 index 0000000..92b3db9 --- /dev/null +++ b/pytilemap/maptilesources/maptilesource.py @@ -0,0 +1,39 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Signal, Slot, QObject +from qtpy.QtGui import QPixmap + + +class MapTileSource(QObject): + + tileReceived = Signal(int, int, int, QPixmap) + + _tileSize = None + _minZoom = None + _maxZoom = None + + def __init__(self, tileSize=256, minZoom=2, maxZoom=18, parent=None): + QObject.__init__(self, parent=parent) + self._tileSize = tileSize + self._minZoom = minZoom + self._maxZoom = maxZoom + + def tileSize(self): + return self._tileSize + + def maxZoom(self): + return self._maxZoom + + def minZoom(self): + return self._minZoom + + def requestTile(self, x, y, zoom): + raise NotImplementedError() + + @Slot() + def abortAllRequests(self): + pass + + @Slot() + def close(self): + pass diff --git a/pytilemap/maptilesources/maptilesourcehere.py b/pytilemap/maptilesources/maptilesourcehere.py new file mode 100644 index 0000000..62c5ffa --- /dev/null +++ b/pytilemap/maptilesources/maptilesourcehere.py @@ -0,0 +1,71 @@ +from __future__ import print_function, absolute_import + +from .maptilesourcehttp import MapTileSourceHTTP + + +class MapTileSourceHereDemo(MapTileSourceHTTP): + + _server = None + + def __init__(self, tileSize=256, parent=None): + MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=2, maxZoom=20, parent=parent) + assert tileSize == 256 or tileSize == 512 + self._server = 0 + + def url(self, x, y, zoom): + self._server += 1 + if self._server > 4: + self._server = 0 + url = "http://%d.base.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server + url += "newest/normal.day/%d/%d/%d/%d/png8" % (zoom, x, y, self._tileSize) + url += '?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg' + return url + + +class MapTileSourceHere(MapTileSourceHTTP): + + def __init__(self, tileSize=256, app_id='DemoAppId01082013GAL', app_code='AJKnXv84fjrb0KIHawS0Tg', + scheme='normal.day', cit=True, tileType='maptile', mapType='base', imageFmt='png8', + userAgent='(PyQt) TileMap 1.0 - HERE', mapHttpLoader=None, + minZoom=2, maxZoom=20, parent=None): + MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, + mapHttpLoader=mapHttpLoader, parent=parent) + assert tileSize == 256 or tileSize == 512 + self._server = 0 + + self._app_id = app_id + self._app_code = app_code + + self._mapType = mapType + self._tileType = tileType + self._scheme = scheme + self._cit = '.cit' if cit else '' + self._imageFmt = imageFmt + + self._buildBaseUrl() + + def _buildBaseUrl(self): + url = 'http://%d.' + self._mapType + '.maps' + self._cit + '.api.here.com' + url += '/maptile/2.1/' + self._tileType + '/newest/' + self._scheme + \ + '/%d/%d/%d/' + str(self._tileSize) + '/' + self._imageFmt + url += '?app_id=%s&app_code=%s' % (self._app_id, self._app_code) + self._baseurl = url + + def setOptions(self, scheme=None, tileType=None, mapType=None): + if mapType is not None: + self._mapType = mapType + if tileType is not None: + self._tileType = tileType + if scheme is not None: + self._scheme = scheme + + self._buildBaseUrl() + + def url(self, x, y, zoom): + self._server += 1 + if self._server > 4: + self._server = 0 + + args = (self._server, zoom, x, y) + url = self._baseurl % args + return url diff --git a/pytilemap/maptilesources/maptilesourcehttp.py b/pytilemap/maptilesources/maptilesourcehttp.py new file mode 100644 index 0000000..4cb47ca --- /dev/null +++ b/pytilemap/maptilesources/maptilesourcehttp.py @@ -0,0 +1,116 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Signal, Slot, QObject, QByteArray, QUrl, QThread +from qtpy.QtGui import QPixmap +from qtpy.QtNetwork import QNetworkRequest, QNetworkDiskCache, QNetworkAccessManager, \ + QNetworkReply + +from .maptilesource import MapTileSource +from ..qtsupport import getQVariantValue, getCacheFolder + +DEFAULT_CACHE_SIZE = 1024 * 1024 * 100 + + +class MapTileHTTPLoader(QObject): + + tileLoaded = Signal(int, int, int, QByteArray) + + def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', parent=None): + QObject.__init__(self, parent=parent) + self._manager = None + self._cache = None + self._cacheSize = cacheSize + + try: + # Convert user agent to bytes + userAgent = userAgent.encode() + except: + # no encode method exists. This hsould be the Python 2 case + pass + + self._userAgent = userAgent + self._tileInDownload = dict() + + @Slot(int, int, int, str) + def loadTile(self, x, y, zoom, url): + if self._manager is None: + self._manager = QNetworkAccessManager(parent=self) + self._manager.finished.connect(self.handleNetworkData) + cache = QNetworkDiskCache() + cacheDir = getCacheFolder() + cache.setCacheDirectory(cacheDir) + cache.setMaximumCacheSize(self._cacheSize) + self._manager.setCache(cache) + + key = (x, y, zoom) + url = QUrl(url) + if key not in self._tileInDownload: + # Request the image to the map service + request = QNetworkRequest(url=url) + request.setRawHeader(b'User-Agent', self._userAgent) + request.setAttribute(QNetworkRequest.User, key) + request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) + self._tileInDownload[key] = self._manager.get(request) + + @Slot(QNetworkReply) + def handleNetworkData(self, reply): + tp = getQVariantValue(reply.request().attribute(QNetworkRequest.User)) + if tp in self._tileInDownload: + del self._tileInDownload[tp] + + if not reply.error(): + data = reply.readAll() + self.tileLoaded.emit(tp[0], tp[1], tp[2], data) + reply.close() + reply.deleteLater() + + @Slot() + def abortRequest(self, x, y, zoom): + p = (x, y, zoom) + if p in self._tileInDownload: + reply = self._tileInDownload[p] + del self._tileInDownload[p] + reply.close() + reply.deleteLater() + + @Slot() + def abortAllRequests(self): + for x, y, zoom in list(self._tileInDownload.keys()): + self.abortRequest(x, y, zoom) + + +class MapTileSourceHTTP(MapTileSource): + + def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', + tileSize=256, minZoom=2, maxZoom=18, mapHttpLoader=None, parent=None): + MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) + + if mapHttpLoader is not None: + self._loader = mapHttpLoader + else: + self._loader = MapTileHTTPLoader(cacheSize=cacheSize, userAgent=userAgent) + + self._loader.tileLoaded.connect(self.handleTileDataLoaded) + + @Slot() + def close(self): + self._loader.abortAllRequests() + + def url(self, x, y, zoom): + raise NotImplementedError() + + def requestTile(self, x, y, zoom): + url = self.url(x, y, zoom) + self._loader.loadTile(x, y, zoom, url) + + @Slot(int, int, int, QByteArray) + def handleTileDataLoaded(self, x, y, zoom, data): + pix = QPixmap() + pix.loadFromData(data) + self.tileReceived.emit(x, y, zoom, pix) + + def abortAllRequests(self): + self._loader.abortAllRequests() + + def imageFormat(self): + return 'PNG' diff --git a/pytilemap/maptilesources/maptilesourcelocal.py b/pytilemap/maptilesources/maptilesourcelocal.py new file mode 100644 index 0000000..ced639f --- /dev/null +++ b/pytilemap/maptilesources/maptilesourcelocal.py @@ -0,0 +1,33 @@ +from __future__ import print_function, absolute_import + +import os + +from qtpy.QtGui import QPixmap + +from .maptilesource import MapTileSource + + +class MapTileSourceDirectory(MapTileSource): + + _directory = None + _fnameSuffix = None + + def __init__(self, directory, filenameSuffix='.png', tileSize=256, minZoom=2, maxZoom=18, parent=None): + MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) + self._directory = directory + self._fnameSuffix = filenameSuffix + + def tileSize(self): + return self._tileSize + + def maxZoom(self): + return self._maxZoom + + def minZoom(self): + return self._minZoom + + def requestTile(self, x, y, zoom): + filename = os.path.join(self._directory, str(zoom), str(x), str(y)+self._fnameSuffix) + if os.path.exists(filename): + return QPixmap(filename) + return None diff --git a/pytilemap/maptilesources/maptilesourceosm.py b/pytilemap/maptilesources/maptilesourceosm.py new file mode 100644 index 0000000..72d6c4a --- /dev/null +++ b/pytilemap/maptilesources/maptilesourceosm.py @@ -0,0 +1,13 @@ +from __future__ import print_function, absolute_import + +from .maptilesourcehttp import MapTileSourceHTTP + + +class MapTileSourceOSM(MapTileSourceHTTP): + + def __init__(self, parent=None): + MapTileSourceHTTP.__init__(self, parent=parent) + + def url(self, x, y, zoom): + url = "http://tile.openstreetmap.org/%d/%d/%d.png" % (zoom, x, y) + return url diff --git a/pytilemap/mapview.py b/pytilemap/mapview.py new file mode 100644 index 0000000..27dc50b --- /dev/null +++ b/pytilemap/mapview.py @@ -0,0 +1,90 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Slot +from qtpy.QtWidgets import QGraphicsView + +from .mapscene import MapGraphicsScene +from .maptilesources.maptilesourceosm import MapTileSourceOSM +from .qtsupport import wheelAngleDelta + + +class MapGraphicsView(QGraphicsView): + """Graphics view for showing a slippy map. + """ + + def __init__(self, tileSource=None, parent=None): + """Constructor. + + Args: + tileSource(MapTileSource): Source for the tiles, default `MapTileSourceOSM`. + parent(QObject): Parent object, default `None` + """ + QGraphicsView.__init__(self, parent=parent) + if tileSource is None: + tileSource = MapTileSourceOSM() + scene = MapGraphicsScene(tileSource) + self.setScene(scene) + self._lastMousePos = None + + @Slot() + def close(self): + self.scene().close() + QGraphicsView.close(self) + + def resizeEvent(self, event): + """Resize the widget. Reimplemented from `QGraphicsView`. + + Resize the `MapGraphicsScene`. + + Args: + event(QResizeEvent): Resize event. + """ + QGraphicsView.resizeEvent(self, event) + size = event.size() + self.scene().setSize(size.width(), size.height()) + + def mousePressEvent(self, event): + """Manage the mouse pressing. + + Args: + event(QMouseEvent): Mouse event. + """ + QGraphicsView.mousePressEvent(self, event) + if event.buttons() == Qt.LeftButton: + self._lastMousePos = event.pos() + + def mouseMoveEvent(self, event): + """Manage the mouse movement while it is pressed. + + Args: + event(QMouseEvent): Mouse event. + """ + QGraphicsView.mouseMoveEvent(self, event) + if event.buttons() == Qt.LeftButton: + delta = self._lastMousePos - event.pos() + self._lastMousePos = event.pos() + self.scene().translate(delta.x(), delta.y()) + + def mouseReleaseEvent(self, event): + """Manage the mouse releasing. + + Args: + event(QMouseEvent): Mouse event. + """ + QGraphicsView.mouseReleaseEvent(self, event) + + def wheelEvent(self, event): + """Manage the mouse wheel rotation. + + Change the zoom on the map. If the delta is positive, zoom in, if the + delta is negative, zoom out. + + Args: + event(QWheelEvent): Mouse wheel event. + """ + event.accept() + delta = wheelAngleDelta(event) + if delta > 0: + self.scene().zoomIn(event.pos()) + elif delta < 0: + self.scene().zoomOut(event.pos()) diff --git a/pytilemap/qtsupport.py b/pytilemap/qtsupport.py new file mode 100644 index 0000000..f83767e --- /dev/null +++ b/pytilemap/qtsupport.py @@ -0,0 +1,48 @@ + +import sys +import sip + +import qtpy + + +__all__ = [ + 'getQVariantValue', + 'wheelAngleDelta', +] + + +try: + if qtpy.PYQT5: + QVARIANT_API = 2 + else: + QVARIANT_API = sip.getapi('QVariant') +except ValueError: + QVARIANT_API = 1 + + +if QVARIANT_API == 1: + def getQVariantValue(variant): + return variant.toPyObject() +else: + def getQVariantValue(variant): + return variant + +if qtpy.PYQT5: + def wheelAngleDelta(wheelEvent): + return wheelEvent.angleDelta().y() +else: + def wheelAngleDelta(wheelEvent): + return wheelEvent.delta() + + +if qtpy.PYQT5: + from qtpy.QtCore import QStandardPaths + + def getCacheFolder(): + return QStandardPaths.writableLocation(QStandardPaths.CacheLocation) + +else: + from qtpy.QtGui import QDesktopServices + + def getCacheFolder(): + return QDesktopServices.storageLocation(QDesktopServices.CacheLocation) diff --git a/pytilemap/tileutils.py b/pytilemap/tileutils.py new file mode 100644 index 0000000..e6938e2 --- /dev/null +++ b/pytilemap/tileutils.py @@ -0,0 +1,105 @@ +from __future__ import division + +import numpy as np +from numpy import log, tan, cos, arctan, exp +from numpy import pi as PI + + +Deg2Rad = PI / 180.0 +PI2 = PI * 2.0 + + +def posFromLonLat(lon, lat, zoom, tileSize): + """Position in scene coordinate of the WGS84 coordinates. + + Convert from WGS84 reference system to scene reference system. + + Args: + lon(float or numpy.ndarray): Longitude value or values. + lat(float or numpy.ndarray): Latitude value or values. + zoom(int): The zoom level. + tileSize(int): The size of the tile. + + Returns: + tuple: (x, y) with the positions of the input coordinates. + """ + if isinstance(lat, np.ndarray): + return _posFromLonLatArray(lon, lat, zoom, tileSize) + + tx = lon + 180.0 + tx /= 360.0 + ty = (1.0 - log(tan(lat * Deg2Rad) + 1.0 / cos(lat * Deg2Rad)) / PI) / 2.0 + zn = (1 << zoom) * float(tileSize) + tx *= zn + ty *= zn + return tx, ty + + +def _posFromLonLatArray(lon, lat, zoom, tileSize): + # Optimized implementation of posFromLonLat() function for numpy arrays + tx = lon + 180.0 + tx /= 360.0 + + tmp = lat * Deg2Rad + ty = cos(tmp) + np.divide(1.0, ty, out=ty) + tan(tmp, out=tmp) + ty += tmp + log(ty, out=ty) + ty /= PI + np.subtract(1.0, ty, out=ty) + ty /= 2.0 + + zn = (1 << zoom) * float(tileSize) + tx *= zn + ty *= zn + return tx, ty + + +def lonLatFromPos(x, y, zoom, tileSize): + """Position in WGS84 coordinate of the scene coordinates. + + Convert from scene reference system to WGS84 reference system. + + Args: + x(float, int or numpy.ndarray): X value or values. + y(float, int or numpy.ndarray): Y value or values. + zoom(int): The zoom level. + tileSize(int): The size of the tile. + + Returns: + tuple: (lon, lat) with the coordinates of the input positions. + """ + if isinstance(y, np.ndarray): + return _lonLatFromPosArray(x, y, zoom, tileSize) + + tx = x / tileSize + ty = y / tileSize + zn = 1 << zoom + lon = tx / zn * 360.0 - 180.0 + n = PI - PI2 * ty / zn + lat = arctan(0.5 * (exp(n) - exp(-n))) / Deg2Rad + return lon, lat + + +def _lonLatFromPosArray(x, y, zoom, tileSize): + # Optimized implementation of posFromLonLat() function for numpy arrays + zn = 1 << zoom + + lon = x / tileSize + lon /= zn + lon *= 360 + lon -= 180 + + lat = y / tileSize + lat *= -PI2 / zn + lat += PI + tmp = lat * -1.0 + exp(lat, out=lat) + exp(tmp, out=tmp) + lat -= tmp + lat *= 0.5 + arctan(lat, out=lat) + lat /= Deg2Rad + + return lon, lat diff --git a/pytilemap/zoom_in_symbol.png b/pytilemap/zoom_in_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..6787135d2006942484c9cd269deba64e2fa0e34d GIT binary patch literal 557 zcmV+|0@D47P)WFU8GbZ8()Nlj2>E@cM*00EUrL_t(o!|j(rO2a@DhQCSD zv=P&aluD_KLKlL25!~t-+_-S-F+75&@EWeXfJ+e(3N2_YsZiUdCUG;`q{Wy{5>Uu{ zn+(kS|IGXUyh)&lBC?Ki4!I^!%pPZ)#1mX7gMZ~|Ji%RRf}1FySRx2AD02i;%Ujg{ zPhhMyyB~UPW=~M3j17Rp3!Z}FzqqK*hyY)%^Rjo5%@!U3`_!oBBl0U91YMk@1zO)l zj|99W-@l4YTOg%QEpnd&hD-t2V2qB3pvnXd7n=$uf&msI<}sK{1dE(e1$22*O)eG^ zKt#+QUYEE;bK2-qPG8z{0TG0DEL1i4h(GQ(h9W@;FcT51VU_6RQKk{9b_Fo7R^SaZ zdOvAk#I`nr8Z~B&nP4$O;N!_XZ!)C}K!YdMUeu3_I!p;LaS=4RrJWEnrbN+fArP4C z0DCd>l;7lcGy+^~bh>$5IKDjm0E&0N;E!;)FaAV}$TmI!60zQ)9pwj000000NkvXXu0mjfOy1XA literal 0 HcmV?d00001 diff --git a/pytilemap/zoom_out_symbol.png b/pytilemap/zoom_out_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..c49ba6af241054476af96343d52237b8f51a39e0 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+`=Ht$S`Y;1W=H@#M9T6{UH}Wv$~YpzxifBA=%83h!W@g+}zZ>5+Ij>!MP|ku_QG` zp**uBL&4qCHy}kXm7Rfsk=xV7F(l&f+v(PRhaE&*`(|QNT*pB9^wDY|;GW4At%kP@xn?$R_umU))o@_^&rr~^b%tCJ?ff#Zvvj`_3R202oF2_ zO?{T!Os;?irf-4;w{I6_`mJ{SeMbRI0w}yZUHx3v IIVCg!01@7wTL1t6 literal 0 HcmV?d00001 From fed171747f9e04d114b3865f4677febd68ec4c83 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 25 Jan 2018 13:15:10 -0500 Subject: [PATCH 05/31] Revert "unable to undo accidentail delete of pytilemap directory, so adding it from commit 54012d48f05c14012c8c8cfc034cfba68a2106e9" This reverts commit 919f97f0422e5367c5d81b9312025bde557b3916. --- pytilemap/__init__.py | 34 -- pytilemap/functions.py | 181 ------- pytilemap/imagebutton.py | 39 -- pytilemap/mapescaleitem.py | 268 ---------- pytilemap/mapitems.py | 409 --------------- pytilemap/maplegenditem.py | 151 ------ pytilemap/mapnavitem.py | 150 ------ pytilemap/mapscene.py | 478 ------------------ pytilemap/maptilesources/__init__.py | 6 - pytilemap/maptilesources/maptilesource.py | 39 -- pytilemap/maptilesources/maptilesourcehere.py | 71 --- pytilemap/maptilesources/maptilesourcehttp.py | 116 ----- .../maptilesources/maptilesourcelocal.py | 33 -- pytilemap/maptilesources/maptilesourceosm.py | 13 - pytilemap/mapview.py | 90 ---- pytilemap/qtsupport.py | 48 -- pytilemap/tileutils.py | 105 ---- pytilemap/zoom_in_symbol.png | Bin 557 -> 0 bytes pytilemap/zoom_out_symbol.png | Bin 419 -> 0 bytes 19 files changed, 2231 deletions(-) delete mode 100644 pytilemap/__init__.py delete mode 100644 pytilemap/functions.py delete mode 100644 pytilemap/imagebutton.py delete mode 100644 pytilemap/mapescaleitem.py delete mode 100644 pytilemap/mapitems.py delete mode 100644 pytilemap/maplegenditem.py delete mode 100644 pytilemap/mapnavitem.py delete mode 100644 pytilemap/mapscene.py delete mode 100644 pytilemap/maptilesources/__init__.py delete mode 100644 pytilemap/maptilesources/maptilesource.py delete mode 100644 pytilemap/maptilesources/maptilesourcehere.py delete mode 100644 pytilemap/maptilesources/maptilesourcehttp.py delete mode 100644 pytilemap/maptilesources/maptilesourcelocal.py delete mode 100644 pytilemap/maptilesources/maptilesourceosm.py delete mode 100644 pytilemap/mapview.py delete mode 100644 pytilemap/qtsupport.py delete mode 100644 pytilemap/tileutils.py delete mode 100644 pytilemap/zoom_in_symbol.png delete mode 100644 pytilemap/zoom_out_symbol.png diff --git a/pytilemap/__init__.py b/pytilemap/__init__.py deleted file mode 100644 index 2e09070..0000000 --- a/pytilemap/__init__.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import print_function, absolute_import - -from .mapscene import MapGraphicsScene -from .mapview import MapGraphicsView -from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ - MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ - MapGraphicsRectItem -from .maplegenditem import MapLegendItem -from .mapescaleitem import MapScaleItem -from .maptilesources import MapTileSource, MapTileSourceHere, MapTileSourceHereDemo, \ - MapTileSourceOSM, MapTileSourceHTTP -from .mapnavitem import MapNavItem - - -__all__ = [ - 'MapGraphicsScene', - 'MapGraphicsView', - 'MapGraphicsCircleItem', - 'MapGraphicsLineItem', - 'MapGraphicsPolylineItem', - 'MapGraphicsPixmapItem', - 'MapGraphicsTextItem', - 'MapGraphicsRectItem', - 'MapLegendItem', - 'MapTileSource', - 'MapTileSourceHere', - 'MapTileSourceHereDemo', - 'MapTileSourceOSM', - 'MapTileSourceHTTP', - "MapNavItem", - "ImageButton" -] - -__version__ = '1.0.0' diff --git a/pytilemap/functions.py b/pytilemap/functions.py deleted file mode 100644 index c97f992..0000000 --- a/pytilemap/functions.py +++ /dev/null @@ -1,181 +0,0 @@ -import sys -import sip -import numpy as np - -from qtpy.QtCore import Qt -from qtpy.QtGui import QColor, QBrush, QPen - -SolidLine = Qt.SolidLine -SolidPattern = Qt.SolidPattern -SquareCap = Qt.SquareCap -BevelJoin = Qt.BevelJoin - - -__all__ = [ - 'iterRange', - 'makeColorFromInts', - 'makeColorFromFloats', - 'makeColorFromStr', - 'makeColorFromNdArray', - 'makeColorFromList', - 'makeColor', - 'makeBrush', - 'makePen', - 'clip', -] - -PYTHON_VERSION = sys.version_info[0] - -if PYTHON_VERSION == 2: - iterRange = xrange - import itertools - izip = itertools.izip -else: - iterRange = range - izip = zip - - -def makeColorFromInts(ints): - """Create a color from list or tuple of integers - - Args: - ints (tuple[int]): Integers [0, 255] values for the color. May be 3 or 4 for the alpha color. - - Retuns: - QColor: color - """ - r = ints[0] - g = ints[1] - b = ints[2] - a = ints[3] if len(ints) == 4 else 255 - return QColor(r, g, b, a) - - -def makeColorFromFloats(floats): - """Create a color from list or tuple of floats - - Args: - floats (tuple[float]): Float [0.0, 1.0] values for the color. May be 3 or 4 for the alpha color. - - Retuns: - QColor: color - """ - r = int(floats[0] * 255.0) - g = int(floats[1] * 255.0) - b = int(floats[2] * 255.0) - a = int(floats[3] * 255.0) if len(floats) == 4 else 255 - return QColor(r, g, b, a) - - -def makeColorFromStr(name): - """Create a color from a string - - Args: - name (str): name or html string of the color - - Retuns: - QColor: color - """ - return QColor(name) - - -def makeColorFromNdArray(array): - """Create a list of colors from a numpy array - - Args: - array (numpy.ndarray): (Nx3) or (Nx4) numpy array with number in range [0, 255] or [0.0, 1.0] - - Retuns: - list[QColor]: List of colors - """ - if array.dtype in [np.float32, np.float64]: - array = np.asarray(array * 255.0, dtype=np.int32) - - return [makeColorFromInts(row) for row in array] - - -def makeColorFromList(colorList): - """Create a list of colors from a list, tuple or numpy array - - Args: - colorList (list,tuplenumpy.ndarray): List, tuple or numpy array. The elements must have length of 3 or 4 - and the numbers must be in range [0, 255] or [0.0, 1.0] - - Retuns: - list[QColor]: List of colors - """ - colors = list() - if len(colorList) == 0: - return colors - - element = colorList[0][0] - if isinstance(element, (float, np.floating)): - makeFunction = makeColorFromFloats - elif isinstance(element, (int, np.integer)): - makeFunction = makeColorFromInts - elif isinstance(element, str): - makeFunction = makeColorFromStr - else: - makeFunction = QColor - - return [makeFunction(row) for row in colorList] - - -def makeColor(args): - """Convenience function for creating a QColor or a list of QColors. - - Args: - args: Argument for creating QColor[s] - - Return: - list[QColor],QColor: Created QColor[s]. - - See: - :func:`makeColorFromInts` - :func:`makeColorFromFloats` - :func:`makeColorFromStr` - :func:`makeColorFromNdArray` - :func:`makeColorFromList` - """ - makeFunction = QColor - if isinstance(args, str): - makeFunction = makeColorFromStr - elif isinstance(args, tuple): - if isinstance(args[0], int): - makeFunction = makeColorFromInts - else: - makeFunction = makeColorFromFloats - elif isinstance(args, np.ndarray): - makeFunction = makeColorFromNdArray - elif isinstance(args, list): - makeFunction = makeColorFromList - - return makeFunction(args) - - -def makeBrush(color, style=SolidPattern): - if color is None: - return QBrush(Qt.NoBrush) - if isinstance(color, QBrush): - return QBrush(color) - color = makeColor(color) - if isinstance(color, list): - return [QBrush(c, style) for c in color] - return QBrush(color, style) - - -def makePen(color, width=1.0, style=SolidLine, cap=SquareCap, join=BevelJoin): - if color is None: - return QPen(Qt.NoPen) - if isinstance(color, QPen): - return QPen(color) - brush = makeBrush(color) - if isinstance(brush, list): - if not hasattr(width, '__iter__'): - width = np.full(len(brush), width, dtype=np.float64) - return [QPen(b, w, style=style) for b, w in izip(brush, width)] - return QPen(brush, width, style=style, cap=cap, join=join) - - -def clip(value, minValue, maxValue): - return min(maxValue, max(minValue, value)) diff --git a/pytilemap/imagebutton.py b/pytilemap/imagebutton.py deleted file mode 100644 index ffd1803..0000000 --- a/pytilemap/imagebutton.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Signal -from qtpy.QtWidgets import QGraphicsObject, QGraphicsItemGroup, QGraphicsPixmapItem - -class ImageButton(QGraphicsObject): - ''' - Custom Image Holder Class that Allows for event handling - - - QGraphicsPixmapItem is not a QObject, so cannot catch events. - ''' - QtParentClass = QGraphicsObject - - clicked = Signal(int) - - def __init__(self, img, parent=None): - ''' - Args: - img: A QPixmap instance - - Keyword Args: - parent: A pyqt window instance - ''' - QGraphicsObject.__init__(self, parent=parent) - self.image = QGraphicsPixmapItem(img, parent=self) - self.parent = parent - - def paint(self, painter, option, widget): - self.image.paint(painter,option,widget) - - def boundingRect(self): - return self.image.boundingRect() - - def mouseReleaseEvent(self, event): - self.clicked.emit(1) - - def mousePressEvent(self, event): - pass -# end ImageButton - diff --git a/pytilemap/mapescaleitem.py b/pytilemap/mapescaleitem.py deleted file mode 100644 index eb982c4..0000000 --- a/pytilemap/mapescaleitem.py +++ /dev/null @@ -1,268 +0,0 @@ -import numpy as np - -from qtpy.QtCore import Qt, Slot, QPointF, QRectF -from qtpy.QtGui import QFontMetrics, QFont -from qtpy.QtWidgets import QGraphicsObject - - -from .mapitems import MapItem -from .functions import makePen, makeBrush, clip -from .qtsupport import getQVariantValue - - -class MapScaleItem(QGraphicsObject, MapItem): - """Scale bar for the visualization of the scale of teh map. - - The scale bar is located on the bottom right of the map and can' be moved. - The scale bar accepts hover events and change its color. - """ - - QtParentClass = QGraphicsObject - - EarthCircumference = 1000.0 * 6372.7982 * 2.0 * np.pi - DegToRad = np.pi / 180.0 - - _defaultScaleVisualization = { - 21: 5, - 20: 10, - 19: 20, - 18: 20, - 17: 50, - 16: 100, - 15: 200, - 14: 500, - 13: 1 * 1000, - 12: 2 * 1000, - 11: 5 * 1000, - 10: 10 * 1000, - 9: 20 * 1000, - 8: 50 * 1000, - 7: 100 * 1000, - 6: 200 * 1000, - 5: 200 * 1000, - 4: 500 * 1000, - 3: 1000 * 1000, - } - """dict: Default meters that will be shown within the scale for each zoom value. - """ - - _posForAnchors = { - Qt.TopLeftCorner: QPointF(20.0, 15.0), - Qt.TopRightCorner: QPointF(20.0, -15.0), - Qt.BottomLeftCorner: QPointF(20.0, -15.0), - Qt.BottomRightCorner: QPointF(20.0, 15.0), - } - - def __init__(self, textPen='black', barBrush=(190, 190, 190, 160), barPen=(190, 190, 190, 240), - barBrushHover=(110, 110, 110, 255), barPenHover=(90, 90, 90, 255), - anchor=Qt.BottomRightCorner, anchorPos=None, parent=None): - """Construct a scale bar with text on the right bottom of the map - - Keyword Args: - textPen: QPen to use for drawing the text. Default 'black'. - barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) - barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) - barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. - Default (110, 110, 110, 255). - barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. - Default (90, 90, 90, 255). - parent: Parent item - anchor (Qt.Corner): The *corner* used as anchor for the item, Valid values are within the - Qt.Corner enum - anchorPos (QPointF): The distance between the item and the *corner* - - Note: - Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() - are accepted. - """ - QGraphicsObject.__init__(self, parent=parent) - MapItem.__init__(self) - - self.setZValue(100) - - self._textPen = makePen(textPen) - self._barBrush = makeBrush(barBrush) - self._barPen = makePen(barPen) - self._barBrushHover = makeBrush(barBrushHover) - self._barPenHover = makePen(barPenHover) - - self._scaleView = MapScaleItem._defaultScaleVisualization.copy() - self._minZoomScale = min(self._scaleView.keys()) - self._maxZoomScale = max(self._scaleView.keys()) - - self.setAcceptHoverEvents(True) - self._hover = False - - if anchorPos is None: - anchorPos = self._posForAnchors[anchor] - self._anchorPos = QPointF(anchorPos) - self._anchor = anchor - - self._barWidth = 0 # The width of the scale bar - self._text = '' # The text to display near the scale bar - self._zoom = 0 # The current zoom level - self._meters = 0 # The number of meters used to evaluate the size of the scale bar and its text - self._meterPerPixelsEquator = 0 # The number of meters each pixel represents at the equator - self._textRect = QRectF() # The bounding rect of text - - def _sceneChanged(self, oldScene, newScene): - if oldScene is not None: - oldScene.sceneRectChanged.disconnect(self._setSceneRect) - if newScene is not None: - newScene.sceneRectChanged.connect(self._setSceneRect) - # Setup the new position of the item - self.setZoom(newScene.zoom()) - self._setSceneRect(newScene.sceneRect()) - - def updatePosition(self, scene): - # Nothing to do here - pass - - def boundingRect(self): - anchor = self._anchor - if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: - return QRectF(0, 0, self._barWidth + 3, 10).united(self._textRect) - else: - textRect = self._textRect.translated(self._barWidth + 10, 0) - return QRectF(0, 0, self._barWidth + 3, 10).united(textRect) - - def paint(self, painter, option, widget): - if self._hover: - painter.setPen(self._barPenHover) - painter.setBrush(self._barBrushHover) - else: - painter.setPen(self._barPen) - painter.setBrush(self._barBrush) - painter.drawRoundedRect(0, 0, self._barWidth, 10, 3, 3) - - anchor = self._anchor - if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: - textRect = self._textRect - else: - textRect = self._textRect.translated(self._barWidth + 10, 0) - painter.setPen(self._textPen) - painter.drawText(textRect, Qt.TextSingleLine, self._text) - - @Slot(QRectF) - def _setSceneRect(self, rect): - self._updateScaleBar() - - anchorPos = self._anchorPos - anchor = self._anchor - newPos = None - if anchor == Qt.BottomRightCorner: - newPos = rect.bottomRight() - anchorPos - QPointF(self._barWidth, 0.0) - elif anchor == Qt.TopRightCorner: - newPos = rect.topRight() - anchorPos - QPointF(self._barWidth, 0.0) - elif anchor == Qt.TopLeftCorner: - newPos = rect.topLeft() + anchorPos - elif anchor == Qt.BottomLeftCorner: - newPos = rect.bottomLeft() + anchorPos - else: - raise NotImplementedError('Other corner have not actually been implemented') - - self.setPos(newPos) - - def _updateScaleBar(self): - scene = self.scene() - if scene is None: - self.setVisible(False) - return - self.setVisible(True) - - centerYRad = scene.center().y() * self.DegToRad - meterPerPixels = self._meterPerPixelsEquator * np.cos(centerYRad) - self._barWidth = int(self._meters / meterPerPixels) - - def setZoom(self, zoom): - '''Set a new zoom level. - Args: - zoom (int): The new zoom level. - ''' - self._zoom = zoom - zoomSelector = clip(zoom, self._minZoomScale, self._maxZoomScale) - meters = self._scaleView[zoomSelector] - if meters >= 1000: - self._text = '%d km' % (meters / 1000.0) - else: - self._text = '%d m' % meters - self._meters = meters - self._meterPerPixelsEquator = self.EarthCircumference / np.power(2.0, zoom + 8) - - # Evaluate the bounding box of the current text - anchor = self._anchor - textRect = QFontMetrics(QFont()).boundingRect(self._text) - if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: - textRect.moveLeft(-textRect.width() - 10) - textRect.moveTop(-textRect.height() + 10) - else: - textRect.moveTop(-textRect.height() + 14) - self._textRect = QRectF(textRect) - self.update() - - def setScaleForZoom(self, zoomLevel, metersInScaleBar): - """Set the scale in meters/kilometers to be shown for a zoom level - - Args: - zoomLevel(int): Level of the zoom - metersInScaleBar(int): Meters to be shown in the scale bar - """ - if zoomLevel > self._maxZoomScale + 1: - raise ValueError('zoomLevel must be at least %d' % (self._maxZoomScale + 1)) - if zoomLevel < self._minZoomScale - 1: - raise ValueError('zoomLevel must be at minimum %d' % (self._minZoomScale + 1)) - - self._scaleView[zoomLevel] = metersInScaleBar - self._minZoomScale = min(self._scaleView.keys()) - self._maxZoomScale = max(self._scaleView.keys()) - - # Re-evaluate the scale bar for the current zoom - self.setZoom(self._zoom) - - self.update() - - def restoreDefaultScaleLevels(self): - """Restore the default meter scale for the zoom levels - """ - self._scaleView = MapScaleItem._defaultScaleVisualization.copy() - self._minZoomScale = min(self._scaleView.keys()) - self._maxZoomScale = max(self._scaleView.keys()) - - # Re-evaluate the scale bar for the current zoom - self.setZoom(self._zoom) - - self.update() - - def setColors(self, **kwargs): - """Set a new color for the scale bar and the text - - Keyword Args: - textPen: QPen to use for drawing the text. Default do not change. - barBrush: QBrush to use for drawing the scale bar. Default do not change. - barPen: QPen to use for drawing the scale bar border.Default do not change. - barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. - Default do not change. - barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. - Default do not change. - """ - if 'textPen' in kwargs: - self._textPen = makePen(kwargs['textPen']) - if 'barBrush' in kwargs: - self._barBrush = makeBrush(kwargs['barBrush']) - if 'barPen' in kwargs: - self._barPen = makePen(kwargs['barPen']) - if 'barBrushHover' in kwargs: - self._barBrushHover = makeBrush(kwargs['barBrushHover']) - if 'barPenHover' in kwargs: - self._barPenHover = makePen(kwargs['barPenHover']) - self.update() - - def hoverEnterEvent(self, event): - event.accept() - self._hover = True - self.update() - - def hoverLeaveEvent(self, event): - event.accept() - self._hover = False - self.update() diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py deleted file mode 100644 index 581bda9..0000000 --- a/pytilemap/mapitems.py +++ /dev/null @@ -1,409 +0,0 @@ -from __future__ import print_function, absolute_import - -import numpy as np - -from qtpy.QtCore import Qt, QLineF, QPointF, QRectF -from qtpy.QtGui import QPainterPath -from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ - QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem - -from .functions import iterRange, makePen, izip -from .qtsupport import getQVariantValue - -SolidLine = Qt.SolidLine - - -class MapItem(object): - """Base class for each item in the MapGraphicScene - - The default implementation connects the MapGraphicScene.sigZoomChanged() signal - to the MapItem.setZoom() slot. This slot call the MapItem.updatePosition() method - for updating the position of the item in reaction to a change in the zoom level. - """ - - QtParentClass = None - - def __init__(self): - if not isinstance(self, QGraphicsItem): - raise RuntimeError('MapItem must be an instance of QGraphicsItem') - - def itemChange(self, change, value): - if change == self.ItemSceneChange: - # Disconnect the old scene, if any - oldScene = self.scene() - if oldScene is not None: - oldScene.sigZoomChanged.disconnect(self.setZoom) - # Connect the new scene, if any - newScene = getQVariantValue(value) - if newScene is not None: - newScene.sigZoomChanged.connect(self.setZoom) - - # Notify the item that the scene is changed - self._sceneChanged(oldScene, newScene) - - # Setup the new position of the item - if newScene is not None: - self.updatePosition(newScene) - - return self.QtParentClass.itemChange(self, change, value) - - def _sceneChanged(self, oldScene, newScene): - """Called when the current scene change. - - - This function can be reimplemented for notifying that the scene has changed. - The function is called when the scene has changed, just before the - :meth:`~updatePosition` method. - - Default - - Args: - oldScene (QGraphicsScene): The old scene, or ``None``. - newScene (QGraphicsScene): The new scene, or ``None``. - - Note: - :meth:`~scene` method is pointing to the ``oldScene``. - """ - pass - - def setZoom(self, zoom): - '''Set a new zoom level. - - Args: - zoom (int): The new zoom level. - ''' - scene = self.scene() - self.updatePosition(scene) - - def updatePosition(self, scene): - raise NotImplementedError() - - -class MapGraphicsCircleItem(QGraphicsEllipseItem, MapItem): - """Circle item for the MapGraphicsScene - """ - - QtParentClass = QGraphicsEllipseItem - - def __init__(self, longitude, latitude, radius, parent=None): - """Constructor. - - Args: - longitude(float): Longitude of the center of the circle. - latitude(float): Latitude of the center of the circle. - radius(float): Radius of the circle in pixels. - scene(MapGraphicsScene): Scene to which the circle belongs. - parent(QGraphicsItem): Parent item, default None. - - Note: - The management of the parent item is work in progress. - """ - QGraphicsEllipseItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon = longitude - self._lat = latitude - self._radius = radius - - def updatePosition(self, scene): - """Update the position of the circle. - - Args: - scene(MapGraphicsScene): Scene to which the circle belongs. - """ - pos = scene.posFromLonLat(self._lon, self._lat) - r = self._radius - d = r * 2 - self.prepareGeometryChange() - self.setRect(pos[0] - r, pos[1] - r, d, d) - - def setLonLat(self, longitude, latitude): - """Set the center coordinates of the circle. - - Args: - longitude(float): Longitude of the center of the circle. - latitude(float): Latitude of the center of the circle. - """ - self._lon = longitude - self._lat = latitude - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - def setRadius(self, radius): - self._radius = radius - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - -class MapGraphicsRectItem(QGraphicsRectItem, MapItem): - """Circle item for the MapGraphicsScene - """ - - QtParentClass = QGraphicsRectItem - - def __init__(self, lon0, lat0, lon1, lat1, parent=None): - """Constructor. - - Args: - lon0(float): Longitude of the top left point. - lat0(float): Latitude of the top left point. - lon1(float): Longitude of the bottom right point. - lat1(float): Latitude of the bottom right point. - parent(QGraphicsItem): Parent item, default None. - - Note: - The management of the parent item is work in progress. - """ - QGraphicsRectItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - - def updatePosition(self, scene): - """Update the position of the circle. - - Args: - scene(MapGraphicsScene): Scene to which the circle belongs. - """ - pos0 = scene.posFromLonLat(self._lon0, self._lat0) - pos1 = scene.posFromLonLat(self._lon1, self._lat1) - - self.prepareGeometryChange() - rect = QRectF(pos0, pos1).normalized() - self.setRect(rect) - self.setPos(QPointF(0.0, 0.0)) - - def setLonLat(self, lon0, lat0, lon1, lat1): - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - scene = self.scene() - if scene is not None: - self.updatePosition(self.scene()) - - -class MapGraphicsLineItem(QGraphicsLineItem, MapItem): - - QtParentClass = QGraphicsLineItem - - def __init__(self, lon0, lat0, lon1, lat1, parent=None): - QGraphicsLineItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - - def updatePosition(self, scene): - pos0 = scene.posFromLonLat(self._lon0, self._lat0) - pos1 = scene.posFromLonLat(self._lon1, self._lat1) - deltaPos = QPointF(pos1[0] - pos0[0], pos1[1] - pos0[1]) - - self.prepareGeometryChange() - self.setLine(QLineF(QPointF(0.0, 0.0), deltaPos)) - self.setPos(pos0[0], pos0[1]) - - def setLonLat(self, lon0, lat0, lon1, lat1): - self._lon0 = lon0 - self._lat0 = lat0 - self._lon1 = lon1 - self._lat1 = lat1 - scene = self.scene() - if scene is not None: - self.updatePosition(self.scene()) - - -class MapGraphicsPolylineItem(QGraphicsPathItem, MapItem): - - QtParentClass = QGraphicsPathItem - - def __init__(self, longitudes, latitudes, parent=None): - QGraphicsPathItem.__init__(self, parent=parent) - MapItem.__init__(self) - - assert len(longitudes) == len(latitudes) - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - - def updatePosition(self, scene): - path = QPainterPath() - - self.prepareGeometryChange() - - count = len(self._longitudes) - if count > 0: - x, y = scene.posFromLonLat(self._longitudes, self._latitudes) - path.moveTo(x[0], y[0]) - for i in iterRange(1, count): - path.lineTo(x[i], y[i]) - - self.setPath(path) - - def setLonLat(self, longitudes, latitudes): - assert len(longitudes) == len(latitudes) - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - -class MapGraphicsPixmapItem(QGraphicsPixmapItem, MapItem): - """Item for showing a pixmap in a MapGraphicsScene. - """ - - QtParentClass = QGraphicsPixmapItem - - def __init__(self, longitude, latitude, pixmap, parent=None): - """Constructor. - - Args: - longitude(float): Longitude of the origin of the pixmap. - latitude(float): Latitude of the center of the pixmap. - pixmap(QPixmap): Pixmap. - scene(MapGraphicsScene): Scene the item belongs to. - parent(QGraphicsItem): Parent item. - """ - QGraphicsPixmapItem.__init__(self, parent=parent) - MapItem.__init__(self) - - self._lon = longitude - self._lat = latitude - self.setPixmap(pixmap) - - def updatePosition(self, scene): - """Update the origin position of the item. - - Origin coordinates are unchanged. - - Args: - scene(MapGraphicsScene): Scene the item belongs to. - """ - pos = scene.posFromLonLat(self._lon, self._lat) - self.prepareGeometryChange() - self.setPos(pos[0], pos[1]) - - def setLonLat(self, longitude, latitude): - """Update the origin coordinates of the item. - - Origin position will be updated. - - Args: - longitude(float): Longitude of the origin of the pixmap. - latitude(float): Latitude of the center of the pixmap. - """ - self._lon = longitude - self._lat = latitude - scene = self.scene() - if scene is not None: - self.updatePosition(scene) - - -class MapGraphicsTextItem(QGraphicsSimpleTextItem, MapItem): - """Text item for the MapGraphicsScene - """ - - QtParentClass = QGraphicsSimpleTextItem - - def __init__(self, longitude, latitude, text, parent=None, min_zoom_visibility=None): - QGraphicsSimpleTextItem.__init__(self, text, parent=parent) - MapItem.__init__(self) - self._min_zoom = min_zoom_visibility - self._lon, self._lat = longitude, latitude - - def resetMinZoomVisibility(self): - """Delete level of zoom under which the text disappears. """ - self._min_zoom = None - - def setMinZoomVisibility(self, zoom_level): - """Update level of zoom under which the text disappears. """ - self._min_zoom = zoom_level - - def updatePosition(self, scene): - """Update the origin position of the item.""" - - pos = scene.posFromLonLat(self._lon, self._lat) - self.setPos(pos) - if self._min_zoom is not None: - self.setVisible(scene._zoom >= self._min_zoom) - - -class MapGraphicsLinesGroupItem(QGraphicsItem, MapItem): - - QtParentClass = QGraphicsItem - - def __init__(self, longitudes, latitudes, parent=None): - QGraphicsItem.__init__(self, parent=parent) - MapItem.__init__(self) - - assert len(longitudes) == len(latitudes) - assert len(longitudes) >= 2 - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - - # Setup internal lines - linesGroup = QGraphicsItemGroup(parent=self) - self._linesGroup = linesGroup - self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] - - def paint(self, painter, option, widget=None): - pass - - def boundingRect(self): - return self._linesGroup.boundingRect() - - def setLineStyle(self, colors, width=1., style=SolidLine): - pen = makePen(colors, width=width, style=style) - - if isinstance(pen, list): - if len(pen) != len(self._lines): - raise ValueError('The number of colors must be equal to the number of lines') - for line, p in izip(self._lines, pen): - line.setPen(p) - else: - for line in self._lines: - line.setPen(pen) - - def updatePosition(self, scene): - self.prepareGeometryChange() - - x, y = scene.posFromLonLat(self._longitudes, self._latitudes) - lines = self._lines - for i in iterRange(0, len(lines)-1): - lines[i].setLine(x[i], y[i], x[i+1], y[i+1]) - - def setLonLat(self, longitudes, latitudes): - assert len(longitudes) == len(latitudes) - assert len(longitudes) >= 2 - - self._longitudes = np.array(longitudes, dtype=np.float64) - self._latitudes = np.array(latitudes, dtype=np.float64) - - old_lines = self._lines - for line in old_lines: - line.setParentItem(None) - - scene = self.scene() - if scene is not None: - for line in old_lines: - scene.removeItem(line) - - linesGroup = self._linesGroup - self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] - - if scene is not None: - self.updatePosition(scene) - - def __getitem__(self, index): - return self._lines[index] diff --git a/pytilemap/maplegenditem.py b/pytilemap/maplegenditem.py deleted file mode 100644 index 8823920..0000000 --- a/pytilemap/maplegenditem.py +++ /dev/null @@ -1,151 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Slot, QRectF, QPointF -from qtpy.QtGui import QPen, QBrush, QColor -from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem - -from .mapitems import MapItem -from .functions import makePen, makeBrush -from .qtsupport import getQVariantValue - - -class MapLegendEntryItem(QGraphicsItemGroup): - - def __init__(self, shape, text, parent=None): - QGraphicsItemGroup.__init__(self, parent=parent) - - text = QGraphicsSimpleTextItem(text, parent=shape) - br = shape.boundingRect() - x = br.right() + 10 - y = br.top() + 3 - text.setPos(x, y) - self.addToGroup(shape) - - self._text = text - - def top(self): - return self.boundingRect().top() - - def bottom(self): - return self.boundingRect().bottom() - - def right(self): - return self.boundingRect().right() - - def left(self): - return self.boundingRect().left() - - def text(self): - return self._text - - -class MapLegendItem(QGraphicsObject, MapItem): - - QtParentClass = QGraphicsObject - - def __init__(self, pos=None, parent=None): - QGraphicsObject.__init__(self, parent=parent) - MapItem.__init__(self) - self.setZValue(200.0) - - self._anchorPos = QPointF(pos) if pos is not None else QPointF(10.0, 10.0) - - self._border = QGraphicsRectItem(parent=self) - self._border.setPen(QPen(Qt.NoPen)) - self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) - - self._entries = list() - self._entriesGroup = QGraphicsItemGroup(parent=self) - - def _sceneChanged(self, oldScene, newScene): - if oldScene is not None: - oldScene.sceneRectChanged.disconnect(self.setSceneRect) - if newScene is not None: - newScene.sceneRectChanged.connect(self.setSceneRect) - # Setup the new position of the item - self.setSceneRect(newScene.sceneRect()) - - def updatePosition(self, scene): - pass - - def addPoint(self, text, color, border=None, size=20.0): - shape = QGraphicsEllipseItem(size / 2.0, size / 2.0, size, size) - brush = makeBrush(color) - shape.setBrush(brush) - shape.setPen(makePen(border)) - - self.addEntry(MapLegendEntryItem(shape, text)) - - def addRect(self, text, color, border=None, size=20.0): - shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) - brush = makeBrush(color) - shape.setBrush(brush) - shape.setPen(makePen(border)) - - self.addEntry(MapLegendEntryItem(shape, text)) - - def addLine(self, text, color, width=1.): - shape = QGraphicsLineItem(10., 10., 20., 20.) - pen = makePen(color, width=width) - shape.setPen(pen) - self.addEntry(MapLegendEntryItem(shape, text)) - - def addEntry(self, entry): - self._entries.append(entry) - self._entriesGroup.addToGroup(entry) - self._updateLayout() - - def boundingRect(self): - return self._border.boundingRect() - - def paint(*args, **kwargs): - pass - - @Slot(QRectF) - def setSceneRect(self, rect): - self.setPos(rect.topLeft() + self._anchorPos) - - def _updateLayout(self): - self.prepareGeometryChange() - - bottom = 0.0 - left = 0.0 - right = 0.0 - for entry in self._entries: - entry.setPos(left, bottom) - bottom += entry.bottom() + 5.0 - right = max(right, entry.right() + 5.0) - - self._border.setRect(0.0, 0.0, right, bottom + 5.0) - - def pen(self): - """Pen for the background of the legend - - Returns: - QPen: Pen for the background of the legend - """ - return self._border.pen() - - def brush(self): - """Brush for the background of the legend - - Returns: - QBrush: Brush for the background of the legend - """ - return self._border.brush() - - def setPen(self, *args, **kwargs): - """Set the pen for the background of the legend - - The arguments are the same of the :func:`makePen` function - """ - return self._border.setPen(makePen(*args, **kwargs)) - - def setBrush(self, *args, **kwargs): - """Set the brush for the background of the legend - - The arguments are the same of the :func:`makeBrush` function - """ - return self._border.setBrush(makeBrush(*args, **kwargs)) - diff --git a/pytilemap/mapnavitem.py b/pytilemap/mapnavitem.py deleted file mode 100644 index 1432e9f..0000000 --- a/pytilemap/mapnavitem.py +++ /dev/null @@ -1,150 +0,0 @@ -from __future__ import print_function, absolute_import - -import os -from qtpy.QtCore import Qt, Slot, QRectF, QPointF, QObject, Signal -from qtpy.QtGui import QPen, QBrush, QColor, QPixmap -from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem, QGraphicsPixmapItem - -from .imagebutton import ImageButton -from .mapitems import MapItem -from .functions import makePen, makeBrush -from .qtsupport import getQVariantValue - -from .maplegenditem import * - - -class MapNavItem(QGraphicsObject, MapItem): - - QtParentClass = QGraphicsObject - - _posForAnchors = { - Qt.TopLeftCorner: QPointF(20.0, 75.0), - Qt.TopRightCorner: QPointF(40.0, -15.0), - Qt.BottomLeftCorner: QPointF(20.0, -15.0), - Qt.BottomRightCorner: QPointF(30.0, 75.0), - } - - - def __init__(self, anchor, parent=None): - QGraphicsObject.__init__(self, parent=parent) - MapItem.__init__(self) - self.setZValue(200.0) - - anchorPos = self._posForAnchors[anchor] - self._anchorPos = QPointF(anchorPos) - self._anchor = anchor - - self._border = QGraphicsRectItem(parent=self) - self._border.setPen(QPen(Qt.NoPen)) - self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) - - self._entries = list() - - imgfile = os.path.dirname(__file__) + os.sep + 'zoom_in_symbol.png' - img = QPixmap(24,24) - img.load(imgfile) - img = img.scaled(24,24) - img = ImageButton(img, parent=self) - self.zoom_in_button = img - self.addEntry(self.zoom_in_button) - - imgfile = os.path.dirname(__file__) + os.sep + 'zoom_out_symbol.png' - img2 = QPixmap(24,24) - img2.load(imgfile) - img2 = img2.scaled(24,24) - img2 = ImageButton(img2, parent=self) - self.zoom_out_button = img2 - self.addEntry(self.zoom_out_button) - - def _sceneChanged(self, oldScene, newScene): - if oldScene is not None: - oldScene.sceneRectChanged.disconnect(self.setSceneRect) - if newScene is not None: - newScene.sceneRectChanged.connect(self.setSceneRect) - # Setup the new position of the item - self.setSceneRect(newScene.sceneRect()) - - def updatePosition(self, scene): - pass - - def addRect(self, text, color, border=None, size=20.0): - shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) - brush = makeBrush(color) - shape.setBrush(brush) - shape.setPen(makePen(border)) - - self.addEntry(MapLegendEntryItem(shape, text)) - - def addEntry(self, entry): - self._entries.append(entry) - self._updateLayout() - - def boundingRect(self): - return self._border.boundingRect() - - def paint(*args, **kwargs): - pass - - @Slot(QRectF) - def setSceneRect(self, rect): - anchorPos = self._anchorPos - anchor = self._anchor - newPos = None - if anchor == Qt.BottomRightCorner: - newPos = rect.bottomRight() - anchorPos - elif anchor == Qt.TopRightCorner: - newPos = rect.topRight() - anchorPos - elif anchor == Qt.TopLeftCorner: - newPos = rect.topLeft() + anchorPos - elif anchor == Qt.BottomLeftCorner: - newPos = rect.bottomLeft() + anchorPos - else: - raise NotImplementedError('Other corner have not actually been implemented') - - self.setPos(newPos) - - - def _updateLayout(self): - self.prepareGeometryChange() - - bottom = 0.0 - left = 0.0 - right = 0.0 - for entry in self._entries: - entry.setPos(left, bottom) - bottom += entry.boundingRect().bottom() - right = max(right, entry.boundingRect().right() + 1.0) - - self._border.setRect(0.0, 0.0, right, bottom + 1.0) - - def pen(self): - """Pen for the background of the legend - - Returns: - QPen: Pen for the background of the legend - """ - return self._border.pen() - - def brush(self): - """Brush for the background of the legend - - Returns: - QBrush: Brush for the background of the legend - """ - return self._border.brush() - - def setPen(self, *args, **kwargs): - """Set the pen for the background of the legend - - The arguments are the same of the :func:`makePen` function - """ - return self._border.setPen(makePen(*args, **kwargs)) - - def setBrush(self, *args, **kwargs): - """Set the brush for the background of the legend - - The arguments are the same of the :func:`makeBrush` function - """ - return self._border.setBrush(makeBrush(*args, **kwargs)) - diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py deleted file mode 100644 index 93528f5..0000000 --- a/pytilemap/mapscene.py +++ /dev/null @@ -1,478 +0,0 @@ -from __future__ import print_function, absolute_import, division - -from numpy import floor - -from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint -from qtpy.QtGui import QPixmap -from qtpy.QtWidgets import QGraphicsScene - -from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ - MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ - MapGraphicsRectItem, MapGraphicsLinesGroupItem -from .maplegenditem import MapLegendItem -from .mapescaleitem import MapScaleItem -from .mapnavitem import MapNavItem -from .functions import iterRange -from .tileutils import posFromLonLat, lonLatFromPos - - -class MapGraphicsScene(QGraphicsScene): - """Graphics scene for showing a slippy map. - """ - - sigZoomChanged = Signal(int) - - def __init__(self, tileSource, parent=None): - """Constructor. - - Args: - tileSource(MapTileSource): Source for loading the tiles. - parent(QObject): Parent object, default `None` - """ - QGraphicsScene.__init__(self, parent=parent) - - self._zoom = 15 - - self._tileSource = tileSource - self._tileSource.setParent(self) - self._tileSource.tileReceived.connect(self.setTilePixmap) - tdim = self._tileSource.tileSize() - - self._emptyTile = QPixmap(tdim, tdim) - self._emptyTile.fill(Qt.lightGray) - - self._tilesRect = QRect() - self._tilePixmaps = {} - - self._tileInDownload = list() - - self.setSceneRect(0.0, 0.0, 400, 300) - self.sceneRectChanged.connect(self.onSceneRectChanged) - - @Slot() - def close(self): - self._tileSource.close() - - def setTileSource(self, newTileSource): - self._tileSource.tileReceived.disconnect(self.setTilePixmap) - self._tileSource.close() - - self._tilePixmaps.clear() - self._tileInDownload = list() - - self._tileSource = newTileSource - self._tileSource.setParent(self) - self._tileSource.tileReceived.connect(self.setTilePixmap) - - self.requestTiles() - - self.invalidate() - self.update() - - @Slot(QRectF) - def onSceneRectChanged(self, rect): - """Callback for the changing of the visible rect. - - Evaluate the visible tiles and request to load the new tiles. - - Args: - rect(QRectF): Current visible area. - """ - tdim = self._tileSource.tileSize() - center = rect.center() - ct = self.tileFromPos(center.x(), center.y()) - tx = ct.x() - ty = ct.y() - - width = rect.width() - height = rect.height() - # top left corner of the center tile - xp = int(width / 2.0 - (tx - floor(tx)) * tdim) - yp = int(height / 2.0 - (ty - floor(ty)) * tdim) - - # first tile vertical and horizontal - xs = tx - (xp + tdim - 1) / tdim - ys = ty - (yp + tdim - 1) / tdim - - # last tile vertical and horizontal - xe = (width - xp - 1) / tdim - xs + 1 + tx - ye = (height - yp - 1) / tdim - ys + 1 + ty - - # define the rect of visible tiles - self._tilesRect = QRect(xs, ys, xe, ye) - - # Request the loading of new tiles (if needed) - self.requestTiles() - - self.invalidate() - self.update() - - def drawBackground(self, painter, rect): - """Draw the background tiles. - - If a tile is not available, draw a gray rectangle. - - Args: - painter(QPainter): Painter for drawing. - rect(QRectF): Current visible area. - """ - tilesRect = self._tilesRect - left = tilesRect.left() - top = tilesRect.top() - numXtiles = tilesRect.width() - numYtiles = tilesRect.height() - tdim = self._tileSource.tileSize() - pixRect = QRectF(0.0, 0.0, tdim, tdim) - emptyTilePix = self._emptyTile - tilePixmaps = self._tilePixmaps - - for x in iterRange(numXtiles+1): - for y in iterRange(numYtiles+1): - tp = (x + left, y + top) - box = self.tileRect(tp[0], tp[1]) - # Use default gray image if tile image is missing - pix = tilePixmaps.get(tp, emptyTilePix) - painter.drawPixmap(box, pix, pixRect) - - def zoomTo(self, pos, zoomlevel): - """Zoom to a specific zoom level. - - If the level is out of range, the zoom action is ignored. - - clear the current tile cache, evaluate the new center and - update the position of all the items. - - Args: - zoomlevel(int): New zoom level. - """ - - tileSource = self._tileSource - if zoomlevel > tileSource.maxZoom() or zoomlevel < tileSource.minZoom(): - return - - # Get the coordinates of the center using the position in pixels of the mouse - pos_corr = self.views()[0].mapToScene(pos) - coord = self.lonLatFromPos(pos_corr.x(), pos_corr.y()) - - # Set the new zoom level - self._zoom = zoomlevel - - # Clear cache and abort active requests - self._tileSource.abortAllRequests() - self._tilePixmaps.clear() - - # Re-center map so that the point on which it was zoomed is in the same position - self.setCenter(coord[0], coord[1]) - pos_corr = self.views()[0].mapToScene(pos) - center = self.sceneRect().center() - self.translate(center.x() - pos_corr.x(), center.y() - pos_corr.y()) - - self.sigZoomChanged.emit(zoomlevel) - - def zoomIn(self, pos=None): - """Increments the zoom level - - Args: - pos (QPointF): Center position, Latitude and Longitude. Default None for the - current center position. - """ - if pos is None: - pos = QPoint(self.width()/2, self.height()/2) - self.zoomTo(pos, self._zoom + 1) - - def zoomOut(self, pos=None): - """Decrements the zoom level - - Args: - pos (QPointF): Center position, Latitude and Longitude. Default None for the - current center position. - """ - if pos is None: - pos = QPoint(self.width()/2, self.height()/2) - self.zoomTo(pos, self._zoom - 1) - - @Slot() - def handleZoomIn(self): - self.zoomIn() - - @Slot() - def handleZoomOut(self): - self.zoomOut() - - def zoom(self): - return self._zoom - - @Slot(int, int, int, QPixmap) - def setTilePixmap(self, x, y, zoom, pixmap): - """Set the image of the tile. - - Args: - x(int): X coordinate of the tile. - y(int): Y coordinate of the tile. - zoom(int): Zoom coordinate of the tile. - pixmap(QPixmap): Image for the tile. - """ - if self._zoom == zoom: - self._tilePixmaps[(x, y)] = pixmap - self.update() - - def requestTiles(self): - """Request the loading of tiles. - - Check the loaded tiles and requests only - the missing tiles. - """ - tilesRect = self._tilesRect - tilePixmaps = self._tilePixmaps - - numXtiles = tilesRect.width() - numYtiles = tilesRect.height() - left = tilesRect.left() - top = tilesRect.top() - tileSource = self._tileSource - zoom = self._zoom - - # Request load of new tiles - for x in iterRange(numXtiles): - for y in iterRange(numYtiles): - tp = (left + x, top + y) - # Request tile only if missing - if tp not in tilePixmaps: - pix = tileSource.requestTile(tp[0], tp[1], zoom) - if pix is not None: - tilePixmaps[tp] = pix - - self.update() - - def tileRect(self, tx, ty): - """Area for a specific tile. - - Args: - tx(int): X coordinate of the tile. - ty(int): Y coordinate of the tile. - - Returns: - QRectF, the area of the tile. - """ - tdim = self._tileSource.tileSize() - return QRectF(tx * tdim, ty * tdim, tdim, tdim) - - def setSize(self, width, height): - """Set the size of the visible area in pixels. - - Update the scene rect. - - Args: - width(int): Width of the visible area. - height(int): Height of the visible area. - """ - rect = QRectF(self.sceneRect().topLeft(), QSizeF(width, height)) - self.setSceneRect(rect) - - def setCenter(self, lon, lat, zoom=None): - """Move the center of the visible area to new coordinates. - - Update the scene rect. - - Args: - lon(float): New longitude of the center. - lat(float): New latitude of the center. - zoom(int [1:15]): Zoom Level - """ - if zoom != None and zoom < 15 and zoom > 0: - self._zoom = zoom - - rect = QRectF(self.sceneRect()) - pos = self.posFromLonLat(lon, lat) - rect.moveCenter(QPointF(pos[0], pos[1])) - self.setSceneRect(rect) - - - def center(self): - centerPos = self.sceneRect().center() - centerCoord = self.lonLatFromPos(centerPos.x(), centerPos.y()) - return QPointF(centerCoord[0], centerCoord[1]) - - def translate(self, dx, dy): - """Translate the visible area by dx, dy pixels. - - Update the scene rect. - - Args: - dx(int): Increments for the center x coord in pixels. - dy(int): Increments for the center y coord in pixels. - """ - self.setSceneRect(self.sceneRect().translated(dx, dy)) - - def posFromLonLat(self, lon, lat): - """Position in scene coordinate of the WGS84 coordinates. - - Convert from WGS84 reference system to scene reference system. - - Args: - lon(float or numpy.ndarray): Longitude value or values. - lat(float or numpy.ndarray): Latitude value or values. - - Returns: - tuple: (x, y) with the positions of the input coordinates. - """ - return posFromLonLat(lon, lat, self._zoom, self._tileSource.tileSize()) - - def lonLatFromPos(self, x, y): - """Position in WGS84 coordinate of the scene coordinates. - - Convert from scene reference system to WGS84 reference system. - - Args: - x(float, int or numpy.ndarray): X value or values. - y(float, int or numpy.ndarray): Y value or values. - - Returns: - tuple: (lon, lat) with the coordinates of the input positions. - """ - return lonLatFromPos(x, y, self._zoom, self._tileSource.tileSize()) - - def tileFromPos(self, x, y): - """Tile in the selected position. - - Args: - x(float, int): X value for position. - y(float, int): Y value for position. - - Returns: - QPointF with the coordinates of the tile. - """ - tdim = float(self._tileSource.tileSize()) - return QPointF(x / tdim, y / tdim) - - def addCircle(self, longitude, latitude, radius): - """Add a new circle to the graphics scene. - - Args: - longitude(float): Longitude of the center of the circle. - latitude(float): Latitude of the center of the circle. - radius(float): Longitude of the center of the circle. - - Returns: - MapGraphicsCircleItem added to the scene. - """ - item = MapGraphicsCircleItem(longitude, latitude, radius) - self.addItem(item) - return item - - def addLine(self, lon0, lat0, lon1, lat1): - """Add a newline) to the graphics scene. - - Args: - lon0(float): Longitude of the start point. - lat0(float): Latitude of the start point. - lon1(float): Longitude of the end point. - lat1(float): Latitude of the end point. - - Returns: - MapGraphicsLineItem added to the scene. - """ - item = MapGraphicsLineItem(lon0, lat0, lon1, lat1) - self.addItem(item) - return item - - def addRect(self, lon0, lat0, lon1, lat1): - """Add a newline) to the graphics scene. - - Args: - lon0(float): Longitude of the top left point. - lat0(float): Latitude of the top left point. - lon1(float): Longitude of the bottom right point. - lat1(float): Latitude of the bottom right point. - - Returns: - MapGraphicsLineItem added to the scene. - """ - item = MapGraphicsRectItem(lon0, lat0, lon1, lat1) - self.addItem(item) - return item - - def addPolyline(self, longitudes, latitudes): - """Add a new circle (point) to the graphics scene. - - Args: - longitudes(iterable): Longitudes of all the points of the polyline. - latitudes(iterable): Latitudes of all the points of the polyline. - - Returns: - MapGraphicsPolylineItem added to the scene. - """ - item = MapGraphicsPolylineItem(longitudes, latitudes) - self.addItem(item) - return item - - def addPixmap(self, longitude, latitude, pixmap): - """Add a new circle (point) to the graphics scene. - - Args: - longitude(float): Longitude of the origin of the pixmap. - latitude(float): Latitude of the center of the pixmap. - pixmap(QPixmap): Pixmap. - - Returns: - MapGraphicsPixmapItem added to the scene. - - Note: - Use `MapGraphicsPixmapItem.setOffset(off)` to translate by `off` pixels - the pixmap respect the origin coordinates. - """ - item = MapGraphicsPixmapItem(longitude, latitude, pixmap) - self.addItem(item) - return item - - def addText(self, longitude, latitude, text): - """Add a test item to the graphics scene. - - Args: - longitude(float): Longitude of the origin of the text - latitude(float): Latitude of the origin of the text - - Returns: - MapGraphicsTextItem added to the scene. - """ - item = MapGraphicsTextItem(longitude, latitude, text) - self.addItem(item) - return item - - def addNavItem(self, anchor): - self.nav_item = MapNavItem(anchor) - self.addItem(self.nav_item) - self.nav_item.zoom_in_button.clicked.connect(self.handleZoomIn) - self.nav_item.zoom_out_button.clicked.connect(self.handleZoomOut) - return self.nav_item - - - def addLegend(self, pos=QPointF(10.0, 10.0)): - legend = MapLegendItem(pos=pos) - self.addItem(legend) - return legend - - def addScale(self, **kwargs): - """Add a scale bar with text on the right bottom of the map - - Keyword Args: - textPen: QPen to use for drawing the text. Default 'black'. - barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) - barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) - barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. - Default (110, 110, 110, 255). - barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. - Default (90, 90, 90, 255). - - Note: - Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() - are accepted. - """ - scaleItem = MapScaleItem(**kwargs) - self.addItem(scaleItem) - return scaleItem - - def addLinesGroup(self, longitudes, latitudes): - item = MapGraphicsLinesGroupItem(longitudes, latitudes) - self.addItem(item) - return item diff --git a/pytilemap/maptilesources/__init__.py b/pytilemap/maptilesources/__init__.py deleted file mode 100644 index b54daaf..0000000 --- a/pytilemap/maptilesources/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import print_function, absolute_import - -from .maptilesource import MapTileSource -from .maptilesourcehere import MapTileSourceHere, MapTileSourceHereDemo -from .maptilesourceosm import MapTileSourceOSM -from .maptilesourcehttp import MapTileSourceHTTP \ No newline at end of file diff --git a/pytilemap/maptilesources/maptilesource.py b/pytilemap/maptilesources/maptilesource.py deleted file mode 100644 index 92b3db9..0000000 --- a/pytilemap/maptilesources/maptilesource.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Signal, Slot, QObject -from qtpy.QtGui import QPixmap - - -class MapTileSource(QObject): - - tileReceived = Signal(int, int, int, QPixmap) - - _tileSize = None - _minZoom = None - _maxZoom = None - - def __init__(self, tileSize=256, minZoom=2, maxZoom=18, parent=None): - QObject.__init__(self, parent=parent) - self._tileSize = tileSize - self._minZoom = minZoom - self._maxZoom = maxZoom - - def tileSize(self): - return self._tileSize - - def maxZoom(self): - return self._maxZoom - - def minZoom(self): - return self._minZoom - - def requestTile(self, x, y, zoom): - raise NotImplementedError() - - @Slot() - def abortAllRequests(self): - pass - - @Slot() - def close(self): - pass diff --git a/pytilemap/maptilesources/maptilesourcehere.py b/pytilemap/maptilesources/maptilesourcehere.py deleted file mode 100644 index 62c5ffa..0000000 --- a/pytilemap/maptilesources/maptilesourcehere.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import print_function, absolute_import - -from .maptilesourcehttp import MapTileSourceHTTP - - -class MapTileSourceHereDemo(MapTileSourceHTTP): - - _server = None - - def __init__(self, tileSize=256, parent=None): - MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=2, maxZoom=20, parent=parent) - assert tileSize == 256 or tileSize == 512 - self._server = 0 - - def url(self, x, y, zoom): - self._server += 1 - if self._server > 4: - self._server = 0 - url = "http://%d.base.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server - url += "newest/normal.day/%d/%d/%d/%d/png8" % (zoom, x, y, self._tileSize) - url += '?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg' - return url - - -class MapTileSourceHere(MapTileSourceHTTP): - - def __init__(self, tileSize=256, app_id='DemoAppId01082013GAL', app_code='AJKnXv84fjrb0KIHawS0Tg', - scheme='normal.day', cit=True, tileType='maptile', mapType='base', imageFmt='png8', - userAgent='(PyQt) TileMap 1.0 - HERE', mapHttpLoader=None, - minZoom=2, maxZoom=20, parent=None): - MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, - mapHttpLoader=mapHttpLoader, parent=parent) - assert tileSize == 256 or tileSize == 512 - self._server = 0 - - self._app_id = app_id - self._app_code = app_code - - self._mapType = mapType - self._tileType = tileType - self._scheme = scheme - self._cit = '.cit' if cit else '' - self._imageFmt = imageFmt - - self._buildBaseUrl() - - def _buildBaseUrl(self): - url = 'http://%d.' + self._mapType + '.maps' + self._cit + '.api.here.com' - url += '/maptile/2.1/' + self._tileType + '/newest/' + self._scheme + \ - '/%d/%d/%d/' + str(self._tileSize) + '/' + self._imageFmt - url += '?app_id=%s&app_code=%s' % (self._app_id, self._app_code) - self._baseurl = url - - def setOptions(self, scheme=None, tileType=None, mapType=None): - if mapType is not None: - self._mapType = mapType - if tileType is not None: - self._tileType = tileType - if scheme is not None: - self._scheme = scheme - - self._buildBaseUrl() - - def url(self, x, y, zoom): - self._server += 1 - if self._server > 4: - self._server = 0 - - args = (self._server, zoom, x, y) - url = self._baseurl % args - return url diff --git a/pytilemap/maptilesources/maptilesourcehttp.py b/pytilemap/maptilesources/maptilesourcehttp.py deleted file mode 100644 index 4cb47ca..0000000 --- a/pytilemap/maptilesources/maptilesourcehttp.py +++ /dev/null @@ -1,116 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Signal, Slot, QObject, QByteArray, QUrl, QThread -from qtpy.QtGui import QPixmap -from qtpy.QtNetwork import QNetworkRequest, QNetworkDiskCache, QNetworkAccessManager, \ - QNetworkReply - -from .maptilesource import MapTileSource -from ..qtsupport import getQVariantValue, getCacheFolder - -DEFAULT_CACHE_SIZE = 1024 * 1024 * 100 - - -class MapTileHTTPLoader(QObject): - - tileLoaded = Signal(int, int, int, QByteArray) - - def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', parent=None): - QObject.__init__(self, parent=parent) - self._manager = None - self._cache = None - self._cacheSize = cacheSize - - try: - # Convert user agent to bytes - userAgent = userAgent.encode() - except: - # no encode method exists. This hsould be the Python 2 case - pass - - self._userAgent = userAgent - self._tileInDownload = dict() - - @Slot(int, int, int, str) - def loadTile(self, x, y, zoom, url): - if self._manager is None: - self._manager = QNetworkAccessManager(parent=self) - self._manager.finished.connect(self.handleNetworkData) - cache = QNetworkDiskCache() - cacheDir = getCacheFolder() - cache.setCacheDirectory(cacheDir) - cache.setMaximumCacheSize(self._cacheSize) - self._manager.setCache(cache) - - key = (x, y, zoom) - url = QUrl(url) - if key not in self._tileInDownload: - # Request the image to the map service - request = QNetworkRequest(url=url) - request.setRawHeader(b'User-Agent', self._userAgent) - request.setAttribute(QNetworkRequest.User, key) - request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) - self._tileInDownload[key] = self._manager.get(request) - - @Slot(QNetworkReply) - def handleNetworkData(self, reply): - tp = getQVariantValue(reply.request().attribute(QNetworkRequest.User)) - if tp in self._tileInDownload: - del self._tileInDownload[tp] - - if not reply.error(): - data = reply.readAll() - self.tileLoaded.emit(tp[0], tp[1], tp[2], data) - reply.close() - reply.deleteLater() - - @Slot() - def abortRequest(self, x, y, zoom): - p = (x, y, zoom) - if p in self._tileInDownload: - reply = self._tileInDownload[p] - del self._tileInDownload[p] - reply.close() - reply.deleteLater() - - @Slot() - def abortAllRequests(self): - for x, y, zoom in list(self._tileInDownload.keys()): - self.abortRequest(x, y, zoom) - - -class MapTileSourceHTTP(MapTileSource): - - def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', - tileSize=256, minZoom=2, maxZoom=18, mapHttpLoader=None, parent=None): - MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) - - if mapHttpLoader is not None: - self._loader = mapHttpLoader - else: - self._loader = MapTileHTTPLoader(cacheSize=cacheSize, userAgent=userAgent) - - self._loader.tileLoaded.connect(self.handleTileDataLoaded) - - @Slot() - def close(self): - self._loader.abortAllRequests() - - def url(self, x, y, zoom): - raise NotImplementedError() - - def requestTile(self, x, y, zoom): - url = self.url(x, y, zoom) - self._loader.loadTile(x, y, zoom, url) - - @Slot(int, int, int, QByteArray) - def handleTileDataLoaded(self, x, y, zoom, data): - pix = QPixmap() - pix.loadFromData(data) - self.tileReceived.emit(x, y, zoom, pix) - - def abortAllRequests(self): - self._loader.abortAllRequests() - - def imageFormat(self): - return 'PNG' diff --git a/pytilemap/maptilesources/maptilesourcelocal.py b/pytilemap/maptilesources/maptilesourcelocal.py deleted file mode 100644 index ced639f..0000000 --- a/pytilemap/maptilesources/maptilesourcelocal.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import print_function, absolute_import - -import os - -from qtpy.QtGui import QPixmap - -from .maptilesource import MapTileSource - - -class MapTileSourceDirectory(MapTileSource): - - _directory = None - _fnameSuffix = None - - def __init__(self, directory, filenameSuffix='.png', tileSize=256, minZoom=2, maxZoom=18, parent=None): - MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) - self._directory = directory - self._fnameSuffix = filenameSuffix - - def tileSize(self): - return self._tileSize - - def maxZoom(self): - return self._maxZoom - - def minZoom(self): - return self._minZoom - - def requestTile(self, x, y, zoom): - filename = os.path.join(self._directory, str(zoom), str(x), str(y)+self._fnameSuffix) - if os.path.exists(filename): - return QPixmap(filename) - return None diff --git a/pytilemap/maptilesources/maptilesourceosm.py b/pytilemap/maptilesources/maptilesourceosm.py deleted file mode 100644 index 72d6c4a..0000000 --- a/pytilemap/maptilesources/maptilesourceosm.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import print_function, absolute_import - -from .maptilesourcehttp import MapTileSourceHTTP - - -class MapTileSourceOSM(MapTileSourceHTTP): - - def __init__(self, parent=None): - MapTileSourceHTTP.__init__(self, parent=parent) - - def url(self, x, y, zoom): - url = "http://tile.openstreetmap.org/%d/%d/%d.png" % (zoom, x, y) - return url diff --git a/pytilemap/mapview.py b/pytilemap/mapview.py deleted file mode 100644 index 27dc50b..0000000 --- a/pytilemap/mapview.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import print_function, absolute_import - -from qtpy.QtCore import Qt, Slot -from qtpy.QtWidgets import QGraphicsView - -from .mapscene import MapGraphicsScene -from .maptilesources.maptilesourceosm import MapTileSourceOSM -from .qtsupport import wheelAngleDelta - - -class MapGraphicsView(QGraphicsView): - """Graphics view for showing a slippy map. - """ - - def __init__(self, tileSource=None, parent=None): - """Constructor. - - Args: - tileSource(MapTileSource): Source for the tiles, default `MapTileSourceOSM`. - parent(QObject): Parent object, default `None` - """ - QGraphicsView.__init__(self, parent=parent) - if tileSource is None: - tileSource = MapTileSourceOSM() - scene = MapGraphicsScene(tileSource) - self.setScene(scene) - self._lastMousePos = None - - @Slot() - def close(self): - self.scene().close() - QGraphicsView.close(self) - - def resizeEvent(self, event): - """Resize the widget. Reimplemented from `QGraphicsView`. - - Resize the `MapGraphicsScene`. - - Args: - event(QResizeEvent): Resize event. - """ - QGraphicsView.resizeEvent(self, event) - size = event.size() - self.scene().setSize(size.width(), size.height()) - - def mousePressEvent(self, event): - """Manage the mouse pressing. - - Args: - event(QMouseEvent): Mouse event. - """ - QGraphicsView.mousePressEvent(self, event) - if event.buttons() == Qt.LeftButton: - self._lastMousePos = event.pos() - - def mouseMoveEvent(self, event): - """Manage the mouse movement while it is pressed. - - Args: - event(QMouseEvent): Mouse event. - """ - QGraphicsView.mouseMoveEvent(self, event) - if event.buttons() == Qt.LeftButton: - delta = self._lastMousePos - event.pos() - self._lastMousePos = event.pos() - self.scene().translate(delta.x(), delta.y()) - - def mouseReleaseEvent(self, event): - """Manage the mouse releasing. - - Args: - event(QMouseEvent): Mouse event. - """ - QGraphicsView.mouseReleaseEvent(self, event) - - def wheelEvent(self, event): - """Manage the mouse wheel rotation. - - Change the zoom on the map. If the delta is positive, zoom in, if the - delta is negative, zoom out. - - Args: - event(QWheelEvent): Mouse wheel event. - """ - event.accept() - delta = wheelAngleDelta(event) - if delta > 0: - self.scene().zoomIn(event.pos()) - elif delta < 0: - self.scene().zoomOut(event.pos()) diff --git a/pytilemap/qtsupport.py b/pytilemap/qtsupport.py deleted file mode 100644 index f83767e..0000000 --- a/pytilemap/qtsupport.py +++ /dev/null @@ -1,48 +0,0 @@ - -import sys -import sip - -import qtpy - - -__all__ = [ - 'getQVariantValue', - 'wheelAngleDelta', -] - - -try: - if qtpy.PYQT5: - QVARIANT_API = 2 - else: - QVARIANT_API = sip.getapi('QVariant') -except ValueError: - QVARIANT_API = 1 - - -if QVARIANT_API == 1: - def getQVariantValue(variant): - return variant.toPyObject() -else: - def getQVariantValue(variant): - return variant - -if qtpy.PYQT5: - def wheelAngleDelta(wheelEvent): - return wheelEvent.angleDelta().y() -else: - def wheelAngleDelta(wheelEvent): - return wheelEvent.delta() - - -if qtpy.PYQT5: - from qtpy.QtCore import QStandardPaths - - def getCacheFolder(): - return QStandardPaths.writableLocation(QStandardPaths.CacheLocation) - -else: - from qtpy.QtGui import QDesktopServices - - def getCacheFolder(): - return QDesktopServices.storageLocation(QDesktopServices.CacheLocation) diff --git a/pytilemap/tileutils.py b/pytilemap/tileutils.py deleted file mode 100644 index e6938e2..0000000 --- a/pytilemap/tileutils.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import division - -import numpy as np -from numpy import log, tan, cos, arctan, exp -from numpy import pi as PI - - -Deg2Rad = PI / 180.0 -PI2 = PI * 2.0 - - -def posFromLonLat(lon, lat, zoom, tileSize): - """Position in scene coordinate of the WGS84 coordinates. - - Convert from WGS84 reference system to scene reference system. - - Args: - lon(float or numpy.ndarray): Longitude value or values. - lat(float or numpy.ndarray): Latitude value or values. - zoom(int): The zoom level. - tileSize(int): The size of the tile. - - Returns: - tuple: (x, y) with the positions of the input coordinates. - """ - if isinstance(lat, np.ndarray): - return _posFromLonLatArray(lon, lat, zoom, tileSize) - - tx = lon + 180.0 - tx /= 360.0 - ty = (1.0 - log(tan(lat * Deg2Rad) + 1.0 / cos(lat * Deg2Rad)) / PI) / 2.0 - zn = (1 << zoom) * float(tileSize) - tx *= zn - ty *= zn - return tx, ty - - -def _posFromLonLatArray(lon, lat, zoom, tileSize): - # Optimized implementation of posFromLonLat() function for numpy arrays - tx = lon + 180.0 - tx /= 360.0 - - tmp = lat * Deg2Rad - ty = cos(tmp) - np.divide(1.0, ty, out=ty) - tan(tmp, out=tmp) - ty += tmp - log(ty, out=ty) - ty /= PI - np.subtract(1.0, ty, out=ty) - ty /= 2.0 - - zn = (1 << zoom) * float(tileSize) - tx *= zn - ty *= zn - return tx, ty - - -def lonLatFromPos(x, y, zoom, tileSize): - """Position in WGS84 coordinate of the scene coordinates. - - Convert from scene reference system to WGS84 reference system. - - Args: - x(float, int or numpy.ndarray): X value or values. - y(float, int or numpy.ndarray): Y value or values. - zoom(int): The zoom level. - tileSize(int): The size of the tile. - - Returns: - tuple: (lon, lat) with the coordinates of the input positions. - """ - if isinstance(y, np.ndarray): - return _lonLatFromPosArray(x, y, zoom, tileSize) - - tx = x / tileSize - ty = y / tileSize - zn = 1 << zoom - lon = tx / zn * 360.0 - 180.0 - n = PI - PI2 * ty / zn - lat = arctan(0.5 * (exp(n) - exp(-n))) / Deg2Rad - return lon, lat - - -def _lonLatFromPosArray(x, y, zoom, tileSize): - # Optimized implementation of posFromLonLat() function for numpy arrays - zn = 1 << zoom - - lon = x / tileSize - lon /= zn - lon *= 360 - lon -= 180 - - lat = y / tileSize - lat *= -PI2 / zn - lat += PI - tmp = lat * -1.0 - exp(lat, out=lat) - exp(tmp, out=tmp) - lat -= tmp - lat *= 0.5 - arctan(lat, out=lat) - lat /= Deg2Rad - - return lon, lat diff --git a/pytilemap/zoom_in_symbol.png b/pytilemap/zoom_in_symbol.png deleted file mode 100644 index 6787135d2006942484c9cd269deba64e2fa0e34d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmV+|0@D47P)WFU8GbZ8()Nlj2>E@cM*00EUrL_t(o!|j(rO2a@DhQCSD zv=P&aluD_KLKlL25!~t-+_-S-F+75&@EWeXfJ+e(3N2_YsZiUdCUG;`q{Wy{5>Uu{ zn+(kS|IGXUyh)&lBC?Ki4!I^!%pPZ)#1mX7gMZ~|Ji%RRf}1FySRx2AD02i;%Ujg{ zPhhMyyB~UPW=~M3j17Rp3!Z}FzqqK*hyY)%^Rjo5%@!U3`_!oBBl0U91YMk@1zO)l zj|99W-@l4YTOg%QEpnd&hD-t2V2qB3pvnXd7n=$uf&msI<}sK{1dE(e1$22*O)eG^ zKt#+QUYEE;bK2-qPG8z{0TG0DEL1i4h(GQ(h9W@;FcT51VU_6RQKk{9b_Fo7R^SaZ zdOvAk#I`nr8Z~B&nP4$O;N!_XZ!)C}K!YdMUeu3_I!p;LaS=4RrJWEnrbN+fArP4C z0DCd>l;7lcGy+^~bh>$5IKDjm0E&0N;E!;)FaAV}$TmI!60zQ)9pwj000000NkvXXu0mjfOy1XA diff --git a/pytilemap/zoom_out_symbol.png b/pytilemap/zoom_out_symbol.png deleted file mode 100644 index c49ba6af241054476af96343d52237b8f51a39e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+`=Ht$S`Y;1W=H@#M9T6{UH}Wv$~YpzxifBA=%83h!W@g+}zZ>5+Ij>!MP|ku_QG` zp**uBL&4qCHy}kXm7Rfsk=xV7F(l&f+v(PRhaE&*`(|QNT*pB9^wDY|;GW4At%kP@xn?$R_umU))o@_^&rr~^b%tCJ?ff#Zvvj`_3R202oF2_ zO?{T!Os;?irf-4;w{I6_`mJ{SeMbRI0w}yZUHx3v IIVCg!01@7wTL1t6 From 328e8a789884c43954b2ab440bd3f7398bd06680 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 25 Jan 2018 13:15:31 -0500 Subject: [PATCH 06/31] Revert "pytilemap commit did not go well" This reverts commit 46e5476a8743c76b1714c41d07642e60ea7970dd. --- pytilemap/__init__.py | 34 ++ pytilemap/functions.py | 181 +++++++ pytilemap/imagebutton.py | 39 ++ pytilemap/mapescaleitem.py | 268 ++++++++++ pytilemap/mapitems.py | 409 +++++++++++++++ pytilemap/maplegenditem.py | 151 ++++++ pytilemap/mapnavitem.py | 150 ++++++ pytilemap/mapscene.py | 478 ++++++++++++++++++ pytilemap/maptilesources/__init__.py | 6 + pytilemap/maptilesources/maptilesource.py | 39 ++ pytilemap/maptilesources/maptilesourcehere.py | 71 +++ pytilemap/maptilesources/maptilesourcehttp.py | 116 +++++ .../maptilesources/maptilesourcelocal.py | 33 ++ pytilemap/maptilesources/maptilesourceosm.py | 13 + pytilemap/mapview.py | 90 ++++ pytilemap/qtsupport.py | 48 ++ pytilemap/tileutils.py | 105 ++++ pytilemap/zoom_in_symbol.png | Bin 0 -> 557 bytes pytilemap/zoom_out_symbol.png | Bin 0 -> 419 bytes 19 files changed, 2231 insertions(+) create mode 100644 pytilemap/__init__.py create mode 100644 pytilemap/functions.py create mode 100644 pytilemap/imagebutton.py create mode 100644 pytilemap/mapescaleitem.py create mode 100644 pytilemap/mapitems.py create mode 100644 pytilemap/maplegenditem.py create mode 100644 pytilemap/mapnavitem.py create mode 100644 pytilemap/mapscene.py create mode 100644 pytilemap/maptilesources/__init__.py create mode 100644 pytilemap/maptilesources/maptilesource.py create mode 100644 pytilemap/maptilesources/maptilesourcehere.py create mode 100644 pytilemap/maptilesources/maptilesourcehttp.py create mode 100644 pytilemap/maptilesources/maptilesourcelocal.py create mode 100644 pytilemap/maptilesources/maptilesourceosm.py create mode 100644 pytilemap/mapview.py create mode 100644 pytilemap/qtsupport.py create mode 100644 pytilemap/tileutils.py create mode 100644 pytilemap/zoom_in_symbol.png create mode 100644 pytilemap/zoom_out_symbol.png diff --git a/pytilemap/__init__.py b/pytilemap/__init__.py new file mode 100644 index 0000000..2e09070 --- /dev/null +++ b/pytilemap/__init__.py @@ -0,0 +1,34 @@ +from __future__ import print_function, absolute_import + +from .mapscene import MapGraphicsScene +from .mapview import MapGraphicsView +from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ + MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ + MapGraphicsRectItem +from .maplegenditem import MapLegendItem +from .mapescaleitem import MapScaleItem +from .maptilesources import MapTileSource, MapTileSourceHere, MapTileSourceHereDemo, \ + MapTileSourceOSM, MapTileSourceHTTP +from .mapnavitem import MapNavItem + + +__all__ = [ + 'MapGraphicsScene', + 'MapGraphicsView', + 'MapGraphicsCircleItem', + 'MapGraphicsLineItem', + 'MapGraphicsPolylineItem', + 'MapGraphicsPixmapItem', + 'MapGraphicsTextItem', + 'MapGraphicsRectItem', + 'MapLegendItem', + 'MapTileSource', + 'MapTileSourceHere', + 'MapTileSourceHereDemo', + 'MapTileSourceOSM', + 'MapTileSourceHTTP', + "MapNavItem", + "ImageButton" +] + +__version__ = '1.0.0' diff --git a/pytilemap/functions.py b/pytilemap/functions.py new file mode 100644 index 0000000..c97f992 --- /dev/null +++ b/pytilemap/functions.py @@ -0,0 +1,181 @@ +import sys +import sip +import numpy as np + +from qtpy.QtCore import Qt +from qtpy.QtGui import QColor, QBrush, QPen + +SolidLine = Qt.SolidLine +SolidPattern = Qt.SolidPattern +SquareCap = Qt.SquareCap +BevelJoin = Qt.BevelJoin + + +__all__ = [ + 'iterRange', + 'makeColorFromInts', + 'makeColorFromFloats', + 'makeColorFromStr', + 'makeColorFromNdArray', + 'makeColorFromList', + 'makeColor', + 'makeBrush', + 'makePen', + 'clip', +] + +PYTHON_VERSION = sys.version_info[0] + +if PYTHON_VERSION == 2: + iterRange = xrange + import itertools + izip = itertools.izip +else: + iterRange = range + izip = zip + + +def makeColorFromInts(ints): + """Create a color from list or tuple of integers + + Args: + ints (tuple[int]): Integers [0, 255] values for the color. May be 3 or 4 for the alpha color. + + Retuns: + QColor: color + """ + r = ints[0] + g = ints[1] + b = ints[2] + a = ints[3] if len(ints) == 4 else 255 + return QColor(r, g, b, a) + + +def makeColorFromFloats(floats): + """Create a color from list or tuple of floats + + Args: + floats (tuple[float]): Float [0.0, 1.0] values for the color. May be 3 or 4 for the alpha color. + + Retuns: + QColor: color + """ + r = int(floats[0] * 255.0) + g = int(floats[1] * 255.0) + b = int(floats[2] * 255.0) + a = int(floats[3] * 255.0) if len(floats) == 4 else 255 + return QColor(r, g, b, a) + + +def makeColorFromStr(name): + """Create a color from a string + + Args: + name (str): name or html string of the color + + Retuns: + QColor: color + """ + return QColor(name) + + +def makeColorFromNdArray(array): + """Create a list of colors from a numpy array + + Args: + array (numpy.ndarray): (Nx3) or (Nx4) numpy array with number in range [0, 255] or [0.0, 1.0] + + Retuns: + list[QColor]: List of colors + """ + if array.dtype in [np.float32, np.float64]: + array = np.asarray(array * 255.0, dtype=np.int32) + + return [makeColorFromInts(row) for row in array] + + +def makeColorFromList(colorList): + """Create a list of colors from a list, tuple or numpy array + + Args: + colorList (list,tuplenumpy.ndarray): List, tuple or numpy array. The elements must have length of 3 or 4 + and the numbers must be in range [0, 255] or [0.0, 1.0] + + Retuns: + list[QColor]: List of colors + """ + colors = list() + if len(colorList) == 0: + return colors + + element = colorList[0][0] + if isinstance(element, (float, np.floating)): + makeFunction = makeColorFromFloats + elif isinstance(element, (int, np.integer)): + makeFunction = makeColorFromInts + elif isinstance(element, str): + makeFunction = makeColorFromStr + else: + makeFunction = QColor + + return [makeFunction(row) for row in colorList] + + +def makeColor(args): + """Convenience function for creating a QColor or a list of QColors. + + Args: + args: Argument for creating QColor[s] + + Return: + list[QColor],QColor: Created QColor[s]. + + See: + :func:`makeColorFromInts` + :func:`makeColorFromFloats` + :func:`makeColorFromStr` + :func:`makeColorFromNdArray` + :func:`makeColorFromList` + """ + makeFunction = QColor + if isinstance(args, str): + makeFunction = makeColorFromStr + elif isinstance(args, tuple): + if isinstance(args[0], int): + makeFunction = makeColorFromInts + else: + makeFunction = makeColorFromFloats + elif isinstance(args, np.ndarray): + makeFunction = makeColorFromNdArray + elif isinstance(args, list): + makeFunction = makeColorFromList + + return makeFunction(args) + + +def makeBrush(color, style=SolidPattern): + if color is None: + return QBrush(Qt.NoBrush) + if isinstance(color, QBrush): + return QBrush(color) + color = makeColor(color) + if isinstance(color, list): + return [QBrush(c, style) for c in color] + return QBrush(color, style) + + +def makePen(color, width=1.0, style=SolidLine, cap=SquareCap, join=BevelJoin): + if color is None: + return QPen(Qt.NoPen) + if isinstance(color, QPen): + return QPen(color) + brush = makeBrush(color) + if isinstance(brush, list): + if not hasattr(width, '__iter__'): + width = np.full(len(brush), width, dtype=np.float64) + return [QPen(b, w, style=style) for b, w in izip(brush, width)] + return QPen(brush, width, style=style, cap=cap, join=join) + + +def clip(value, minValue, maxValue): + return min(maxValue, max(minValue, value)) diff --git a/pytilemap/imagebutton.py b/pytilemap/imagebutton.py new file mode 100644 index 0000000..ffd1803 --- /dev/null +++ b/pytilemap/imagebutton.py @@ -0,0 +1,39 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Signal +from qtpy.QtWidgets import QGraphicsObject, QGraphicsItemGroup, QGraphicsPixmapItem + +class ImageButton(QGraphicsObject): + ''' + Custom Image Holder Class that Allows for event handling - + - QGraphicsPixmapItem is not a QObject, so cannot catch events. + ''' + QtParentClass = QGraphicsObject + + clicked = Signal(int) + + def __init__(self, img, parent=None): + ''' + Args: + img: A QPixmap instance + + Keyword Args: + parent: A pyqt window instance + ''' + QGraphicsObject.__init__(self, parent=parent) + self.image = QGraphicsPixmapItem(img, parent=self) + self.parent = parent + + def paint(self, painter, option, widget): + self.image.paint(painter,option,widget) + + def boundingRect(self): + return self.image.boundingRect() + + def mouseReleaseEvent(self, event): + self.clicked.emit(1) + + def mousePressEvent(self, event): + pass +# end ImageButton + diff --git a/pytilemap/mapescaleitem.py b/pytilemap/mapescaleitem.py new file mode 100644 index 0000000..eb982c4 --- /dev/null +++ b/pytilemap/mapescaleitem.py @@ -0,0 +1,268 @@ +import numpy as np + +from qtpy.QtCore import Qt, Slot, QPointF, QRectF +from qtpy.QtGui import QFontMetrics, QFont +from qtpy.QtWidgets import QGraphicsObject + + +from .mapitems import MapItem +from .functions import makePen, makeBrush, clip +from .qtsupport import getQVariantValue + + +class MapScaleItem(QGraphicsObject, MapItem): + """Scale bar for the visualization of the scale of teh map. + + The scale bar is located on the bottom right of the map and can' be moved. + The scale bar accepts hover events and change its color. + """ + + QtParentClass = QGraphicsObject + + EarthCircumference = 1000.0 * 6372.7982 * 2.0 * np.pi + DegToRad = np.pi / 180.0 + + _defaultScaleVisualization = { + 21: 5, + 20: 10, + 19: 20, + 18: 20, + 17: 50, + 16: 100, + 15: 200, + 14: 500, + 13: 1 * 1000, + 12: 2 * 1000, + 11: 5 * 1000, + 10: 10 * 1000, + 9: 20 * 1000, + 8: 50 * 1000, + 7: 100 * 1000, + 6: 200 * 1000, + 5: 200 * 1000, + 4: 500 * 1000, + 3: 1000 * 1000, + } + """dict: Default meters that will be shown within the scale for each zoom value. + """ + + _posForAnchors = { + Qt.TopLeftCorner: QPointF(20.0, 15.0), + Qt.TopRightCorner: QPointF(20.0, -15.0), + Qt.BottomLeftCorner: QPointF(20.0, -15.0), + Qt.BottomRightCorner: QPointF(20.0, 15.0), + } + + def __init__(self, textPen='black', barBrush=(190, 190, 190, 160), barPen=(190, 190, 190, 240), + barBrushHover=(110, 110, 110, 255), barPenHover=(90, 90, 90, 255), + anchor=Qt.BottomRightCorner, anchorPos=None, parent=None): + """Construct a scale bar with text on the right bottom of the map + + Keyword Args: + textPen: QPen to use for drawing the text. Default 'black'. + barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) + barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) + barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. + Default (110, 110, 110, 255). + barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. + Default (90, 90, 90, 255). + parent: Parent item + anchor (Qt.Corner): The *corner* used as anchor for the item, Valid values are within the + Qt.Corner enum + anchorPos (QPointF): The distance between the item and the *corner* + + Note: + Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() + are accepted. + """ + QGraphicsObject.__init__(self, parent=parent) + MapItem.__init__(self) + + self.setZValue(100) + + self._textPen = makePen(textPen) + self._barBrush = makeBrush(barBrush) + self._barPen = makePen(barPen) + self._barBrushHover = makeBrush(barBrushHover) + self._barPenHover = makePen(barPenHover) + + self._scaleView = MapScaleItem._defaultScaleVisualization.copy() + self._minZoomScale = min(self._scaleView.keys()) + self._maxZoomScale = max(self._scaleView.keys()) + + self.setAcceptHoverEvents(True) + self._hover = False + + if anchorPos is None: + anchorPos = self._posForAnchors[anchor] + self._anchorPos = QPointF(anchorPos) + self._anchor = anchor + + self._barWidth = 0 # The width of the scale bar + self._text = '' # The text to display near the scale bar + self._zoom = 0 # The current zoom level + self._meters = 0 # The number of meters used to evaluate the size of the scale bar and its text + self._meterPerPixelsEquator = 0 # The number of meters each pixel represents at the equator + self._textRect = QRectF() # The bounding rect of text + + def _sceneChanged(self, oldScene, newScene): + if oldScene is not None: + oldScene.sceneRectChanged.disconnect(self._setSceneRect) + if newScene is not None: + newScene.sceneRectChanged.connect(self._setSceneRect) + # Setup the new position of the item + self.setZoom(newScene.zoom()) + self._setSceneRect(newScene.sceneRect()) + + def updatePosition(self, scene): + # Nothing to do here + pass + + def boundingRect(self): + anchor = self._anchor + if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: + return QRectF(0, 0, self._barWidth + 3, 10).united(self._textRect) + else: + textRect = self._textRect.translated(self._barWidth + 10, 0) + return QRectF(0, 0, self._barWidth + 3, 10).united(textRect) + + def paint(self, painter, option, widget): + if self._hover: + painter.setPen(self._barPenHover) + painter.setBrush(self._barBrushHover) + else: + painter.setPen(self._barPen) + painter.setBrush(self._barBrush) + painter.drawRoundedRect(0, 0, self._barWidth, 10, 3, 3) + + anchor = self._anchor + if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: + textRect = self._textRect + else: + textRect = self._textRect.translated(self._barWidth + 10, 0) + painter.setPen(self._textPen) + painter.drawText(textRect, Qt.TextSingleLine, self._text) + + @Slot(QRectF) + def _setSceneRect(self, rect): + self._updateScaleBar() + + anchorPos = self._anchorPos + anchor = self._anchor + newPos = None + if anchor == Qt.BottomRightCorner: + newPos = rect.bottomRight() - anchorPos - QPointF(self._barWidth, 0.0) + elif anchor == Qt.TopRightCorner: + newPos = rect.topRight() - anchorPos - QPointF(self._barWidth, 0.0) + elif anchor == Qt.TopLeftCorner: + newPos = rect.topLeft() + anchorPos + elif anchor == Qt.BottomLeftCorner: + newPos = rect.bottomLeft() + anchorPos + else: + raise NotImplementedError('Other corner have not actually been implemented') + + self.setPos(newPos) + + def _updateScaleBar(self): + scene = self.scene() + if scene is None: + self.setVisible(False) + return + self.setVisible(True) + + centerYRad = scene.center().y() * self.DegToRad + meterPerPixels = self._meterPerPixelsEquator * np.cos(centerYRad) + self._barWidth = int(self._meters / meterPerPixels) + + def setZoom(self, zoom): + '''Set a new zoom level. + Args: + zoom (int): The new zoom level. + ''' + self._zoom = zoom + zoomSelector = clip(zoom, self._minZoomScale, self._maxZoomScale) + meters = self._scaleView[zoomSelector] + if meters >= 1000: + self._text = '%d km' % (meters / 1000.0) + else: + self._text = '%d m' % meters + self._meters = meters + self._meterPerPixelsEquator = self.EarthCircumference / np.power(2.0, zoom + 8) + + # Evaluate the bounding box of the current text + anchor = self._anchor + textRect = QFontMetrics(QFont()).boundingRect(self._text) + if anchor == Qt.BottomRightCorner or anchor == Qt.TopRightCorner: + textRect.moveLeft(-textRect.width() - 10) + textRect.moveTop(-textRect.height() + 10) + else: + textRect.moveTop(-textRect.height() + 14) + self._textRect = QRectF(textRect) + self.update() + + def setScaleForZoom(self, zoomLevel, metersInScaleBar): + """Set the scale in meters/kilometers to be shown for a zoom level + + Args: + zoomLevel(int): Level of the zoom + metersInScaleBar(int): Meters to be shown in the scale bar + """ + if zoomLevel > self._maxZoomScale + 1: + raise ValueError('zoomLevel must be at least %d' % (self._maxZoomScale + 1)) + if zoomLevel < self._minZoomScale - 1: + raise ValueError('zoomLevel must be at minimum %d' % (self._minZoomScale + 1)) + + self._scaleView[zoomLevel] = metersInScaleBar + self._minZoomScale = min(self._scaleView.keys()) + self._maxZoomScale = max(self._scaleView.keys()) + + # Re-evaluate the scale bar for the current zoom + self.setZoom(self._zoom) + + self.update() + + def restoreDefaultScaleLevels(self): + """Restore the default meter scale for the zoom levels + """ + self._scaleView = MapScaleItem._defaultScaleVisualization.copy() + self._minZoomScale = min(self._scaleView.keys()) + self._maxZoomScale = max(self._scaleView.keys()) + + # Re-evaluate the scale bar for the current zoom + self.setZoom(self._zoom) + + self.update() + + def setColors(self, **kwargs): + """Set a new color for the scale bar and the text + + Keyword Args: + textPen: QPen to use for drawing the text. Default do not change. + barBrush: QBrush to use for drawing the scale bar. Default do not change. + barPen: QPen to use for drawing the scale bar border.Default do not change. + barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. + Default do not change. + barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. + Default do not change. + """ + if 'textPen' in kwargs: + self._textPen = makePen(kwargs['textPen']) + if 'barBrush' in kwargs: + self._barBrush = makeBrush(kwargs['barBrush']) + if 'barPen' in kwargs: + self._barPen = makePen(kwargs['barPen']) + if 'barBrushHover' in kwargs: + self._barBrushHover = makeBrush(kwargs['barBrushHover']) + if 'barPenHover' in kwargs: + self._barPenHover = makePen(kwargs['barPenHover']) + self.update() + + def hoverEnterEvent(self, event): + event.accept() + self._hover = True + self.update() + + def hoverLeaveEvent(self, event): + event.accept() + self._hover = False + self.update() diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py new file mode 100644 index 0000000..581bda9 --- /dev/null +++ b/pytilemap/mapitems.py @@ -0,0 +1,409 @@ +from __future__ import print_function, absolute_import + +import numpy as np + +from qtpy.QtCore import Qt, QLineF, QPointF, QRectF +from qtpy.QtGui import QPainterPath +from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ + QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ + QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem + +from .functions import iterRange, makePen, izip +from .qtsupport import getQVariantValue + +SolidLine = Qt.SolidLine + + +class MapItem(object): + """Base class for each item in the MapGraphicScene + + The default implementation connects the MapGraphicScene.sigZoomChanged() signal + to the MapItem.setZoom() slot. This slot call the MapItem.updatePosition() method + for updating the position of the item in reaction to a change in the zoom level. + """ + + QtParentClass = None + + def __init__(self): + if not isinstance(self, QGraphicsItem): + raise RuntimeError('MapItem must be an instance of QGraphicsItem') + + def itemChange(self, change, value): + if change == self.ItemSceneChange: + # Disconnect the old scene, if any + oldScene = self.scene() + if oldScene is not None: + oldScene.sigZoomChanged.disconnect(self.setZoom) + # Connect the new scene, if any + newScene = getQVariantValue(value) + if newScene is not None: + newScene.sigZoomChanged.connect(self.setZoom) + + # Notify the item that the scene is changed + self._sceneChanged(oldScene, newScene) + + # Setup the new position of the item + if newScene is not None: + self.updatePosition(newScene) + + return self.QtParentClass.itemChange(self, change, value) + + def _sceneChanged(self, oldScene, newScene): + """Called when the current scene change. + + + This function can be reimplemented for notifying that the scene has changed. + The function is called when the scene has changed, just before the + :meth:`~updatePosition` method. + + Default + + Args: + oldScene (QGraphicsScene): The old scene, or ``None``. + newScene (QGraphicsScene): The new scene, or ``None``. + + Note: + :meth:`~scene` method is pointing to the ``oldScene``. + """ + pass + + def setZoom(self, zoom): + '''Set a new zoom level. + + Args: + zoom (int): The new zoom level. + ''' + scene = self.scene() + self.updatePosition(scene) + + def updatePosition(self, scene): + raise NotImplementedError() + + +class MapGraphicsCircleItem(QGraphicsEllipseItem, MapItem): + """Circle item for the MapGraphicsScene + """ + + QtParentClass = QGraphicsEllipseItem + + def __init__(self, longitude, latitude, radius, parent=None): + """Constructor. + + Args: + longitude(float): Longitude of the center of the circle. + latitude(float): Latitude of the center of the circle. + radius(float): Radius of the circle in pixels. + scene(MapGraphicsScene): Scene to which the circle belongs. + parent(QGraphicsItem): Parent item, default None. + + Note: + The management of the parent item is work in progress. + """ + QGraphicsEllipseItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon = longitude + self._lat = latitude + self._radius = radius + + def updatePosition(self, scene): + """Update the position of the circle. + + Args: + scene(MapGraphicsScene): Scene to which the circle belongs. + """ + pos = scene.posFromLonLat(self._lon, self._lat) + r = self._radius + d = r * 2 + self.prepareGeometryChange() + self.setRect(pos[0] - r, pos[1] - r, d, d) + + def setLonLat(self, longitude, latitude): + """Set the center coordinates of the circle. + + Args: + longitude(float): Longitude of the center of the circle. + latitude(float): Latitude of the center of the circle. + """ + self._lon = longitude + self._lat = latitude + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + def setRadius(self, radius): + self._radius = radius + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + +class MapGraphicsRectItem(QGraphicsRectItem, MapItem): + """Circle item for the MapGraphicsScene + """ + + QtParentClass = QGraphicsRectItem + + def __init__(self, lon0, lat0, lon1, lat1, parent=None): + """Constructor. + + Args: + lon0(float): Longitude of the top left point. + lat0(float): Latitude of the top left point. + lon1(float): Longitude of the bottom right point. + lat1(float): Latitude of the bottom right point. + parent(QGraphicsItem): Parent item, default None. + + Note: + The management of the parent item is work in progress. + """ + QGraphicsRectItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + + def updatePosition(self, scene): + """Update the position of the circle. + + Args: + scene(MapGraphicsScene): Scene to which the circle belongs. + """ + pos0 = scene.posFromLonLat(self._lon0, self._lat0) + pos1 = scene.posFromLonLat(self._lon1, self._lat1) + + self.prepareGeometryChange() + rect = QRectF(pos0, pos1).normalized() + self.setRect(rect) + self.setPos(QPointF(0.0, 0.0)) + + def setLonLat(self, lon0, lat0, lon1, lat1): + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + + +class MapGraphicsLineItem(QGraphicsLineItem, MapItem): + + QtParentClass = QGraphicsLineItem + + def __init__(self, lon0, lat0, lon1, lat1, parent=None): + QGraphicsLineItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + + def updatePosition(self, scene): + pos0 = scene.posFromLonLat(self._lon0, self._lat0) + pos1 = scene.posFromLonLat(self._lon1, self._lat1) + deltaPos = QPointF(pos1[0] - pos0[0], pos1[1] - pos0[1]) + + self.prepareGeometryChange() + self.setLine(QLineF(QPointF(0.0, 0.0), deltaPos)) + self.setPos(pos0[0], pos0[1]) + + def setLonLat(self, lon0, lat0, lon1, lat1): + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + + +class MapGraphicsPolylineItem(QGraphicsPathItem, MapItem): + + QtParentClass = QGraphicsPathItem + + def __init__(self, longitudes, latitudes, parent=None): + QGraphicsPathItem.__init__(self, parent=parent) + MapItem.__init__(self) + + assert len(longitudes) == len(latitudes) + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + + def updatePosition(self, scene): + path = QPainterPath() + + self.prepareGeometryChange() + + count = len(self._longitudes) + if count > 0: + x, y = scene.posFromLonLat(self._longitudes, self._latitudes) + path.moveTo(x[0], y[0]) + for i in iterRange(1, count): + path.lineTo(x[i], y[i]) + + self.setPath(path) + + def setLonLat(self, longitudes, latitudes): + assert len(longitudes) == len(latitudes) + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + +class MapGraphicsPixmapItem(QGraphicsPixmapItem, MapItem): + """Item for showing a pixmap in a MapGraphicsScene. + """ + + QtParentClass = QGraphicsPixmapItem + + def __init__(self, longitude, latitude, pixmap, parent=None): + """Constructor. + + Args: + longitude(float): Longitude of the origin of the pixmap. + latitude(float): Latitude of the center of the pixmap. + pixmap(QPixmap): Pixmap. + scene(MapGraphicsScene): Scene the item belongs to. + parent(QGraphicsItem): Parent item. + """ + QGraphicsPixmapItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon = longitude + self._lat = latitude + self.setPixmap(pixmap) + + def updatePosition(self, scene): + """Update the origin position of the item. + + Origin coordinates are unchanged. + + Args: + scene(MapGraphicsScene): Scene the item belongs to. + """ + pos = scene.posFromLonLat(self._lon, self._lat) + self.prepareGeometryChange() + self.setPos(pos[0], pos[1]) + + def setLonLat(self, longitude, latitude): + """Update the origin coordinates of the item. + + Origin position will be updated. + + Args: + longitude(float): Longitude of the origin of the pixmap. + latitude(float): Latitude of the center of the pixmap. + """ + self._lon = longitude + self._lat = latitude + scene = self.scene() + if scene is not None: + self.updatePosition(scene) + + +class MapGraphicsTextItem(QGraphicsSimpleTextItem, MapItem): + """Text item for the MapGraphicsScene + """ + + QtParentClass = QGraphicsSimpleTextItem + + def __init__(self, longitude, latitude, text, parent=None, min_zoom_visibility=None): + QGraphicsSimpleTextItem.__init__(self, text, parent=parent) + MapItem.__init__(self) + self._min_zoom = min_zoom_visibility + self._lon, self._lat = longitude, latitude + + def resetMinZoomVisibility(self): + """Delete level of zoom under which the text disappears. """ + self._min_zoom = None + + def setMinZoomVisibility(self, zoom_level): + """Update level of zoom under which the text disappears. """ + self._min_zoom = zoom_level + + def updatePosition(self, scene): + """Update the origin position of the item.""" + + pos = scene.posFromLonLat(self._lon, self._lat) + self.setPos(pos) + if self._min_zoom is not None: + self.setVisible(scene._zoom >= self._min_zoom) + + +class MapGraphicsLinesGroupItem(QGraphicsItem, MapItem): + + QtParentClass = QGraphicsItem + + def __init__(self, longitudes, latitudes, parent=None): + QGraphicsItem.__init__(self, parent=parent) + MapItem.__init__(self) + + assert len(longitudes) == len(latitudes) + assert len(longitudes) >= 2 + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + + # Setup internal lines + linesGroup = QGraphicsItemGroup(parent=self) + self._linesGroup = linesGroup + self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] + + def paint(self, painter, option, widget=None): + pass + + def boundingRect(self): + return self._linesGroup.boundingRect() + + def setLineStyle(self, colors, width=1., style=SolidLine): + pen = makePen(colors, width=width, style=style) + + if isinstance(pen, list): + if len(pen) != len(self._lines): + raise ValueError('The number of colors must be equal to the number of lines') + for line, p in izip(self._lines, pen): + line.setPen(p) + else: + for line in self._lines: + line.setPen(pen) + + def updatePosition(self, scene): + self.prepareGeometryChange() + + x, y = scene.posFromLonLat(self._longitudes, self._latitudes) + lines = self._lines + for i in iterRange(0, len(lines)-1): + lines[i].setLine(x[i], y[i], x[i+1], y[i+1]) + + def setLonLat(self, longitudes, latitudes): + assert len(longitudes) == len(latitudes) + assert len(longitudes) >= 2 + + self._longitudes = np.array(longitudes, dtype=np.float64) + self._latitudes = np.array(latitudes, dtype=np.float64) + + old_lines = self._lines + for line in old_lines: + line.setParentItem(None) + + scene = self.scene() + if scene is not None: + for line in old_lines: + scene.removeItem(line) + + linesGroup = self._linesGroup + self._lines = [QGraphicsLineItem(parent=linesGroup) for i in iterRange(len(longitudes)-1)] + + if scene is not None: + self.updatePosition(scene) + + def __getitem__(self, index): + return self._lines[index] diff --git a/pytilemap/maplegenditem.py b/pytilemap/maplegenditem.py new file mode 100644 index 0000000..8823920 --- /dev/null +++ b/pytilemap/maplegenditem.py @@ -0,0 +1,151 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Slot, QRectF, QPointF +from qtpy.QtGui import QPen, QBrush, QColor +from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ + QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem + +from .mapitems import MapItem +from .functions import makePen, makeBrush +from .qtsupport import getQVariantValue + + +class MapLegendEntryItem(QGraphicsItemGroup): + + def __init__(self, shape, text, parent=None): + QGraphicsItemGroup.__init__(self, parent=parent) + + text = QGraphicsSimpleTextItem(text, parent=shape) + br = shape.boundingRect() + x = br.right() + 10 + y = br.top() + 3 + text.setPos(x, y) + self.addToGroup(shape) + + self._text = text + + def top(self): + return self.boundingRect().top() + + def bottom(self): + return self.boundingRect().bottom() + + def right(self): + return self.boundingRect().right() + + def left(self): + return self.boundingRect().left() + + def text(self): + return self._text + + +class MapLegendItem(QGraphicsObject, MapItem): + + QtParentClass = QGraphicsObject + + def __init__(self, pos=None, parent=None): + QGraphicsObject.__init__(self, parent=parent) + MapItem.__init__(self) + self.setZValue(200.0) + + self._anchorPos = QPointF(pos) if pos is not None else QPointF(10.0, 10.0) + + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(QPen(Qt.NoPen)) + self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) + + self._entries = list() + self._entriesGroup = QGraphicsItemGroup(parent=self) + + def _sceneChanged(self, oldScene, newScene): + if oldScene is not None: + oldScene.sceneRectChanged.disconnect(self.setSceneRect) + if newScene is not None: + newScene.sceneRectChanged.connect(self.setSceneRect) + # Setup the new position of the item + self.setSceneRect(newScene.sceneRect()) + + def updatePosition(self, scene): + pass + + def addPoint(self, text, color, border=None, size=20.0): + shape = QGraphicsEllipseItem(size / 2.0, size / 2.0, size, size) + brush = makeBrush(color) + shape.setBrush(brush) + shape.setPen(makePen(border)) + + self.addEntry(MapLegendEntryItem(shape, text)) + + def addRect(self, text, color, border=None, size=20.0): + shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) + brush = makeBrush(color) + shape.setBrush(brush) + shape.setPen(makePen(border)) + + self.addEntry(MapLegendEntryItem(shape, text)) + + def addLine(self, text, color, width=1.): + shape = QGraphicsLineItem(10., 10., 20., 20.) + pen = makePen(color, width=width) + shape.setPen(pen) + self.addEntry(MapLegendEntryItem(shape, text)) + + def addEntry(self, entry): + self._entries.append(entry) + self._entriesGroup.addToGroup(entry) + self._updateLayout() + + def boundingRect(self): + return self._border.boundingRect() + + def paint(*args, **kwargs): + pass + + @Slot(QRectF) + def setSceneRect(self, rect): + self.setPos(rect.topLeft() + self._anchorPos) + + def _updateLayout(self): + self.prepareGeometryChange() + + bottom = 0.0 + left = 0.0 + right = 0.0 + for entry in self._entries: + entry.setPos(left, bottom) + bottom += entry.bottom() + 5.0 + right = max(right, entry.right() + 5.0) + + self._border.setRect(0.0, 0.0, right, bottom + 5.0) + + def pen(self): + """Pen for the background of the legend + + Returns: + QPen: Pen for the background of the legend + """ + return self._border.pen() + + def brush(self): + """Brush for the background of the legend + + Returns: + QBrush: Brush for the background of the legend + """ + return self._border.brush() + + def setPen(self, *args, **kwargs): + """Set the pen for the background of the legend + + The arguments are the same of the :func:`makePen` function + """ + return self._border.setPen(makePen(*args, **kwargs)) + + def setBrush(self, *args, **kwargs): + """Set the brush for the background of the legend + + The arguments are the same of the :func:`makeBrush` function + """ + return self._border.setBrush(makeBrush(*args, **kwargs)) + diff --git a/pytilemap/mapnavitem.py b/pytilemap/mapnavitem.py new file mode 100644 index 0000000..1432e9f --- /dev/null +++ b/pytilemap/mapnavitem.py @@ -0,0 +1,150 @@ +from __future__ import print_function, absolute_import + +import os +from qtpy.QtCore import Qt, Slot, QRectF, QPointF, QObject, Signal +from qtpy.QtGui import QPen, QBrush, QColor, QPixmap +from qtpy.QtWidgets import QGraphicsObject, QGraphicsRectItem, QGraphicsItemGroup, \ + QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsLineItem, QGraphicsPixmapItem + +from .imagebutton import ImageButton +from .mapitems import MapItem +from .functions import makePen, makeBrush +from .qtsupport import getQVariantValue + +from .maplegenditem import * + + +class MapNavItem(QGraphicsObject, MapItem): + + QtParentClass = QGraphicsObject + + _posForAnchors = { + Qt.TopLeftCorner: QPointF(20.0, 75.0), + Qt.TopRightCorner: QPointF(40.0, -15.0), + Qt.BottomLeftCorner: QPointF(20.0, -15.0), + Qt.BottomRightCorner: QPointF(30.0, 75.0), + } + + + def __init__(self, anchor, parent=None): + QGraphicsObject.__init__(self, parent=parent) + MapItem.__init__(self) + self.setZValue(200.0) + + anchorPos = self._posForAnchors[anchor] + self._anchorPos = QPointF(anchorPos) + self._anchor = anchor + + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(QPen(Qt.NoPen)) + self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) + + self._entries = list() + + imgfile = os.path.dirname(__file__) + os.sep + 'zoom_in_symbol.png' + img = QPixmap(24,24) + img.load(imgfile) + img = img.scaled(24,24) + img = ImageButton(img, parent=self) + self.zoom_in_button = img + self.addEntry(self.zoom_in_button) + + imgfile = os.path.dirname(__file__) + os.sep + 'zoom_out_symbol.png' + img2 = QPixmap(24,24) + img2.load(imgfile) + img2 = img2.scaled(24,24) + img2 = ImageButton(img2, parent=self) + self.zoom_out_button = img2 + self.addEntry(self.zoom_out_button) + + def _sceneChanged(self, oldScene, newScene): + if oldScene is not None: + oldScene.sceneRectChanged.disconnect(self.setSceneRect) + if newScene is not None: + newScene.sceneRectChanged.connect(self.setSceneRect) + # Setup the new position of the item + self.setSceneRect(newScene.sceneRect()) + + def updatePosition(self, scene): + pass + + def addRect(self, text, color, border=None, size=20.0): + shape = QGraphicsRectItem(size / 2.0, size / 2.0, size, size) + brush = makeBrush(color) + shape.setBrush(brush) + shape.setPen(makePen(border)) + + self.addEntry(MapLegendEntryItem(shape, text)) + + def addEntry(self, entry): + self._entries.append(entry) + self._updateLayout() + + def boundingRect(self): + return self._border.boundingRect() + + def paint(*args, **kwargs): + pass + + @Slot(QRectF) + def setSceneRect(self, rect): + anchorPos = self._anchorPos + anchor = self._anchor + newPos = None + if anchor == Qt.BottomRightCorner: + newPos = rect.bottomRight() - anchorPos + elif anchor == Qt.TopRightCorner: + newPos = rect.topRight() - anchorPos + elif anchor == Qt.TopLeftCorner: + newPos = rect.topLeft() + anchorPos + elif anchor == Qt.BottomLeftCorner: + newPos = rect.bottomLeft() + anchorPos + else: + raise NotImplementedError('Other corner have not actually been implemented') + + self.setPos(newPos) + + + def _updateLayout(self): + self.prepareGeometryChange() + + bottom = 0.0 + left = 0.0 + right = 0.0 + for entry in self._entries: + entry.setPos(left, bottom) + bottom += entry.boundingRect().bottom() + right = max(right, entry.boundingRect().right() + 1.0) + + self._border.setRect(0.0, 0.0, right, bottom + 1.0) + + def pen(self): + """Pen for the background of the legend + + Returns: + QPen: Pen for the background of the legend + """ + return self._border.pen() + + def brush(self): + """Brush for the background of the legend + + Returns: + QBrush: Brush for the background of the legend + """ + return self._border.brush() + + def setPen(self, *args, **kwargs): + """Set the pen for the background of the legend + + The arguments are the same of the :func:`makePen` function + """ + return self._border.setPen(makePen(*args, **kwargs)) + + def setBrush(self, *args, **kwargs): + """Set the brush for the background of the legend + + The arguments are the same of the :func:`makeBrush` function + """ + return self._border.setBrush(makeBrush(*args, **kwargs)) + diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py new file mode 100644 index 0000000..93528f5 --- /dev/null +++ b/pytilemap/mapscene.py @@ -0,0 +1,478 @@ +from __future__ import print_function, absolute_import, division + +from numpy import floor + +from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint +from qtpy.QtGui import QPixmap +from qtpy.QtWidgets import QGraphicsScene + +from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ + MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ + MapGraphicsRectItem, MapGraphicsLinesGroupItem +from .maplegenditem import MapLegendItem +from .mapescaleitem import MapScaleItem +from .mapnavitem import MapNavItem +from .functions import iterRange +from .tileutils import posFromLonLat, lonLatFromPos + + +class MapGraphicsScene(QGraphicsScene): + """Graphics scene for showing a slippy map. + """ + + sigZoomChanged = Signal(int) + + def __init__(self, tileSource, parent=None): + """Constructor. + + Args: + tileSource(MapTileSource): Source for loading the tiles. + parent(QObject): Parent object, default `None` + """ + QGraphicsScene.__init__(self, parent=parent) + + self._zoom = 15 + + self._tileSource = tileSource + self._tileSource.setParent(self) + self._tileSource.tileReceived.connect(self.setTilePixmap) + tdim = self._tileSource.tileSize() + + self._emptyTile = QPixmap(tdim, tdim) + self._emptyTile.fill(Qt.lightGray) + + self._tilesRect = QRect() + self._tilePixmaps = {} + + self._tileInDownload = list() + + self.setSceneRect(0.0, 0.0, 400, 300) + self.sceneRectChanged.connect(self.onSceneRectChanged) + + @Slot() + def close(self): + self._tileSource.close() + + def setTileSource(self, newTileSource): + self._tileSource.tileReceived.disconnect(self.setTilePixmap) + self._tileSource.close() + + self._tilePixmaps.clear() + self._tileInDownload = list() + + self._tileSource = newTileSource + self._tileSource.setParent(self) + self._tileSource.tileReceived.connect(self.setTilePixmap) + + self.requestTiles() + + self.invalidate() + self.update() + + @Slot(QRectF) + def onSceneRectChanged(self, rect): + """Callback for the changing of the visible rect. + + Evaluate the visible tiles and request to load the new tiles. + + Args: + rect(QRectF): Current visible area. + """ + tdim = self._tileSource.tileSize() + center = rect.center() + ct = self.tileFromPos(center.x(), center.y()) + tx = ct.x() + ty = ct.y() + + width = rect.width() + height = rect.height() + # top left corner of the center tile + xp = int(width / 2.0 - (tx - floor(tx)) * tdim) + yp = int(height / 2.0 - (ty - floor(ty)) * tdim) + + # first tile vertical and horizontal + xs = tx - (xp + tdim - 1) / tdim + ys = ty - (yp + tdim - 1) / tdim + + # last tile vertical and horizontal + xe = (width - xp - 1) / tdim - xs + 1 + tx + ye = (height - yp - 1) / tdim - ys + 1 + ty + + # define the rect of visible tiles + self._tilesRect = QRect(xs, ys, xe, ye) + + # Request the loading of new tiles (if needed) + self.requestTiles() + + self.invalidate() + self.update() + + def drawBackground(self, painter, rect): + """Draw the background tiles. + + If a tile is not available, draw a gray rectangle. + + Args: + painter(QPainter): Painter for drawing. + rect(QRectF): Current visible area. + """ + tilesRect = self._tilesRect + left = tilesRect.left() + top = tilesRect.top() + numXtiles = tilesRect.width() + numYtiles = tilesRect.height() + tdim = self._tileSource.tileSize() + pixRect = QRectF(0.0, 0.0, tdim, tdim) + emptyTilePix = self._emptyTile + tilePixmaps = self._tilePixmaps + + for x in iterRange(numXtiles+1): + for y in iterRange(numYtiles+1): + tp = (x + left, y + top) + box = self.tileRect(tp[0], tp[1]) + # Use default gray image if tile image is missing + pix = tilePixmaps.get(tp, emptyTilePix) + painter.drawPixmap(box, pix, pixRect) + + def zoomTo(self, pos, zoomlevel): + """Zoom to a specific zoom level. + + If the level is out of range, the zoom action is ignored. + + clear the current tile cache, evaluate the new center and + update the position of all the items. + + Args: + zoomlevel(int): New zoom level. + """ + + tileSource = self._tileSource + if zoomlevel > tileSource.maxZoom() or zoomlevel < tileSource.minZoom(): + return + + # Get the coordinates of the center using the position in pixels of the mouse + pos_corr = self.views()[0].mapToScene(pos) + coord = self.lonLatFromPos(pos_corr.x(), pos_corr.y()) + + # Set the new zoom level + self._zoom = zoomlevel + + # Clear cache and abort active requests + self._tileSource.abortAllRequests() + self._tilePixmaps.clear() + + # Re-center map so that the point on which it was zoomed is in the same position + self.setCenter(coord[0], coord[1]) + pos_corr = self.views()[0].mapToScene(pos) + center = self.sceneRect().center() + self.translate(center.x() - pos_corr.x(), center.y() - pos_corr.y()) + + self.sigZoomChanged.emit(zoomlevel) + + def zoomIn(self, pos=None): + """Increments the zoom level + + Args: + pos (QPointF): Center position, Latitude and Longitude. Default None for the + current center position. + """ + if pos is None: + pos = QPoint(self.width()/2, self.height()/2) + self.zoomTo(pos, self._zoom + 1) + + def zoomOut(self, pos=None): + """Decrements the zoom level + + Args: + pos (QPointF): Center position, Latitude and Longitude. Default None for the + current center position. + """ + if pos is None: + pos = QPoint(self.width()/2, self.height()/2) + self.zoomTo(pos, self._zoom - 1) + + @Slot() + def handleZoomIn(self): + self.zoomIn() + + @Slot() + def handleZoomOut(self): + self.zoomOut() + + def zoom(self): + return self._zoom + + @Slot(int, int, int, QPixmap) + def setTilePixmap(self, x, y, zoom, pixmap): + """Set the image of the tile. + + Args: + x(int): X coordinate of the tile. + y(int): Y coordinate of the tile. + zoom(int): Zoom coordinate of the tile. + pixmap(QPixmap): Image for the tile. + """ + if self._zoom == zoom: + self._tilePixmaps[(x, y)] = pixmap + self.update() + + def requestTiles(self): + """Request the loading of tiles. + + Check the loaded tiles and requests only + the missing tiles. + """ + tilesRect = self._tilesRect + tilePixmaps = self._tilePixmaps + + numXtiles = tilesRect.width() + numYtiles = tilesRect.height() + left = tilesRect.left() + top = tilesRect.top() + tileSource = self._tileSource + zoom = self._zoom + + # Request load of new tiles + for x in iterRange(numXtiles): + for y in iterRange(numYtiles): + tp = (left + x, top + y) + # Request tile only if missing + if tp not in tilePixmaps: + pix = tileSource.requestTile(tp[0], tp[1], zoom) + if pix is not None: + tilePixmaps[tp] = pix + + self.update() + + def tileRect(self, tx, ty): + """Area for a specific tile. + + Args: + tx(int): X coordinate of the tile. + ty(int): Y coordinate of the tile. + + Returns: + QRectF, the area of the tile. + """ + tdim = self._tileSource.tileSize() + return QRectF(tx * tdim, ty * tdim, tdim, tdim) + + def setSize(self, width, height): + """Set the size of the visible area in pixels. + + Update the scene rect. + + Args: + width(int): Width of the visible area. + height(int): Height of the visible area. + """ + rect = QRectF(self.sceneRect().topLeft(), QSizeF(width, height)) + self.setSceneRect(rect) + + def setCenter(self, lon, lat, zoom=None): + """Move the center of the visible area to new coordinates. + + Update the scene rect. + + Args: + lon(float): New longitude of the center. + lat(float): New latitude of the center. + zoom(int [1:15]): Zoom Level + """ + if zoom != None and zoom < 15 and zoom > 0: + self._zoom = zoom + + rect = QRectF(self.sceneRect()) + pos = self.posFromLonLat(lon, lat) + rect.moveCenter(QPointF(pos[0], pos[1])) + self.setSceneRect(rect) + + + def center(self): + centerPos = self.sceneRect().center() + centerCoord = self.lonLatFromPos(centerPos.x(), centerPos.y()) + return QPointF(centerCoord[0], centerCoord[1]) + + def translate(self, dx, dy): + """Translate the visible area by dx, dy pixels. + + Update the scene rect. + + Args: + dx(int): Increments for the center x coord in pixels. + dy(int): Increments for the center y coord in pixels. + """ + self.setSceneRect(self.sceneRect().translated(dx, dy)) + + def posFromLonLat(self, lon, lat): + """Position in scene coordinate of the WGS84 coordinates. + + Convert from WGS84 reference system to scene reference system. + + Args: + lon(float or numpy.ndarray): Longitude value or values. + lat(float or numpy.ndarray): Latitude value or values. + + Returns: + tuple: (x, y) with the positions of the input coordinates. + """ + return posFromLonLat(lon, lat, self._zoom, self._tileSource.tileSize()) + + def lonLatFromPos(self, x, y): + """Position in WGS84 coordinate of the scene coordinates. + + Convert from scene reference system to WGS84 reference system. + + Args: + x(float, int or numpy.ndarray): X value or values. + y(float, int or numpy.ndarray): Y value or values. + + Returns: + tuple: (lon, lat) with the coordinates of the input positions. + """ + return lonLatFromPos(x, y, self._zoom, self._tileSource.tileSize()) + + def tileFromPos(self, x, y): + """Tile in the selected position. + + Args: + x(float, int): X value for position. + y(float, int): Y value for position. + + Returns: + QPointF with the coordinates of the tile. + """ + tdim = float(self._tileSource.tileSize()) + return QPointF(x / tdim, y / tdim) + + def addCircle(self, longitude, latitude, radius): + """Add a new circle to the graphics scene. + + Args: + longitude(float): Longitude of the center of the circle. + latitude(float): Latitude of the center of the circle. + radius(float): Longitude of the center of the circle. + + Returns: + MapGraphicsCircleItem added to the scene. + """ + item = MapGraphicsCircleItem(longitude, latitude, radius) + self.addItem(item) + return item + + def addLine(self, lon0, lat0, lon1, lat1): + """Add a newline) to the graphics scene. + + Args: + lon0(float): Longitude of the start point. + lat0(float): Latitude of the start point. + lon1(float): Longitude of the end point. + lat1(float): Latitude of the end point. + + Returns: + MapGraphicsLineItem added to the scene. + """ + item = MapGraphicsLineItem(lon0, lat0, lon1, lat1) + self.addItem(item) + return item + + def addRect(self, lon0, lat0, lon1, lat1): + """Add a newline) to the graphics scene. + + Args: + lon0(float): Longitude of the top left point. + lat0(float): Latitude of the top left point. + lon1(float): Longitude of the bottom right point. + lat1(float): Latitude of the bottom right point. + + Returns: + MapGraphicsLineItem added to the scene. + """ + item = MapGraphicsRectItem(lon0, lat0, lon1, lat1) + self.addItem(item) + return item + + def addPolyline(self, longitudes, latitudes): + """Add a new circle (point) to the graphics scene. + + Args: + longitudes(iterable): Longitudes of all the points of the polyline. + latitudes(iterable): Latitudes of all the points of the polyline. + + Returns: + MapGraphicsPolylineItem added to the scene. + """ + item = MapGraphicsPolylineItem(longitudes, latitudes) + self.addItem(item) + return item + + def addPixmap(self, longitude, latitude, pixmap): + """Add a new circle (point) to the graphics scene. + + Args: + longitude(float): Longitude of the origin of the pixmap. + latitude(float): Latitude of the center of the pixmap. + pixmap(QPixmap): Pixmap. + + Returns: + MapGraphicsPixmapItem added to the scene. + + Note: + Use `MapGraphicsPixmapItem.setOffset(off)` to translate by `off` pixels + the pixmap respect the origin coordinates. + """ + item = MapGraphicsPixmapItem(longitude, latitude, pixmap) + self.addItem(item) + return item + + def addText(self, longitude, latitude, text): + """Add a test item to the graphics scene. + + Args: + longitude(float): Longitude of the origin of the text + latitude(float): Latitude of the origin of the text + + Returns: + MapGraphicsTextItem added to the scene. + """ + item = MapGraphicsTextItem(longitude, latitude, text) + self.addItem(item) + return item + + def addNavItem(self, anchor): + self.nav_item = MapNavItem(anchor) + self.addItem(self.nav_item) + self.nav_item.zoom_in_button.clicked.connect(self.handleZoomIn) + self.nav_item.zoom_out_button.clicked.connect(self.handleZoomOut) + return self.nav_item + + + def addLegend(self, pos=QPointF(10.0, 10.0)): + legend = MapLegendItem(pos=pos) + self.addItem(legend) + return legend + + def addScale(self, **kwargs): + """Add a scale bar with text on the right bottom of the map + + Keyword Args: + textPen: QPen to use for drawing the text. Default 'black'. + barBrush: QBrush to use for drawing the scale bar. Default (190, 190, 190, 160) + barPen: QPen to use for drawing the scale bar border. Default (190, 190, 190, 240) + barBrushHover: QBrush to use for drawing the scale bar when the mouse is over it. + Default (110, 110, 110, 255). + barPenHover: QPen to use for drawing the scale bar borderwhen the mouse is over it. + Default (90, 90, 90, 255). + + Note: + Almost all the argumnets accepted by the functions.makeBrush() and functions.makePen() + are accepted. + """ + scaleItem = MapScaleItem(**kwargs) + self.addItem(scaleItem) + return scaleItem + + def addLinesGroup(self, longitudes, latitudes): + item = MapGraphicsLinesGroupItem(longitudes, latitudes) + self.addItem(item) + return item diff --git a/pytilemap/maptilesources/__init__.py b/pytilemap/maptilesources/__init__.py new file mode 100644 index 0000000..b54daaf --- /dev/null +++ b/pytilemap/maptilesources/__init__.py @@ -0,0 +1,6 @@ +from __future__ import print_function, absolute_import + +from .maptilesource import MapTileSource +from .maptilesourcehere import MapTileSourceHere, MapTileSourceHereDemo +from .maptilesourceosm import MapTileSourceOSM +from .maptilesourcehttp import MapTileSourceHTTP \ No newline at end of file diff --git a/pytilemap/maptilesources/maptilesource.py b/pytilemap/maptilesources/maptilesource.py new file mode 100644 index 0000000..92b3db9 --- /dev/null +++ b/pytilemap/maptilesources/maptilesource.py @@ -0,0 +1,39 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Signal, Slot, QObject +from qtpy.QtGui import QPixmap + + +class MapTileSource(QObject): + + tileReceived = Signal(int, int, int, QPixmap) + + _tileSize = None + _minZoom = None + _maxZoom = None + + def __init__(self, tileSize=256, minZoom=2, maxZoom=18, parent=None): + QObject.__init__(self, parent=parent) + self._tileSize = tileSize + self._minZoom = minZoom + self._maxZoom = maxZoom + + def tileSize(self): + return self._tileSize + + def maxZoom(self): + return self._maxZoom + + def minZoom(self): + return self._minZoom + + def requestTile(self, x, y, zoom): + raise NotImplementedError() + + @Slot() + def abortAllRequests(self): + pass + + @Slot() + def close(self): + pass diff --git a/pytilemap/maptilesources/maptilesourcehere.py b/pytilemap/maptilesources/maptilesourcehere.py new file mode 100644 index 0000000..62c5ffa --- /dev/null +++ b/pytilemap/maptilesources/maptilesourcehere.py @@ -0,0 +1,71 @@ +from __future__ import print_function, absolute_import + +from .maptilesourcehttp import MapTileSourceHTTP + + +class MapTileSourceHereDemo(MapTileSourceHTTP): + + _server = None + + def __init__(self, tileSize=256, parent=None): + MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=2, maxZoom=20, parent=parent) + assert tileSize == 256 or tileSize == 512 + self._server = 0 + + def url(self, x, y, zoom): + self._server += 1 + if self._server > 4: + self._server = 0 + url = "http://%d.base.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server + url += "newest/normal.day/%d/%d/%d/%d/png8" % (zoom, x, y, self._tileSize) + url += '?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg' + return url + + +class MapTileSourceHere(MapTileSourceHTTP): + + def __init__(self, tileSize=256, app_id='DemoAppId01082013GAL', app_code='AJKnXv84fjrb0KIHawS0Tg', + scheme='normal.day', cit=True, tileType='maptile', mapType='base', imageFmt='png8', + userAgent='(PyQt) TileMap 1.0 - HERE', mapHttpLoader=None, + minZoom=2, maxZoom=20, parent=None): + MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, + mapHttpLoader=mapHttpLoader, parent=parent) + assert tileSize == 256 or tileSize == 512 + self._server = 0 + + self._app_id = app_id + self._app_code = app_code + + self._mapType = mapType + self._tileType = tileType + self._scheme = scheme + self._cit = '.cit' if cit else '' + self._imageFmt = imageFmt + + self._buildBaseUrl() + + def _buildBaseUrl(self): + url = 'http://%d.' + self._mapType + '.maps' + self._cit + '.api.here.com' + url += '/maptile/2.1/' + self._tileType + '/newest/' + self._scheme + \ + '/%d/%d/%d/' + str(self._tileSize) + '/' + self._imageFmt + url += '?app_id=%s&app_code=%s' % (self._app_id, self._app_code) + self._baseurl = url + + def setOptions(self, scheme=None, tileType=None, mapType=None): + if mapType is not None: + self._mapType = mapType + if tileType is not None: + self._tileType = tileType + if scheme is not None: + self._scheme = scheme + + self._buildBaseUrl() + + def url(self, x, y, zoom): + self._server += 1 + if self._server > 4: + self._server = 0 + + args = (self._server, zoom, x, y) + url = self._baseurl % args + return url diff --git a/pytilemap/maptilesources/maptilesourcehttp.py b/pytilemap/maptilesources/maptilesourcehttp.py new file mode 100644 index 0000000..4cb47ca --- /dev/null +++ b/pytilemap/maptilesources/maptilesourcehttp.py @@ -0,0 +1,116 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Signal, Slot, QObject, QByteArray, QUrl, QThread +from qtpy.QtGui import QPixmap +from qtpy.QtNetwork import QNetworkRequest, QNetworkDiskCache, QNetworkAccessManager, \ + QNetworkReply + +from .maptilesource import MapTileSource +from ..qtsupport import getQVariantValue, getCacheFolder + +DEFAULT_CACHE_SIZE = 1024 * 1024 * 100 + + +class MapTileHTTPLoader(QObject): + + tileLoaded = Signal(int, int, int, QByteArray) + + def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', parent=None): + QObject.__init__(self, parent=parent) + self._manager = None + self._cache = None + self._cacheSize = cacheSize + + try: + # Convert user agent to bytes + userAgent = userAgent.encode() + except: + # no encode method exists. This hsould be the Python 2 case + pass + + self._userAgent = userAgent + self._tileInDownload = dict() + + @Slot(int, int, int, str) + def loadTile(self, x, y, zoom, url): + if self._manager is None: + self._manager = QNetworkAccessManager(parent=self) + self._manager.finished.connect(self.handleNetworkData) + cache = QNetworkDiskCache() + cacheDir = getCacheFolder() + cache.setCacheDirectory(cacheDir) + cache.setMaximumCacheSize(self._cacheSize) + self._manager.setCache(cache) + + key = (x, y, zoom) + url = QUrl(url) + if key not in self._tileInDownload: + # Request the image to the map service + request = QNetworkRequest(url=url) + request.setRawHeader(b'User-Agent', self._userAgent) + request.setAttribute(QNetworkRequest.User, key) + request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) + self._tileInDownload[key] = self._manager.get(request) + + @Slot(QNetworkReply) + def handleNetworkData(self, reply): + tp = getQVariantValue(reply.request().attribute(QNetworkRequest.User)) + if tp in self._tileInDownload: + del self._tileInDownload[tp] + + if not reply.error(): + data = reply.readAll() + self.tileLoaded.emit(tp[0], tp[1], tp[2], data) + reply.close() + reply.deleteLater() + + @Slot() + def abortRequest(self, x, y, zoom): + p = (x, y, zoom) + if p in self._tileInDownload: + reply = self._tileInDownload[p] + del self._tileInDownload[p] + reply.close() + reply.deleteLater() + + @Slot() + def abortAllRequests(self): + for x, y, zoom in list(self._tileInDownload.keys()): + self.abortRequest(x, y, zoom) + + +class MapTileSourceHTTP(MapTileSource): + + def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', + tileSize=256, minZoom=2, maxZoom=18, mapHttpLoader=None, parent=None): + MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) + + if mapHttpLoader is not None: + self._loader = mapHttpLoader + else: + self._loader = MapTileHTTPLoader(cacheSize=cacheSize, userAgent=userAgent) + + self._loader.tileLoaded.connect(self.handleTileDataLoaded) + + @Slot() + def close(self): + self._loader.abortAllRequests() + + def url(self, x, y, zoom): + raise NotImplementedError() + + def requestTile(self, x, y, zoom): + url = self.url(x, y, zoom) + self._loader.loadTile(x, y, zoom, url) + + @Slot(int, int, int, QByteArray) + def handleTileDataLoaded(self, x, y, zoom, data): + pix = QPixmap() + pix.loadFromData(data) + self.tileReceived.emit(x, y, zoom, pix) + + def abortAllRequests(self): + self._loader.abortAllRequests() + + def imageFormat(self): + return 'PNG' diff --git a/pytilemap/maptilesources/maptilesourcelocal.py b/pytilemap/maptilesources/maptilesourcelocal.py new file mode 100644 index 0000000..ced639f --- /dev/null +++ b/pytilemap/maptilesources/maptilesourcelocal.py @@ -0,0 +1,33 @@ +from __future__ import print_function, absolute_import + +import os + +from qtpy.QtGui import QPixmap + +from .maptilesource import MapTileSource + + +class MapTileSourceDirectory(MapTileSource): + + _directory = None + _fnameSuffix = None + + def __init__(self, directory, filenameSuffix='.png', tileSize=256, minZoom=2, maxZoom=18, parent=None): + MapTileSource.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, parent=parent) + self._directory = directory + self._fnameSuffix = filenameSuffix + + def tileSize(self): + return self._tileSize + + def maxZoom(self): + return self._maxZoom + + def minZoom(self): + return self._minZoom + + def requestTile(self, x, y, zoom): + filename = os.path.join(self._directory, str(zoom), str(x), str(y)+self._fnameSuffix) + if os.path.exists(filename): + return QPixmap(filename) + return None diff --git a/pytilemap/maptilesources/maptilesourceosm.py b/pytilemap/maptilesources/maptilesourceosm.py new file mode 100644 index 0000000..72d6c4a --- /dev/null +++ b/pytilemap/maptilesources/maptilesourceosm.py @@ -0,0 +1,13 @@ +from __future__ import print_function, absolute_import + +from .maptilesourcehttp import MapTileSourceHTTP + + +class MapTileSourceOSM(MapTileSourceHTTP): + + def __init__(self, parent=None): + MapTileSourceHTTP.__init__(self, parent=parent) + + def url(self, x, y, zoom): + url = "http://tile.openstreetmap.org/%d/%d/%d.png" % (zoom, x, y) + return url diff --git a/pytilemap/mapview.py b/pytilemap/mapview.py new file mode 100644 index 0000000..27dc50b --- /dev/null +++ b/pytilemap/mapview.py @@ -0,0 +1,90 @@ +from __future__ import print_function, absolute_import + +from qtpy.QtCore import Qt, Slot +from qtpy.QtWidgets import QGraphicsView + +from .mapscene import MapGraphicsScene +from .maptilesources.maptilesourceosm import MapTileSourceOSM +from .qtsupport import wheelAngleDelta + + +class MapGraphicsView(QGraphicsView): + """Graphics view for showing a slippy map. + """ + + def __init__(self, tileSource=None, parent=None): + """Constructor. + + Args: + tileSource(MapTileSource): Source for the tiles, default `MapTileSourceOSM`. + parent(QObject): Parent object, default `None` + """ + QGraphicsView.__init__(self, parent=parent) + if tileSource is None: + tileSource = MapTileSourceOSM() + scene = MapGraphicsScene(tileSource) + self.setScene(scene) + self._lastMousePos = None + + @Slot() + def close(self): + self.scene().close() + QGraphicsView.close(self) + + def resizeEvent(self, event): + """Resize the widget. Reimplemented from `QGraphicsView`. + + Resize the `MapGraphicsScene`. + + Args: + event(QResizeEvent): Resize event. + """ + QGraphicsView.resizeEvent(self, event) + size = event.size() + self.scene().setSize(size.width(), size.height()) + + def mousePressEvent(self, event): + """Manage the mouse pressing. + + Args: + event(QMouseEvent): Mouse event. + """ + QGraphicsView.mousePressEvent(self, event) + if event.buttons() == Qt.LeftButton: + self._lastMousePos = event.pos() + + def mouseMoveEvent(self, event): + """Manage the mouse movement while it is pressed. + + Args: + event(QMouseEvent): Mouse event. + """ + QGraphicsView.mouseMoveEvent(self, event) + if event.buttons() == Qt.LeftButton: + delta = self._lastMousePos - event.pos() + self._lastMousePos = event.pos() + self.scene().translate(delta.x(), delta.y()) + + def mouseReleaseEvent(self, event): + """Manage the mouse releasing. + + Args: + event(QMouseEvent): Mouse event. + """ + QGraphicsView.mouseReleaseEvent(self, event) + + def wheelEvent(self, event): + """Manage the mouse wheel rotation. + + Change the zoom on the map. If the delta is positive, zoom in, if the + delta is negative, zoom out. + + Args: + event(QWheelEvent): Mouse wheel event. + """ + event.accept() + delta = wheelAngleDelta(event) + if delta > 0: + self.scene().zoomIn(event.pos()) + elif delta < 0: + self.scene().zoomOut(event.pos()) diff --git a/pytilemap/qtsupport.py b/pytilemap/qtsupport.py new file mode 100644 index 0000000..f83767e --- /dev/null +++ b/pytilemap/qtsupport.py @@ -0,0 +1,48 @@ + +import sys +import sip + +import qtpy + + +__all__ = [ + 'getQVariantValue', + 'wheelAngleDelta', +] + + +try: + if qtpy.PYQT5: + QVARIANT_API = 2 + else: + QVARIANT_API = sip.getapi('QVariant') +except ValueError: + QVARIANT_API = 1 + + +if QVARIANT_API == 1: + def getQVariantValue(variant): + return variant.toPyObject() +else: + def getQVariantValue(variant): + return variant + +if qtpy.PYQT5: + def wheelAngleDelta(wheelEvent): + return wheelEvent.angleDelta().y() +else: + def wheelAngleDelta(wheelEvent): + return wheelEvent.delta() + + +if qtpy.PYQT5: + from qtpy.QtCore import QStandardPaths + + def getCacheFolder(): + return QStandardPaths.writableLocation(QStandardPaths.CacheLocation) + +else: + from qtpy.QtGui import QDesktopServices + + def getCacheFolder(): + return QDesktopServices.storageLocation(QDesktopServices.CacheLocation) diff --git a/pytilemap/tileutils.py b/pytilemap/tileutils.py new file mode 100644 index 0000000..e6938e2 --- /dev/null +++ b/pytilemap/tileutils.py @@ -0,0 +1,105 @@ +from __future__ import division + +import numpy as np +from numpy import log, tan, cos, arctan, exp +from numpy import pi as PI + + +Deg2Rad = PI / 180.0 +PI2 = PI * 2.0 + + +def posFromLonLat(lon, lat, zoom, tileSize): + """Position in scene coordinate of the WGS84 coordinates. + + Convert from WGS84 reference system to scene reference system. + + Args: + lon(float or numpy.ndarray): Longitude value or values. + lat(float or numpy.ndarray): Latitude value or values. + zoom(int): The zoom level. + tileSize(int): The size of the tile. + + Returns: + tuple: (x, y) with the positions of the input coordinates. + """ + if isinstance(lat, np.ndarray): + return _posFromLonLatArray(lon, lat, zoom, tileSize) + + tx = lon + 180.0 + tx /= 360.0 + ty = (1.0 - log(tan(lat * Deg2Rad) + 1.0 / cos(lat * Deg2Rad)) / PI) / 2.0 + zn = (1 << zoom) * float(tileSize) + tx *= zn + ty *= zn + return tx, ty + + +def _posFromLonLatArray(lon, lat, zoom, tileSize): + # Optimized implementation of posFromLonLat() function for numpy arrays + tx = lon + 180.0 + tx /= 360.0 + + tmp = lat * Deg2Rad + ty = cos(tmp) + np.divide(1.0, ty, out=ty) + tan(tmp, out=tmp) + ty += tmp + log(ty, out=ty) + ty /= PI + np.subtract(1.0, ty, out=ty) + ty /= 2.0 + + zn = (1 << zoom) * float(tileSize) + tx *= zn + ty *= zn + return tx, ty + + +def lonLatFromPos(x, y, zoom, tileSize): + """Position in WGS84 coordinate of the scene coordinates. + + Convert from scene reference system to WGS84 reference system. + + Args: + x(float, int or numpy.ndarray): X value or values. + y(float, int or numpy.ndarray): Y value or values. + zoom(int): The zoom level. + tileSize(int): The size of the tile. + + Returns: + tuple: (lon, lat) with the coordinates of the input positions. + """ + if isinstance(y, np.ndarray): + return _lonLatFromPosArray(x, y, zoom, tileSize) + + tx = x / tileSize + ty = y / tileSize + zn = 1 << zoom + lon = tx / zn * 360.0 - 180.0 + n = PI - PI2 * ty / zn + lat = arctan(0.5 * (exp(n) - exp(-n))) / Deg2Rad + return lon, lat + + +def _lonLatFromPosArray(x, y, zoom, tileSize): + # Optimized implementation of posFromLonLat() function for numpy arrays + zn = 1 << zoom + + lon = x / tileSize + lon /= zn + lon *= 360 + lon -= 180 + + lat = y / tileSize + lat *= -PI2 / zn + lat += PI + tmp = lat * -1.0 + exp(lat, out=lat) + exp(tmp, out=tmp) + lat -= tmp + lat *= 0.5 + arctan(lat, out=lat) + lat /= Deg2Rad + + return lon, lat diff --git a/pytilemap/zoom_in_symbol.png b/pytilemap/zoom_in_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..6787135d2006942484c9cd269deba64e2fa0e34d GIT binary patch literal 557 zcmV+|0@D47P)WFU8GbZ8()Nlj2>E@cM*00EUrL_t(o!|j(rO2a@DhQCSD zv=P&aluD_KLKlL25!~t-+_-S-F+75&@EWeXfJ+e(3N2_YsZiUdCUG;`q{Wy{5>Uu{ zn+(kS|IGXUyh)&lBC?Ki4!I^!%pPZ)#1mX7gMZ~|Ji%RRf}1FySRx2AD02i;%Ujg{ zPhhMyyB~UPW=~M3j17Rp3!Z}FzqqK*hyY)%^Rjo5%@!U3`_!oBBl0U91YMk@1zO)l zj|99W-@l4YTOg%QEpnd&hD-t2V2qB3pvnXd7n=$uf&msI<}sK{1dE(e1$22*O)eG^ zKt#+QUYEE;bK2-qPG8z{0TG0DEL1i4h(GQ(h9W@;FcT51VU_6RQKk{9b_Fo7R^SaZ zdOvAk#I`nr8Z~B&nP4$O;N!_XZ!)C}K!YdMUeu3_I!p;LaS=4RrJWEnrbN+fArP4C z0DCd>l;7lcGy+^~bh>$5IKDjm0E&0N;E!;)FaAV}$TmI!60zQ)9pwj000000NkvXXu0mjfOy1XA literal 0 HcmV?d00001 diff --git a/pytilemap/zoom_out_symbol.png b/pytilemap/zoom_out_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..c49ba6af241054476af96343d52237b8f51a39e0 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+`=Ht$S`Y;1W=H@#M9T6{UH}Wv$~YpzxifBA=%83h!W@g+}zZ>5+Ij>!MP|ku_QG` zp**uBL&4qCHy}kXm7Rfsk=xV7F(l&f+v(PRhaE&*`(|QNT*pB9^wDY|;GW4At%kP@xn?$R_umU))o@_^&rr~^b%tCJ?ff#Zvvj`_3R202oF2_ zO?{T!Os;?irf-4;w{I6_`mJ{SeMbRI0w}yZUHx3v IIVCg!01@7wTL1t6 literal 0 HcmV?d00001 From ddfdbdc9057dce6ebac84cb74cadcade96eac34a Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 26 Jul 2018 22:28:07 -0400 Subject: [PATCH 07/31] fixed tile loading problem in maptilesourcehere --- pytilemap/maptilesources/maptilesourcehere.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pytilemap/maptilesources/maptilesourcehere.py b/pytilemap/maptilesources/maptilesourcehere.py index 62c5ffa..b836dc5 100644 --- a/pytilemap/maptilesources/maptilesourcehere.py +++ b/pytilemap/maptilesources/maptilesourcehere.py @@ -10,12 +10,12 @@ class MapTileSourceHereDemo(MapTileSourceHTTP): def __init__(self, tileSize=256, parent=None): MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=2, maxZoom=20, parent=parent) assert tileSize == 256 or tileSize == 512 - self._server = 0 + self._server = 1 def url(self, x, y, zoom): self._server += 1 if self._server > 4: - self._server = 0 + self._server = 1 url = "http://%d.base.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server url += "newest/normal.day/%d/%d/%d/%d/png8" % (zoom, x, y, self._tileSize) url += '?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg' @@ -31,7 +31,7 @@ def __init__(self, tileSize=256, app_id='DemoAppId01082013GAL', app_code='AJKnXv MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, mapHttpLoader=mapHttpLoader, parent=parent) assert tileSize == 256 or tileSize == 512 - self._server = 0 + self._server = 1 self._app_id = app_id self._app_code = app_code @@ -64,7 +64,7 @@ def setOptions(self, scheme=None, tileType=None, mapType=None): def url(self, x, y, zoom): self._server += 1 if self._server > 4: - self._server = 0 + self._server = 1 args = (self._server, zoom, x, y) url = self._baseurl % args From 8b812ef234027155a140a6f84d04347f9292e4e6 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Fri, 27 Jul 2018 21:35:31 -0400 Subject: [PATCH 08/31] added geo registered pixmap --- example/main_gs.py | 4 +++ pytilemap/mapitems.py | 69 ++++++++++++++++++++++++++++++++++++++++++- pytilemap/mapscene.py | 16 ++++++++-- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/example/main_gs.py b/example/main_gs.py index aa87e79..a4d85c0 100644 --- a/example/main_gs.py +++ b/example/main_gs.py @@ -111,6 +111,10 @@ def __init__(self): pointItemPixmapOrigin = view.scene().addCircle(10.090598, 44.857893, 3.0) pointItemPixmapOrigin.setBrush(Qt.black) + pix2 = QPixmap(36,36) + pix2.fill(Qt.blue) + pixmapItem2 = view.scene().addGeoPixmap(10.090598, 44.857893, 10.092, 44.8585, pix2) + pointItemWithChild = view.scene().addCircle(10.083103, 44.858014, 3.0) pointItemWithChild.setBrush(Qt.blue) pointItemWithChild.setPen(QPen(Qt.NoPen)) diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index 581bda9..4789cab 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -2,7 +2,7 @@ import numpy as np -from qtpy.QtCore import Qt, QLineF, QPointF, QRectF +from qtpy.QtCore import Qt, QLineF, QPointF, QRectF, QSize from qtpy.QtGui import QPainterPath from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ @@ -137,6 +137,9 @@ def setRadius(self, radius): if scene is not None: self.updatePosition(scene) + def mousePressEvent(self, evt): + print ("ellipse clicked!") + class MapGraphicsRectItem(QGraphicsRectItem, MapItem): """Circle item for the MapGraphicsScene @@ -189,6 +192,8 @@ def setLonLat(self, lon0, lat0, lon1, lat1): self.updatePosition(self.scene()) + + class MapGraphicsLineItem(QGraphicsLineItem, MapItem): QtParentClass = QGraphicsLineItem @@ -221,6 +226,7 @@ def setLonLat(self, lon0, lat0, lon1, lat1): self.updatePosition(self.scene()) + class MapGraphicsPolylineItem(QGraphicsPathItem, MapItem): QtParentClass = QGraphicsPathItem @@ -258,6 +264,67 @@ def setLonLat(self, longitudes, latitudes): self.updatePosition(scene) + def mousePressEvent(self, evt): + print ("poly line clicked!") #QGraphicsSceneMouseEvent *event) + +class MapGraphicsGeoPixmapItem(QGraphicsPixmapItem, MapItem): + + QtParentClass = QGraphicsPixmapItem + + def __init__(self, lon0, lat0, lon1, lat1, pixmap, parent=None): + """Constructor. + + Args: + longitude(float): Longitude of the origin of the pixmap. + latitude(float): Latitude of the center of the pixmap. + pixmap(QPixmap): Pixmap. + scene(MapGraphicsScene): Scene the item belongs to. + parent(QGraphicsItem): Parent item. + """ + QGraphicsPixmapItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + + self.orig_pixmap = pixmap + self.setPixmap(pixmap) + self.setShapeMode(1) + + + def updatePosition(self, scene): + pos0 = scene.posFromLonLat(self._lon0, self._lat0) + pos1 = scene.posFromLonLat(self._lon1, self._lat1) + #deltaPos = QPointF(pos1[0] - pos0[0], pos1[1] - pos0[1]) + self.prepareGeometryChange() + xsize = int(pos1[0] - pos0[0]) + ysize = int(pos0[1] - pos1[1]) + newscale = QSize(xsize, ysize) + scaled = self.orig_pixmap.scaled(newscale) + self.setPixmap(scaled) + self.setPos(pos0[0], pos0[1]) + #self.setRect(pos0[0], pos0[1], pos1[0], pos1[1]) + + + + def setLonLat(self, lon0, lat0, lon1, lat1): + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + + + def mousePressEvent(self, evt): + print ("geo pixmap clicked!") #QGraphicsSceneMouseEvent *event) + +# end MapGraphicsGeoPixmap + + class MapGraphicsPixmapItem(QGraphicsPixmapItem, MapItem): """Item for showing a pixmap in a MapGraphicsScene. """ diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 93528f5..36e6c1b 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -2,13 +2,14 @@ from numpy import floor -from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint +from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint, QSize from qtpy.QtGui import QPixmap -from qtpy.QtWidgets import QGraphicsScene +from qtpy.QtWidgets import QGraphicsScene, QRubberBand + from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ - MapGraphicsRectItem, MapGraphicsLinesGroupItem + MapGraphicsRectItem, MapGraphicsLinesGroupItem, MapGraphicsGeoPixmapItem from .maplegenditem import MapLegendItem from .mapescaleitem import MapScaleItem from .mapnavitem import MapNavItem @@ -49,6 +50,7 @@ def __init__(self, tileSource, parent=None): self.setSceneRect(0.0, 0.0, 400, 300) self.sceneRectChanged.connect(self.onSceneRectChanged) + @Slot() def close(self): self._tileSource.close() @@ -406,6 +408,8 @@ def addPolyline(self, longitudes, latitudes): self.addItem(item) return item + + def addPixmap(self, longitude, latitude, pixmap): """Add a new circle (point) to the graphics scene. @@ -425,6 +429,12 @@ def addPixmap(self, longitude, latitude, pixmap): self.addItem(item) return item + def addGeoPixmap(self, lon0, lat0, lon1, lat1, pixmap): + item = MapGraphicsGeoPixmapItem(lon0, lat0, lon1, lat1, pixmap) + self.addItem(item) + return item + + def addText(self, longitude, latitude, text): """Add a test item to the graphics scene. From bdecbb954be1bb17c01ce1dc8b18a34e648be00e Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Sun, 29 Jul 2018 08:47:33 -0400 Subject: [PATCH 09/31] added right-click area selection to mapscene --- pytilemap/mapscene.py | 61 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 36e6c1b..54cac99 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -1,10 +1,11 @@ from __future__ import print_function, absolute_import, division from numpy import floor +import math from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint, QSize -from qtpy.QtGui import QPixmap -from qtpy.QtWidgets import QGraphicsScene, QRubberBand +from qtpy.QtGui import QPixmap, QPen, QBrush, QColor, QPainter +from qtpy.QtWidgets import QGraphicsScene, QGraphicsLineItem, QGraphicsRectItem, QGraphicsItem from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ @@ -50,6 +51,10 @@ def __init__(self, tileSource, parent=None): self.setSceneRect(0.0, 0.0, 400, 300) self.sceneRectChanged.connect(self.onSceneRectChanged) + # Rubberband Support for Drawing Areas + self.rect_start = None + self.rect_end = None + self.rubberband = None @Slot() def close(self): @@ -71,6 +76,58 @@ def setTileSource(self, newTileSource): self.invalidate() self.update() + def mousePressEvent(self, evt): + if evt.button() == 2: + evt.accept() + pos = evt.scenePos() + lon,lat = self.lonLatFromPos(pos.x(), pos.y()) + self.rect_start = [lon,lat] + + if self.rubberband == None: + self.rect_start = pos + # end mousePressEvent + else: + evt.ignore() + QGraphicsScene.mousePressEvent(self, evt) + # end mousePressEvent + + def mouseReleaseEvent(self, evt): + if evt.button() == 2: + evt.accept() + pos = evt.scenePos() + lon,lat = self.lonLatFromPos(pos.x(), pos.y()) + self.removeItem(self.rubberband) + self.rect_start = None + self.rect_end = None + self.rubberband = None + else: + evt.ignore() + QGraphicsScene.mouseReleaseEvent(self, evt) + # end mouseReleaseEvent + + def mouseMoveEvent(self, evt): + if self.rect_start: + pos = evt.scenePos() + lon,lat = self.lonLatFromPos(pos.x(), pos.y()) + self.rect_end = pos + if not self.rubberband: + self.rubberband = QGraphicsRectItem( + min(self.rect_start.x(), self.rect_end.x()), + min(self.rect_start.y(), self.rect_end.y()), + abs(self.rect_end.x()-self.rect_start.x()), + abs(self.rect_end.y()-self.rect_start.y())) + clr = QColor(240,240,240,100) + self.rubberband.setBrush(clr) + self.rubberband.setPen(QPen(QBrush(Qt.blue), 1.0)) + self.addItem(self.rubberband) + else: + self.rubberband.setRect( + min(self.rect_start.x(), self.rect_end.x()), + min(self.rect_start.y(), self.rect_end.y()), + abs(self.rect_end.x()-self.rect_start.x()), + abs(self.rect_end.y()-self.rect_start.y())) + # end mouseMoveEvent + @Slot(QRectF) def onSceneRectChanged(self, rect): """Callback for the changing of the visible rect. From f291f16ee69aa7666cc8f1bf4ea923abaa55ee5d Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Tue, 31 Jul 2018 17:33:32 -0400 Subject: [PATCH 10/31] experimented with different tile soures, fixed rectangle drawing --- pytilemap/mapitems.py | 19 +++--- pytilemap/mapscene.py | 65 +++++++++++++++---- pytilemap/maptilesources/maptilesourcehere.py | 6 +- pytilemap/maptilesources/maptilesourcehttp.py | 3 +- pytilemap/maptilesources/maptilesourceosm.py | 2 + 5 files changed, 69 insertions(+), 26 deletions(-) diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index 4789cab..1f20356 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -293,21 +293,19 @@ def __init__(self, lon0, lat0, lon1, lat1, pixmap, parent=None): self.setPixmap(pixmap) self.setShapeMode(1) - def updatePosition(self, scene): pos0 = scene.posFromLonLat(self._lon0, self._lat0) pos1 = scene.posFromLonLat(self._lon1, self._lat1) - #deltaPos = QPointF(pos1[0] - pos0[0], pos1[1] - pos0[1]) self.prepareGeometryChange() - xsize = int(pos1[0] - pos0[0]) - ysize = int(pos0[1] - pos1[1]) + xsize = abs(int(pos1[0] - pos0[0])) + ysize = abs(int(pos0[1] - pos1[1])) newscale = QSize(xsize, ysize) scaled = self.orig_pixmap.scaled(newscale) self.setPixmap(scaled) - self.setPos(pos0[0], pos0[1]) - #self.setRect(pos0[0], pos0[1], pos1[0], pos1[1]) - - + #self.setPen(QPen(Qt.black)) + ul_x = min(pos0[0], pos1[0]) + ul_y = min(pos0[1], pos1[1]) + self.setPos(ul_x, ul_y) def setLonLat(self, lon0, lat0, lon1, lat1): self._lon0 = lon0 @@ -318,9 +316,8 @@ def setLonLat(self, lon0, lat0, lon1, lat1): if scene is not None: self.updatePosition(self.scene()) - - def mousePressEvent(self, evt): - print ("geo pixmap clicked!") #QGraphicsSceneMouseEvent *event) + #def mousePressEvent(self, evt): + # print ("geo pixmap clicked!") #QGraphicsSceneMouseEvent *event) # end MapGraphicsGeoPixmap diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 54cac99..2d23d06 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -2,6 +2,7 @@ from numpy import floor import math +import os from qtpy.QtCore import Qt, Slot, Signal, QRect, QRectF, QPointF, QSizeF, QPoint, QSize from qtpy.QtGui import QPixmap, QPen, QBrush, QColor, QPainter @@ -55,6 +56,7 @@ def __init__(self, tileSource, parent=None): self.rect_start = None self.rect_end = None self.rubberband = None + self.AOI = None @Slot() def close(self): @@ -77,38 +79,51 @@ def setTileSource(self, newTileSource): self.update() def mousePressEvent(self, evt): + '''Catch right-click events for rectangle drawing''' if evt.button() == 2: evt.accept() pos = evt.scenePos() - lon,lat = self.lonLatFromPos(pos.x(), pos.y()) - self.rect_start = [lon,lat] + #lon,lat = self.lonLatFromPos(pos.x(), pos.y()) + #self.rect_start = [lon,lat] + self.rect_start = pos - if self.rubberband == None: - self.rect_start = pos - # end mousePressEvent + if self.rubberband != None: + self.removeItem(self.rubberband) + self.rubberband = None + + if self.AOI != None: + self.removeItem(self.AOI) + self.AOI = None else: evt.ignore() QGraphicsScene.mousePressEvent(self, evt) - # end mousePressEvent def mouseReleaseEvent(self, evt): + '''Catch right-click events for rectangle drawing''' if evt.button() == 2: evt.accept() pos = evt.scenePos() - lon,lat = self.lonLatFromPos(pos.x(), pos.y()) + lon0, lat0 = self.lonLatFromPos(self.rect_start.x(), self.rect_start.y()) + lon1,lat1 = self.lonLatFromPos(pos.x(), pos.y()) self.removeItem(self.rubberband) + self.rect_start = None self.rect_end = None - self.rubberband = None + + print ("creating AOI") + clr = QColor(100,240,240,100) + pix2 = QPixmap(100,100) + pix2.fill(clr) + self.AOI = self.addGeoPixmap(lon0, lat0, lon1, lat1, pix2) else: evt.ignore() QGraphicsScene.mouseReleaseEvent(self, evt) - # end mouseReleaseEvent def mouseMoveEvent(self, evt): + '''Catch right-click events for rectangle drawing''' if self.rect_start: pos = evt.scenePos() - lon,lat = self.lonLatFromPos(pos.x(), pos.y()) + #lon,lat = self.lonLatFromPos(pos.x(), pos.y()) self.rect_end = pos if not self.rubberband: self.rubberband = QGraphicsRectItem( @@ -126,7 +141,6 @@ def mouseMoveEvent(self, evt): min(self.rect_start.y(), self.rect_end.y()), abs(self.rect_end.x()-self.rect_start.x()), abs(self.rect_end.y()-self.rect_start.y())) - # end mouseMoveEvent @Slot(QRectF) def onSceneRectChanged(self, rect): @@ -465,7 +479,22 @@ def addPolyline(self, longitudes, latitudes): self.addItem(item) return item + def addPin(self, lon, lat): + """Add a location pin to the graphics scene. + + Args: + longitude(float): Longitude (decimal degrees WGS84) of the pin + latitude(float): Latitude of the Pin + Returns: + MapGraphicsPixmapItem added to the scene. + """ + pinfile = os.path.dirname(__file__) + os.sep + 'red_pin_36_36.png' + pixmap = QPixmap(36,36) + pixmap.load(pinfile) + item = MapGraphicsPixmapItem(lon, lat, pixmap) + self.addItem(item) + return item def addPixmap(self, longitude, latitude, pixmap): """Add a new circle (point) to the graphics scene. @@ -487,11 +516,21 @@ def addPixmap(self, longitude, latitude, pixmap): return item def addGeoPixmap(self, lon0, lat0, lon1, lat1, pixmap): + '''Add a geo-registered pixmap to the scene + + Args: + lon0(float): Longitude (decimal degress WGS84) upper left + lat0(float): Lattitude (decimal degrees WGS84) upper left + lon1(float): Longitude lower right + lat1(float): Lattitudelower right + + Returns: + MapGraphicsGeoPixmapItem + ''' item = MapGraphicsGeoPixmapItem(lon0, lat0, lon1, lat1, pixmap) self.addItem(item) return item - def addText(self, longitude, latitude, text): """Add a test item to the graphics scene. @@ -513,7 +552,6 @@ def addNavItem(self, anchor): self.nav_item.zoom_out_button.clicked.connect(self.handleZoomOut) return self.nav_item - def addLegend(self, pos=QPointF(10.0, 10.0)): legend = MapLegendItem(pos=pos) self.addItem(legend) @@ -539,6 +577,7 @@ def addScale(self, **kwargs): self.addItem(scaleItem) return scaleItem + def addLinesGroup(self, longitudes, latitudes): item = MapGraphicsLinesGroupItem(longitudes, latitudes) self.addItem(item) diff --git a/pytilemap/maptilesources/maptilesourcehere.py b/pytilemap/maptilesources/maptilesourcehere.py index b836dc5..33cd502 100644 --- a/pytilemap/maptilesources/maptilesourcehere.py +++ b/pytilemap/maptilesources/maptilesourcehere.py @@ -16,15 +16,19 @@ def url(self, x, y, zoom): self._server += 1 if self._server > 4: self._server = 1 - url = "http://%d.base.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server + #https://2.aerial.maps.cit.api.here.com/maptile/2.1/maptile/newest/hybrid.day/5/8/13/256/png8 + url = "http://%d.aerial.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server + #url = "http://%d.base.maps.cit.api.here.com/maptile/2.1/maptile/" % self._server url += "newest/normal.day/%d/%d/%d/%d/png8" % (zoom, x, y, self._tileSize) url += '?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg' + print (url) return url class MapTileSourceHere(MapTileSourceHTTP): def __init__(self, tileSize=256, app_id='DemoAppId01082013GAL', app_code='AJKnXv84fjrb0KIHawS0Tg', + #scheme='hybrid.day', cit=True, tileType='maptile', mapType='aerial', imageFmt='png8', scheme='normal.day', cit=True, tileType='maptile', mapType='base', imageFmt='png8', userAgent='(PyQt) TileMap 1.0 - HERE', mapHttpLoader=None, minZoom=2, maxZoom=20, parent=None): diff --git a/pytilemap/maptilesources/maptilesourcehttp.py b/pytilemap/maptilesources/maptilesourcehttp.py index 4cb47ca..1d6d647 100644 --- a/pytilemap/maptilesources/maptilesourcehttp.py +++ b/pytilemap/maptilesources/maptilesourcehttp.py @@ -8,7 +8,7 @@ from .maptilesource import MapTileSource from ..qtsupport import getQVariantValue, getCacheFolder -DEFAULT_CACHE_SIZE = 1024 * 1024 * 100 +DEFAULT_CACHE_SIZE = 1024 * 1024 * 1000 class MapTileHTTPLoader(QObject): @@ -17,6 +17,7 @@ class MapTileHTTPLoader(QObject): def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', parent=None): QObject.__init__(self, parent=parent) + print ("http loader: cache size = {0}".format(cacheSize)) self._manager = None self._cache = None self._cacheSize = cacheSize diff --git a/pytilemap/maptilesources/maptilesourceosm.py b/pytilemap/maptilesources/maptilesourceosm.py index 72d6c4a..3487fda 100644 --- a/pytilemap/maptilesources/maptilesourceosm.py +++ b/pytilemap/maptilesources/maptilesourceosm.py @@ -10,4 +10,6 @@ def __init__(self, parent=None): def url(self, x, y, zoom): url = "http://tile.openstreetmap.org/%d/%d/%d.png" % (zoom, x, y) + #url = "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Aerosol/default/2014-04-09/GoogleMapsCompatible_Level6/%d/%d/%d.png" % (zoom,x,y) #{level}/{row}/{col}.png + print (url) return url From 024f54692c471629269380e039b5f2394054d0c7 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Wed, 15 Aug 2018 22:36:23 -0400 Subject: [PATCH 11/31] - Added "Pin" Icons - Added Geo-Referenced Pixmaps - Added label option to all map items --- example/main_gs.py | 29 ++++++--- pytilemap/mapitems.py | 148 +++++++++++++++++++++++++++++++++++++++--- pytilemap/mapscene.py | 5 +- 3 files changed, 162 insertions(+), 20 deletions(-) diff --git a/example/main_gs.py b/example/main_gs.py index a4d85c0..4ae938c 100644 --- a/example/main_gs.py +++ b/example/main_gs.py @@ -77,7 +77,7 @@ def __init__(self): self.setCentralWidget(view) - view.scene().setCenter(10.065990, 44.861041, zoom=7) + view.scene().setCenter(10.065990, 44.861041, zoom=13) view.setOptimizationFlag(QGraphicsView.DontSavePainterState, True) view.setRenderHint(QPainter.Antialiasing, True) view.setRenderHint(QPainter.SmoothPixmapTransform, True) @@ -111,17 +111,25 @@ def __init__(self): pointItemPixmapOrigin = view.scene().addCircle(10.090598, 44.857893, 3.0) pointItemPixmapOrigin.setBrush(Qt.black) - pix2 = QPixmap(36,36) - pix2.fill(Qt.blue) - pixmapItem2 = view.scene().addGeoPixmap(10.090598, 44.857893, 10.092, 44.8585, pix2) + # Pixmap with both corners geo-referenced + geo_pixmap = QPixmap(36,36) + geo_pixmap.fill(Qt.blue) + geo_pixmap_item= view.scene().addGeoPixmap(10.090598, 44.8709, 10.092, 44.873, geo_pixmap) + geo_pixmap_item.setLabel("GeoPixmapItem") + geo_pixmap_item.showLabel() - pointItemWithChild = view.scene().addCircle(10.083103, 44.858014, 3.0) - pointItemWithChild.setBrush(Qt.blue) - pointItemWithChild.setPen(QPen(Qt.NoPen)) + # Blue Point with an HTML label + blue_point = view.scene().addCircle(10.083103, 44.868014, 3.0) + blue_point.setBrush(Qt.blue) + blue_point.setPen(QPen(Qt.NoPen)) + blue_point.setLabel("
" + "Label for Blue Point" + "
", html=True) + blue_point.showLabel() + + # Location Pin + pin_item = view.scene().addPin(10.06, 44.84) + pin_item.setLabel("
Pin Item
",html=True) + pin_item.showLabel() - textItem = QGraphicsSimpleTextItem('Annotation\nfor blue point', parent=pointItemWithChild) - textItem.setBrush(QBrush(QColor(Qt.blue))) - textItem.setPos(-5, 3) lats_2 = list() lons_2 = list() @@ -142,6 +150,7 @@ def __init__(self): scaleItem = view.scene().addScale(anchor=Qt.BottomRightCorner) + def main(): diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index 1f20356..d3128b8 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -3,10 +3,10 @@ import numpy as np from qtpy.QtCore import Qt, QLineF, QPointF, QRectF, QSize -from qtpy.QtGui import QPainterPath +from qtpy.QtGui import QPainterPath, QPen, QBrush, QColor from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem + QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem, QGraphicsTextItem from .functions import iterRange, makePen, izip from .qtsupport import getQVariantValue @@ -28,6 +28,10 @@ def __init__(self): if not isinstance(self, QGraphicsItem): raise RuntimeError('MapItem must be an instance of QGraphicsItem') + self._label = "label" + self._label_item = None + self._label_html = False + def itemChange(self, change, value): if change == self.ItemSceneChange: # Disconnect the old scene, if any @@ -79,6 +83,52 @@ def setZoom(self, zoom): def updatePosition(self, scene): raise NotImplementedError() + def setLabel(self, label, html=False): + self._label = label + self._label_html = html + + def getLabelLocation(self): + ''' Get label location for this object + + Args: + none + + Returns: + (pos x, pos y) : position of label in pixels + ''' + rect = self.getGeoRect() + br = rect.bottomRight() + pos = (br.x(), br.y()) + return pos + + def getGeoRect(self): + ''' Get bounding rectangle for this obj + + Args: + none + + Returns: + QRectF: (px x, px y, w, h) + ''' + return self.boundingRect() + + def showLabel(self): + ''' Show label for this object, if html is indicated, display formatted''' + if self._label_item: + return + self._label_item = MapGraphicsLabelItem(self, self._label) + if self._label_html: + self._label_item.setHtml(self._label) + self.scene().addItem(self._label_item) + + def hideLabel(self): + ''' Hide label for this object''' + if not self._label_item: + return + self.scene().removeItem(self._label_item) + self._label_item = None + + class MapGraphicsCircleItem(QGraphicsEllipseItem, MapItem): """Circle item for the MapGraphicsScene @@ -130,6 +180,8 @@ def setLonLat(self, longitude, latitude): scene = self.scene() if scene is not None: self.updatePosition(scene) + if self._label_item: + self._label_item.updatePosition(scene) def setRadius(self, radius): self._radius = radius @@ -139,6 +191,13 @@ def setRadius(self, radius): def mousePressEvent(self, evt): print ("ellipse clicked!") + self.setLonLat(self._lon+0.0001, self._lat+0.0001) + + def hideLabel(self): + if not self._label_item: + return + self.scene().removeItem(self._label_item) + self._label_item = None class MapGraphicsRectItem(QGraphicsRectItem, MapItem): @@ -302,11 +361,26 @@ def updatePosition(self, scene): newscale = QSize(xsize, ysize) scaled = self.orig_pixmap.scaled(newscale) self.setPixmap(scaled) - #self.setPen(QPen(Qt.black)) ul_x = min(pos0[0], pos1[0]) ul_y = min(pos0[1], pos1[1]) self.setPos(ul_x, ul_y) + def getGeoRect(self): + ''' get geo referenced rectangle for this object + + Returns: + QRectF (upper left x, upper left y, width, height) + ''' + pos0 = self.scene().posFromLonLat(self._lon0, self._lat0) + pos1 = self.scene().posFromLonLat(self._lon1, self._lat1) + xsize = abs(int(pos1[0] - pos0[0])) + ysize = abs(int(pos0[1] - pos1[1])) + ul_x = min(pos0[0], pos1[0]) + ul_y = min(pos0[1], pos1[1]) + rect = QRectF(ul_x, ul_y, xsize, ysize) + return rect + + def setLonLat(self, lon0, lat0, lon1, lat1): self._lon0 = lon0 self._lat0 = lat0 @@ -316,12 +390,11 @@ def setLonLat(self, lon0, lat0, lon1, lat1): if scene is not None: self.updatePosition(self.scene()) - #def mousePressEvent(self, evt): - # print ("geo pixmap clicked!") #QGraphicsSceneMouseEvent *event) - # end MapGraphicsGeoPixmap + + class MapGraphicsPixmapItem(QGraphicsPixmapItem, MapItem): """Item for showing a pixmap in a MapGraphicsScene. """ @@ -345,6 +418,20 @@ def __init__(self, longitude, latitude, pixmap, parent=None): self._lat = latitude self.setPixmap(pixmap) + def getGeoRect(self): + ''' get geo referenced rectangle for this object + + Returns: + QRectF (upper left x, upper left y, width, height) + ''' + rect = self.boundingRect() + pos = self.scene().posFromLonLat(self._lon, self._lat) + w = rect.width() + h = rect.height() + rect2 = QRectF(pos[0], pos[1], w, h ) + return rect2 + + def updatePosition(self, scene): """Update the origin position of the item. @@ -353,9 +440,13 @@ def updatePosition(self, scene): Args: scene(MapGraphicsScene): Scene the item belongs to. """ + print ("here") pos = scene.posFromLonLat(self._lon, self._lat) self.prepareGeometryChange() self.setPos(pos[0], pos[1]) + if self._label_item: + self._label_item.updatePosition(scene) + print ("updated label item") def setLonLat(self, longitude, latitude): """Update the origin coordinates of the item. @@ -372,8 +463,13 @@ def setLonLat(self, longitude, latitude): if scene is not None: self.updatePosition(scene) + def mousePressEvent(self, evt): + print ("image clicked!") #QGraphicsSceneMouseEvent *event) + #------- pop up a text item here + # First, a rectangle + -class MapGraphicsTextItem(QGraphicsSimpleTextItem, MapItem): +class MapGraphicsTextItem(QGraphicsTextItem, MapItem): """Text item for the MapGraphicsScene """ @@ -384,6 +480,9 @@ def __init__(self, longitude, latitude, text, parent=None, min_zoom_visibility=N MapItem.__init__(self) self._min_zoom = min_zoom_visibility self._lon, self._lat = longitude, latitude + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(QPen(Qt.NoPen)) + self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) def resetMinZoomVisibility(self): """Delete level of zoom under which the text disappears. """ @@ -397,7 +496,39 @@ def updatePosition(self, scene): """Update the origin position of the item.""" pos = scene.posFromLonLat(self._lon, self._lat) - self.setPos(pos) + self.setPos(pos[0], pos[1]) + if self._min_zoom is not None: + self.setVisible(scene._zoom >= self._min_zoom) + #rect = super(MapGraphicsTextItem, self).boundingRect() + #self._border.setRect() + +class MapGraphicsLabelItem(QGraphicsTextItem, MapItem): + """ Label for an item - updates its position with the item + """ + + QtParentClass = QGraphicsSimpleTextItem + + def __init__(self, other_item, text, parent=None, min_zoom_visibility=None): + QGraphicsSimpleTextItem.__init__(self, text, parent=parent) + MapItem.__init__(self) + self.other_item = other_item + self._min_zoom = min_zoom_visibility + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(QPen(Qt.NoPen)) + self._border.setBrush(QBrush(QColor(190, 190, 190, 160))) + + def resetMinZoomVisibility(self): + """Delete level of zoom under which the text disappears. """ + self._min_zoom = None + + def setMinZoomVisibility(self, zoom_level): + """Update level of zoom under which the text disappears. """ + self._min_zoom = zoom_level + + def updatePosition(self, scene): + """Update the origin position of the item.""" + pos = self.other_item.getLabelLocation() + self.setPos(pos[0], pos[1]) if self._min_zoom is not None: self.setVisible(scene._zoom >= self._min_zoom) @@ -471,3 +602,4 @@ def setLonLat(self, longitudes, latitudes): def __getitem__(self, index): return self._lines[index] + diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 2d23d06..3a09592 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -11,7 +11,8 @@ from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ - MapGraphicsRectItem, MapGraphicsLinesGroupItem, MapGraphicsGeoPixmapItem + MapGraphicsRectItem, MapGraphicsLinesGroupItem, MapGraphicsGeoPixmapItem, \ + MapGraphicsLabelItem from .maplegenditem import MapLegendItem from .mapescaleitem import MapScaleItem from .mapnavitem import MapNavItem @@ -490,7 +491,7 @@ def addPin(self, lon, lat): MapGraphicsPixmapItem added to the scene. """ pinfile = os.path.dirname(__file__) + os.sep + 'red_pin_36_36.png' - pixmap = QPixmap(36,36) + pixmap = QPixmap() pixmap.load(pinfile) item = MapGraphicsPixmapItem(lon, lat, pixmap) self.addItem(item) From 811d6e83a284fcc2e8fd32fa33509d96dc669fad Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 16 Aug 2018 07:02:11 -0400 Subject: [PATCH 12/31] fixed map pin support --- pytilemap/mapscene.py | 2 +- pytilemap/red_pin.png | Bin 0 -> 1068 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 pytilemap/red_pin.png diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 3a09592..2f3cfd4 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -490,7 +490,7 @@ def addPin(self, lon, lat): Returns: MapGraphicsPixmapItem added to the scene. """ - pinfile = os.path.dirname(__file__) + os.sep + 'red_pin_36_36.png' + pinfile = os.path.dirname(__file__) + os.sep + 'red_pin.png' pixmap = QPixmap() pixmap.load(pinfile) item = MapGraphicsPixmapItem(lon, lat, pixmap) diff --git a/pytilemap/red_pin.png b/pytilemap/red_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ef1c1ba65d1c225f3a534bd2fa8f99f1b13211 GIT binary patch literal 1068 zcmV+{1k?M8P)`peDq)TkFAr(y(i7D191i?i7Q|ZA_^-voZiXH^fgHl1f zsTU9a!Gn77;Gu?AY16b7Drz*PwUXLuA+B12rKL$U63sR{`)_t<<~sS3ZSV^N zZ{ED$XWsk%e!nO1DGltajkiL)TZnjz4Bf1u1IXE0PtPjP`VR7cg7&YkO9WwkkhmT3 z!hP|UhdaZOEp0MHOiHRslT#iGo-=*AT=?{~=e~Ug=7Lb+hi!vRTO!dfpG$VGZ+PR?v1xd0gstg`{G`h zN&}ht4)22GHp86Wo$PE6uZn66KVU6ZzbaY1BU)bokO0@iJI^OO+auQi1JJ-wVx3_M z@lkzF4nWsXbK8I^Bsvff1qwp&la%}_B+&-YRvBinskMIqHUY>Oq;4_H4ljUH-w1!7lnYgj3}>03}SV+1ndumDMU@i zDrIb6);q!x1Z)71f-8;73Bln|m{?%G3HTxuVoJ&tJ5^c(cmVQut@E~4Wq+Vsdm1SW zSpW0`5}5ZKG|T|V5?nfK7w7yLZqu4Ol)?%61$1jozw%JEIYUS$iaAPf7(h^4 zXwIoFA434IRc#*fTr44|03`$)wc-=Igx{lCx5Alnar7jd_xG}VDH2_J<+|=f%?|)# zz?77HE5mHSW2@`^ZIn-=R<=4`TuSYQEPzbce4TYFk4_YGEBMAWK5gg1f^0{3cnuK5K7sCo*8W@MmhEqLnB6s#iO;&?mbSjKl*_S`o z`orLTxD3qHprddu<+(TYM$OxrWvC%=e?I%;F{kqEAe4hQ_KJu)^nzBWT7-Cfb2Ogt zceo)06D5m1g{5asz}ZYgI~r&L<_{Hf@6WiE6}7qGIUKMSKbwFt)}j|9Mz-9wQ5RA@ zx{&J8AH-YTU5F%CO;`ifYiiD^K7Fc`M*x=cI9DmZH-cWSxoc7y*bd@dGcj98_2}d4 zItur|-TxLRSNpK9cC%b^DkBxGIhw!x+XDR!1LtssH`0000 Date: Sat, 18 Aug 2018 08:30:58 -0400 Subject: [PATCH 13/31] fixed lines group - it was iterating over one too few lines in update --- pytilemap/mapitems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index d3128b8..18a2a39 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -575,7 +575,7 @@ def updatePosition(self, scene): x, y = scene.posFromLonLat(self._longitudes, self._latitudes) lines = self._lines - for i in iterRange(0, len(lines)-1): + for i in iterRange(0, len(lines)): lines[i].setLine(x[i], y[i], x[i+1], y[i+1]) def setLonLat(self, longitudes, latitudes): From 57f8c2ecc9c5dfaccf245d76dcdff4469165c8da Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Mon, 27 Aug 2018 21:15:32 -0400 Subject: [PATCH 14/31] mapscene rubberband drawing now is generic - has an enable to start and emits a signal when done --- pytilemap/mapscene.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 2f3cfd4..2f89f62 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -25,6 +25,7 @@ class MapGraphicsScene(QGraphicsScene): """ sigZoomChanged = Signal(int) + sigSelectionDrawn = Signal(float, float, float, float) def __init__(self, tileSource, parent=None): """Constructor. @@ -57,7 +58,7 @@ def __init__(self, tileSource, parent=None): self.rect_start = None self.rect_end = None self.rubberband = None - self.AOI = None + self.rubberband_enabled = False @Slot() def close(self): @@ -81,27 +82,22 @@ def setTileSource(self, newTileSource): def mousePressEvent(self, evt): '''Catch right-click events for rectangle drawing''' - if evt.button() == 2: + if self.rubberband_enabled and evt.button() == 2: evt.accept() pos = evt.scenePos() - #lon,lat = self.lonLatFromPos(pos.x(), pos.y()) - #self.rect_start = [lon,lat] self.rect_start = pos if self.rubberband != None: self.removeItem(self.rubberband) self.rubberband = None - if self.AOI != None: - self.removeItem(self.AOI) - self.AOI = None else: evt.ignore() QGraphicsScene.mousePressEvent(self, evt) def mouseReleaseEvent(self, evt): '''Catch right-click events for rectangle drawing''' - if evt.button() == 2: + if self.rubberband_enabled and evt.button() == 2: evt.accept() pos = evt.scenePos() lon0, lat0 = self.lonLatFromPos(self.rect_start.x(), self.rect_start.y()) @@ -110,19 +106,17 @@ def mouseReleaseEvent(self, evt): self.rect_start = None self.rect_end = None + self.rubberband = None + + self.sigSelectionDrawn.emit(lon0, lat0, lon1, lat1) - print ("creating AOI") - clr = QColor(100,240,240,100) - pix2 = QPixmap(100,100) - pix2.fill(clr) - self.AOI = self.addGeoPixmap(lon0, lat0, lon1, lat1, pix2) else: evt.ignore() QGraphicsScene.mouseReleaseEvent(self, evt) def mouseMoveEvent(self, evt): '''Catch right-click events for rectangle drawing''' - if self.rect_start: + if self.rubberband_enabled and self.rect_start: pos = evt.scenePos() #lon,lat = self.lonLatFromPos(pos.x(), pos.y()) self.rect_end = pos From 9a3f88336d85a8f78cdee22019ee2a63ca043959 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 30 Aug 2018 13:14:59 -0400 Subject: [PATCH 15/31] mapscene emits a signal when scene shifts/zooms, using custom tile cache instead of qnetworkdiskcache --- pytilemap/mapitems.py | 22 ++------- pytilemap/mapscene.py | 9 +++- pytilemap/maptilesources/maptilesource.py | 2 +- pytilemap/maptilesources/maptilesourcehere.py | 2 + pytilemap/maptilesources/maptilesourcehttp.py | 48 ++++++++++++------- pytilemap/maptilesources/maptilesourceosm.py | 3 +- 6 files changed, 46 insertions(+), 40 deletions(-) diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index 18a2a39..e82f89f 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -24,6 +24,7 @@ class MapItem(object): QtParentClass = None + def __init__(self): if not isinstance(self, QGraphicsItem): raise RuntimeError('MapItem must be an instance of QGraphicsItem') @@ -151,9 +152,10 @@ def __init__(self, longitude, latitude, radius, parent=None): """ QGraphicsEllipseItem.__init__(self, parent=parent) MapItem.__init__(self) + self.setFlags(QGraphicsItem.ItemIsMovable) - self._lon = longitude - self._lat = latitude + self._lon = longitude + self._lat = latitude self._radius = radius def updatePosition(self, scene): @@ -189,17 +191,12 @@ def setRadius(self, radius): if scene is not None: self.updatePosition(scene) - def mousePressEvent(self, evt): - print ("ellipse clicked!") - self.setLonLat(self._lon+0.0001, self._lat+0.0001) - def hideLabel(self): if not self._label_item: return self.scene().removeItem(self._label_item) self._label_item = None - class MapGraphicsRectItem(QGraphicsRectItem, MapItem): """Circle item for the MapGraphicsScene """ @@ -323,9 +320,6 @@ def setLonLat(self, longitudes, latitudes): self.updatePosition(scene) - def mousePressEvent(self, evt): - print ("poly line clicked!") #QGraphicsSceneMouseEvent *event) - class MapGraphicsGeoPixmapItem(QGraphicsPixmapItem, MapItem): QtParentClass = QGraphicsPixmapItem @@ -440,13 +434,11 @@ def updatePosition(self, scene): Args: scene(MapGraphicsScene): Scene the item belongs to. """ - print ("here") pos = scene.posFromLonLat(self._lon, self._lat) self.prepareGeometryChange() self.setPos(pos[0], pos[1]) if self._label_item: self._label_item.updatePosition(scene) - print ("updated label item") def setLonLat(self, longitude, latitude): """Update the origin coordinates of the item. @@ -463,12 +455,6 @@ def setLonLat(self, longitude, latitude): if scene is not None: self.updatePosition(scene) - def mousePressEvent(self, evt): - print ("image clicked!") #QGraphicsSceneMouseEvent *event) - #------- pop up a text item here - # First, a rectangle - - class MapGraphicsTextItem(QGraphicsTextItem, MapItem): """Text item for the MapGraphicsScene """ diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 2f89f62..85f84c1 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -26,6 +26,7 @@ class MapGraphicsScene(QGraphicsScene): sigZoomChanged = Signal(int) sigSelectionDrawn = Signal(float, float, float, float) + customSceneRectChanged = Signal(float,float,float,float) def __init__(self, tileSource, parent=None): """Constructor. @@ -174,6 +175,10 @@ def onSceneRectChanged(self, rect): self.invalidate() self.update() + lon0, lat0 = self.lonLatFromPos(rect.x(), rect.y()) + lon1, lat1 = self.lonLatFromPos(rect.x() + rect.width(), rect.y() + rect.height()) + + self.customSceneRectChanged.emit(lon0, lat0, lon1, lat1) def drawBackground(self, painter, rect): """Draw the background tiles. @@ -301,8 +306,8 @@ def requestTiles(self): zoom = self._zoom # Request load of new tiles - for x in iterRange(numXtiles): - for y in iterRange(numYtiles): + for x in iterRange(numXtiles+1): + for y in iterRange(numYtiles+1): tp = (left + x, top + y) # Request tile only if missing if tp not in tilePixmaps: diff --git a/pytilemap/maptilesources/maptilesource.py b/pytilemap/maptilesources/maptilesource.py index 92b3db9..87d6962 100644 --- a/pytilemap/maptilesources/maptilesource.py +++ b/pytilemap/maptilesources/maptilesource.py @@ -12,7 +12,7 @@ class MapTileSource(QObject): _minZoom = None _maxZoom = None - def __init__(self, tileSize=256, minZoom=2, maxZoom=18, parent=None): + def __init__(self, tileSize=256, minZoom=2, maxZoom=17, parent=None): QObject.__init__(self, parent=parent) self._tileSize = tileSize self._minZoom = minZoom diff --git a/pytilemap/maptilesources/maptilesourcehere.py b/pytilemap/maptilesources/maptilesourcehere.py index 33cd502..3e19d35 100644 --- a/pytilemap/maptilesources/maptilesourcehere.py +++ b/pytilemap/maptilesources/maptilesourcehere.py @@ -11,6 +11,7 @@ def __init__(self, tileSize=256, parent=None): MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=2, maxZoom=20, parent=parent) assert tileSize == 256 or tileSize == 512 self._server = 1 + self._cache_dir = 'api.here.com' def url(self, x, y, zoom): self._server += 1 @@ -34,6 +35,7 @@ def __init__(self, tileSize=256, app_id='DemoAppId01082013GAL', app_code='AJKnXv minZoom=2, maxZoom=20, parent=None): MapTileSourceHTTP.__init__(self, tileSize=tileSize, minZoom=minZoom, maxZoom=maxZoom, mapHttpLoader=mapHttpLoader, parent=parent) + self._cache_dir = 'api.here.com' assert tileSize == 256 or tileSize == 512 self._server = 1 diff --git a/pytilemap/maptilesources/maptilesourcehttp.py b/pytilemap/maptilesources/maptilesourcehttp.py index 1d6d647..d4f8301 100644 --- a/pytilemap/maptilesources/maptilesourcehttp.py +++ b/pytilemap/maptilesources/maptilesourcehttp.py @@ -8,7 +8,10 @@ from .maptilesource import MapTileSource from ..qtsupport import getQVariantValue, getCacheFolder -DEFAULT_CACHE_SIZE = 1024 * 1024 * 1000 +import os +from urllib.parse import urlparse + +DEFAULT_CACHE_SIZE = 1024 * 1024 * 16000 class MapTileHTTPLoader(QObject): @@ -17,7 +20,6 @@ class MapTileHTTPLoader(QObject): def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', parent=None): QObject.__init__(self, parent=parent) - print ("http loader: cache size = {0}".format(cacheSize)) self._manager = None self._cache = None self._cacheSize = cacheSize @@ -32,35 +34,46 @@ def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', self._userAgent = userAgent self._tileInDownload = dict() - @Slot(int, int, int, str) - def loadTile(self, x, y, zoom, url): + @Slot(int, int, int, str, str) + def loadTile(self, x, y, zoom, url, cache_dir): if self._manager is None: self._manager = QNetworkAccessManager(parent=self) self._manager.finished.connect(self.handleNetworkData) - cache = QNetworkDiskCache() - cacheDir = getCacheFolder() - cache.setCacheDirectory(cacheDir) - cache.setMaximumCacheSize(self._cacheSize) - self._manager.setCache(cache) + self._cache = './tiles' key = (x, y, zoom) url = QUrl(url) + #base = parsed_url.netloc if key not in self._tileInDownload: - # Request the image to the map service - request = QNetworkRequest(url=url) - request.setRawHeader(b'User-Agent', self._userAgent) - request.setAttribute(QNetworkRequest.User, key) - request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) - self._tileInDownload[key] = self._manager.get(request) + path = os.path.join(self._cache, str(cache_dir), str(zoom), str(x), str(y)+'.png') + if os.path.exists(path): + self.tileLoaded.emit(x, y, zoom, open(path, 'rb').read()) + else: + # Request the image to the map service + request = QNetworkRequest(url=url) + request.setRawHeader(b'User-Agent', self._userAgent) + request.setAttribute(QNetworkRequest.User, [key, cache_dir]) + request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) + self._tileInDownload[key] = self._manager.get(request) + @Slot(QNetworkReply) def handleNetworkData(self, reply): - tp = getQVariantValue(reply.request().attribute(QNetworkRequest.User)) + [tp, cache_dir] = getQVariantValue(reply.request().attribute(QNetworkRequest.User)) if tp in self._tileInDownload: del self._tileInDownload[tp] + zoom = tp[2]; x = tp[0]; y = tp[1] + + base = cache_dir + if not reply.error(): data = reply.readAll() + if not os.path.isdir(os.path.join(self._cache, base, str(zoom), str(x))): + os.makedirs(os.path.join(self._cache, base, str(zoom), str(x))) + fout = open(os.path.join(self._cache, base, str(zoom), str(x), str(y)+'.png'), 'wb') + fout.write(data) + fout.close() self.tileLoaded.emit(tp[0], tp[1], tp[2], data) reply.close() reply.deleteLater() @@ -92,6 +105,7 @@ def __init__(self, cacheSize=DEFAULT_CACHE_SIZE, userAgent='(PyQt) TileMap 1.0', self._loader = MapTileHTTPLoader(cacheSize=cacheSize, userAgent=userAgent) self._loader.tileLoaded.connect(self.handleTileDataLoaded) + self._cache_dir = 'cache' @Slot() def close(self): @@ -102,7 +116,7 @@ def url(self, x, y, zoom): def requestTile(self, x, y, zoom): url = self.url(x, y, zoom) - self._loader.loadTile(x, y, zoom, url) + self._loader.loadTile(x, y, zoom, url, self._cache_dir) @Slot(int, int, int, QByteArray) def handleTileDataLoaded(self, x, y, zoom, data): diff --git a/pytilemap/maptilesources/maptilesourceosm.py b/pytilemap/maptilesources/maptilesourceosm.py index 3487fda..bdf9efa 100644 --- a/pytilemap/maptilesources/maptilesourceosm.py +++ b/pytilemap/maptilesources/maptilesourceosm.py @@ -7,9 +7,8 @@ class MapTileSourceOSM(MapTileSourceHTTP): def __init__(self, parent=None): MapTileSourceHTTP.__init__(self, parent=parent) + self._cache_dir = 'tile.openstreetmap.org' def url(self, x, y, zoom): url = "http://tile.openstreetmap.org/%d/%d/%d.png" % (zoom, x, y) - #url = "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Aerosol/default/2014-04-09/GoogleMapsCompatible_Level6/%d/%d/%d.png" % (zoom,x,y) #{level}/{row}/{col}.png - print (url) return url From 79893f436ba4fbb86a6dee0bb781c3f982bded9f Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Tue, 27 Aug 2019 10:35:05 -0400 Subject: [PATCH 16/31] added geo svg to mapitems --- pytilemap/mapitems.py | 217 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 201 insertions(+), 16 deletions(-) diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index e82f89f..4062a11 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -6,7 +6,10 @@ from qtpy.QtGui import QPainterPath, QPen, QBrush, QColor from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ - QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem, QGraphicsTextItem + QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem, QGraphicsTextItem, QMenu, QAction + +#from qtpy.QtWidgets import QGraphicsSvgItem +from qtpy.QtSvg import QGraphicsSvgItem, QSvgRenderer from .functions import iterRange, makePen, izip from .qtsupport import getQVariantValue @@ -197,6 +200,53 @@ def hideLabel(self): self.scene().removeItem(self._label_item) self._label_item = None +class MapGraphicsRectShapeItem(QGraphicsRectItem, MapItem): + """Circle item for the MapGraphicsScene + """ + + QtParentClass = QGraphicsRectItem + + def __init__(self, lon, lat, width, height, parent=None): + """Constructor. + + Args: + lon0(float): Longitude of the center point + lat0(float): Latitude of the center point + width(int): width in pixels + height(int): height in pixels + parent(QGraphicsItem): Parent item, default None. + + """ + QGraphicsRectItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon = lon + self._lat = lat + self._width = width + self._height = height + + def updatePosition(self, scene): + """Update the position of the circle. + + Args: + scene(MapGraphicsScene): Scene to which the circle belongs. + """ + pos = scene.posFromLonLat(self._lon, self._lat) + + self.prepareGeometryChange() + # This object is centered on the lat lon point, so shift it by half width/height + rect = QRectF(pos[0]-self._height//2, pos[1]-self._width//2, self._width, self._height) + self.setRect(rect) + self.setPos(QPointF(0.0, 0.0)) + + def setLonLat(self, lon, lat): + self._lon = lon + self._lat = lat + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + + class MapGraphicsRectItem(QGraphicsRectItem, MapItem): """Circle item for the MapGraphicsScene """ @@ -232,9 +282,11 @@ def updatePosition(self, scene): """ pos0 = scene.posFromLonLat(self._lon0, self._lat0) pos1 = scene.posFromLonLat(self._lon1, self._lat1) + width = abs(int(pos1[0] - pos0[0])) + height= abs(int(pos0[1] - pos1[1])) self.prepareGeometryChange() - rect = QRectF(pos0, pos1).normalized() + rect = QRectF(pos0[0], pos0[1], width, height) self.setRect(rect) self.setPos(QPointF(0.0, 0.0)) @@ -248,8 +300,6 @@ def setLonLat(self, lon0, lat0, lon1, lat1): self.updatePosition(self.scene()) - - class MapGraphicsLineItem(QGraphicsLineItem, MapItem): QtParentClass = QGraphicsLineItem @@ -319,6 +369,103 @@ def setLonLat(self, longitudes, latitudes): if scene is not None: self.updatePosition(scene) +class MapGraphicsGeoSvgItem(QGraphicsSvgItem, MapItem): + + QtParentClass = QGraphicsSvgItem + + def __init__(self, lon0, lat0, lon1, lat1, svg_filename, parent=None): + """Constructor. + + Args: + longitude(float): Longitude of the upper left corner + latitude(float): Latitude of the upper left corner + longitude(float): Longitude of the lower right corner + latitude(float): Latitude of the lower right corner + svg_filename: Svg file name + scene(MapGraphicsScene): Scene the item belongs to. + parent(QGraphicsItem): Parent item. + + This will display an svg file with the corners geo-registered + """ + QGraphicsSvgItem.__init__(self, svg_filename, parent=parent) + MapItem.__init__(self) + + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + self._xsize = 0 + self._ysize = 0 + + self.x_mult = 1 + self.y_mult = 1 + self._renderer = QSvgRenderer(svg_filename); + self._border = QGraphicsRectItem(parent=self) + self._border.setPen(Qt.black) + + def updatePosition(self, scene): + pos0 = scene.posFromLonLat(self._lon0, self._lat0) + pos1 = scene.posFromLonLat(self._lon1, self._lat1) + self.prepareGeometryChange() + xsize = abs(int(pos1[0] - pos0[0])) + ysize = abs(int(pos0[1] - pos1[1])) + + rect = scene.sceneRect() + x = rect.x() + y = rect.y() + width = rect.width() + height = rect.height() + self.ul_x = min(pos0[0], pos1[0]) + self.ul_y = min(pos0[1], pos1[1]) + self.lr_x = max(pos0[0], pos1[0]) + self.lr_y = max(pos0[1], pos1[1]) + #self.scale(width, height) + + #print ("screen rect: {0}:{1}, {2}:{3}".format(int(x), int(x+width), int(y), int(y+height)), + # "img rect: {0}:{1}, {2}:{3}".format(int(self.ul_x), int(self.lr_x), int(self.ul_y), int(self.lr_y))) + + #if xsize != self._xsize or ysize != self._ysize: + self._xsize = xsize + self._ysize = ysize + self.ul_x = min(pos0[0], pos1[0]) + self.ul_y = min(pos0[1], pos1[1]) + self.setPos(self.ul_x, self.ul_y) + + # Scaled approach - does weird smoothing + def paint(self, painter, option, widget=None): + #print (self.x_mult, self.y_mult, self.orig_pixmap.width(), self.orig_pixmap.height()) + self._renderer.render(painter, QRectF(0,0, self._xsize, self._ysize)) + + def boundingRect(self): + return QRectF(0, 0, self._xsize, self._ysize) + + def getGeoRect(self): + ''' get geo referenced rectangle for this object + + Returns: + QRectF (upper left x, upper left y, width, height) + ''' + pos0 = self.scene().posFromLonLat(self._lon0, self._lat0) + pos1 = self.scene().posFromLonLat(self._lon1, self._lat1) + xsize = abs(int(pos1[0] - pos0[0])) + ysize = abs(int(pos0[1] - pos1[1])) + ul_x = min(pos0[0], pos1[0]) + ul_y = min(pos0[1], pos1[1]) + rect = QRectF(ul_x, ul_y, xsize, ysize) + return rect + + + def setLonLat(self, lon0, lat0, lon1, lat1): + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + +# end MapGraphicsGeoSvg + class MapGraphicsGeoPixmapItem(QGraphicsPixmapItem, MapItem): @@ -328,11 +475,15 @@ def __init__(self, lon0, lat0, lon1, lat1, pixmap, parent=None): """Constructor. Args: - longitude(float): Longitude of the origin of the pixmap. - latitude(float): Latitude of the center of the pixmap. + longitude(float): Longitude of the upper left corner + latitude(float): Latitude of the upper left corner + longitude(float): Longitude of the lower right corner + latitude(float): Latitude of the lower right corner pixmap(QPixmap): Pixmap. scene(MapGraphicsScene): Scene the item belongs to. parent(QGraphicsItem): Parent item. + + Show a pixamp with geo-registered corners """ QGraphicsPixmapItem.__init__(self, parent=parent) MapItem.__init__(self) @@ -341,10 +492,16 @@ def __init__(self, lon0, lat0, lon1, lat1, pixmap, parent=None): self._lat0 = lat0 self._lon1 = lon1 self._lat1 = lat1 + self._xsize = 0 + self._ysize = 0 self.orig_pixmap = pixmap self.setPixmap(pixmap) + #self.setPixmap(pixmap.scaled(2000,2000)) + #self.setTransformationMode(Qt.FastTransformation) self.setShapeMode(1) + self.x_mult = 1 + self.y_mult = 1 def updatePosition(self, scene): pos0 = scene.posFromLonLat(self._lon0, self._lat0) @@ -352,12 +509,39 @@ def updatePosition(self, scene): self.prepareGeometryChange() xsize = abs(int(pos1[0] - pos0[0])) ysize = abs(int(pos0[1] - pos1[1])) - newscale = QSize(xsize, ysize) - scaled = self.orig_pixmap.scaled(newscale) - self.setPixmap(scaled) - ul_x = min(pos0[0], pos1[0]) - ul_y = min(pos0[1], pos1[1]) - self.setPos(ul_x, ul_y) + + rect = scene.sceneRect() + x = rect.x() + y = rect.y() + width = rect.width() + height = rect.height() + self.ul_x = min(pos0[0], pos1[0]) + self.ul_y = min(pos0[1], pos1[1]) + self.lr_x = max(pos0[0], pos1[0]) + self.lr_y = max(pos0[1], pos1[1]) + + print ("screen rect: {0}:{1}, {2}:{3}".format(int(x), int(x+width), int(y), int(y+height)), + "img rect: {0}:{1}, {2}:{3}".format(int(self.ul_x), int(self.lr_x), int(self.ul_y), int(self.lr_y))) + + #if xsize != self._xsize or ysize != self._ysize: + self._xsize = xsize + self._ysize = ysize + self.x_mult = xsize / self.orig_pixmap.width() + self.y_mult = ysize / self.orig_pixmap.width() + if 1: + newscale = QSize(xsize, ysize) + print ("scaled: ", xsize, ysize) + scaled = self.orig_pixmap.scaled(newscale) + self.setPixmap(scaled) + self.ul_x = min(pos0[0], pos1[0]) + self.ul_y = min(pos0[1], pos1[1]) + self.setPos(self.ul_x, self.ul_y) + + + # Scaled approach - does weird smoothing + #def paint(self, painter, option, widget=None): + # print (self.x_mult, self.y_mult, self.orig_pixmap.width(), self.orig_pixmap.height()) + # painter.drawPixmap(0,0, self.orig_pixmap.width() * self.x_mult, self.orig_pixmap.height() * self.y_mult, self.orig_pixmap) def getGeoRect(self): ''' get geo referenced rectangle for this object @@ -387,8 +571,6 @@ def setLonLat(self, lon0, lat0, lon1, lat1): # end MapGraphicsGeoPixmap - - class MapGraphicsPixmapItem(QGraphicsPixmapItem, MapItem): """Item for showing a pixmap in a MapGraphicsScene. """ @@ -399,7 +581,7 @@ def __init__(self, longitude, latitude, pixmap, parent=None): """Constructor. Args: - longitude(float): Longitude of the origin of the pixmap. + longitude(float): Longitude of the center of the pixmap latitude(float): Latitude of the center of the pixmap. pixmap(QPixmap): Pixmap. scene(MapGraphicsScene): Scene the item belongs to. @@ -436,7 +618,10 @@ def updatePosition(self, scene): """ pos = scene.posFromLonLat(self._lon, self._lat) self.prepareGeometryChange() - self.setPos(pos[0], pos[1]) + rect = self.boundingRect() + w = rect.width() + h = rect.height() + self.setPos(pos[0] - h//2, pos[1] -w//2) if self._label_item: self._label_item.updatePosition(scene) From f864bcb1b83beba7a53c55a85b91f63a5aa1abf2 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Tue, 27 Aug 2019 10:36:04 -0400 Subject: [PATCH 17/31] added geo svg --- pytilemap/mapscene.py | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 85f84c1..68fa005 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -8,11 +8,12 @@ from qtpy.QtGui import QPixmap, QPen, QBrush, QColor, QPainter from qtpy.QtWidgets import QGraphicsScene, QGraphicsLineItem, QGraphicsRectItem, QGraphicsItem +from qtpy.QtSvg import QGraphicsSvgItem from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ MapGraphicsRectItem, MapGraphicsLinesGroupItem, MapGraphicsGeoPixmapItem, \ - MapGraphicsLabelItem + MapGraphicsLabelItem, MapGraphicsGeoSvgItem, MapGraphicsRectShapeItem from .maplegenditem import MapLegendItem from .mapescaleitem import MapScaleItem from .mapnavitem import MapNavItem @@ -37,7 +38,7 @@ def __init__(self, tileSource, parent=None): """ QGraphicsScene.__init__(self, parent=parent) - self._zoom = 15 + self._zoom = 8 self._tileSource = tileSource self._tileSource.setParent(self) @@ -418,6 +419,23 @@ def tileFromPos(self, x, y): tdim = float(self._tileSource.tileSize()) return QPointF(x / tdim, y / tdim) + def addRectShape(self, longitude, latitude, width, height): + """Add a new rectangle with fixed width/height + + Args: + longitude(float): Longitude of the top left. + latitude(float): Latitude of the top left + width (float): width in pixels + height(float): height in pixels + + Returns: + MapGraphicsCircleItem added to the scene. + """ + + item = MapGraphicsRectShapeItem(longitude, latitude, width, height) + self.addItem(item) + return item + def addCircle(self, longitude, latitude, radius): """Add a new circle to the graphics scene. @@ -515,6 +533,23 @@ def addPixmap(self, longitude, latitude, pixmap): self.addItem(item) return item + def addGeoSvg(self, lon0, lat0, lon1, lat1, svg): + '''Add a geo-registered pixmap to the scene + + Args: + lon0(float): Longitude (decimal degress WGS84) upper left + lat0(float): Lattitude (decimal degrees WGS84) upper left + lon1(float): Longitude lower right + lat1(float): Lattitudelower right + + Returns: + MapGraphicsGeoPixmapItem + ''' + item = MapGraphicsGeoSvgItem(lon0, lat0, lon1, lat1, svg) + self.addItem(item) + return item + + def addGeoPixmap(self, lon0, lat0, lon1, lat1, pixmap): '''Add a geo-registered pixmap to the scene From a07a65a2ed2023008f13f32db98c3b127ba53ad3 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Tue, 27 Aug 2019 13:01:35 -0400 Subject: [PATCH 18/31] better use of qt api in image scaling --- pytilemap/mapitems.py | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index 4062a11..58e1f81 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -3,7 +3,7 @@ import numpy as np from qtpy.QtCore import Qt, QLineF, QPointF, QRectF, QSize -from qtpy.QtGui import QPainterPath, QPen, QBrush, QColor +from qtpy.QtGui import QPainterPath, QPen, QBrush, QColor, QTransform, QPolygonF from qtpy.QtWidgets import QGraphicsEllipseItem, QGraphicsLineItem, \ QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsItemGroup, \ QGraphicsSimpleTextItem, QGraphicsItem, QGraphicsRectItem, QGraphicsTextItem, QMenu, QAction @@ -494,11 +494,7 @@ def __init__(self, lon0, lat0, lon1, lat1, pixmap, parent=None): self._lat1 = lat1 self._xsize = 0 self._ysize = 0 - - self.orig_pixmap = pixmap self.setPixmap(pixmap) - #self.setPixmap(pixmap.scaled(2000,2000)) - #self.setTransformationMode(Qt.FastTransformation) self.setShapeMode(1) self.x_mult = 1 self.y_mult = 1 @@ -520,28 +516,17 @@ def updatePosition(self, scene): self.lr_x = max(pos0[0], pos1[0]) self.lr_y = max(pos0[1], pos1[1]) - print ("screen rect: {0}:{1}, {2}:{3}".format(int(x), int(x+width), int(y), int(y+height)), - "img rect: {0}:{1}, {2}:{3}".format(int(self.ul_x), int(self.lr_x), int(self.ul_y), int(self.lr_y))) - #if xsize != self._xsize or ysize != self._ysize: self._xsize = xsize self._ysize = ysize - self.x_mult = xsize / self.orig_pixmap.width() - self.y_mult = ysize / self.orig_pixmap.width() - if 1: - newscale = QSize(xsize, ysize) - print ("scaled: ", xsize, ysize) - scaled = self.orig_pixmap.scaled(newscale) - self.setPixmap(scaled) - self.ul_x = min(pos0[0], pos1[0]) - self.ul_y = min(pos0[1], pos1[1]) - self.setPos(self.ul_x, self.ul_y) + self.x_mult = xsize / self.pixmap().width() + self.y_mult = ysize / self.pixmap().width() + self.setPos(self.ul_x, self.ul_y) + #self.setPixmap(self.orig_pixmap) + t = QTransform().scale(self.x_mult, self.y_mult) + self.setTransform(t) - # Scaled approach - does weird smoothing - #def paint(self, painter, option, widget=None): - # print (self.x_mult, self.y_mult, self.orig_pixmap.width(), self.orig_pixmap.height()) - # painter.drawPixmap(0,0, self.orig_pixmap.width() * self.x_mult, self.orig_pixmap.height() * self.y_mult, self.orig_pixmap) def getGeoRect(self): ''' get geo referenced rectangle for this object From 3db839a559e7c2c8abb0c9fa9ee6e8ba580b6a1e Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 29 Aug 2019 07:49:02 -0400 Subject: [PATCH 19/31] added GeoPixmapItemCorners --- example/main_gs.py | 27 +++++++ pytilemap/mapitems.py | 183 +++++++++++++++++++++++++++++++++++++++++- pytilemap/mapscene.py | 24 +++++- 3 files changed, 231 insertions(+), 3 deletions(-) diff --git a/example/main_gs.py b/example/main_gs.py index 4ae938c..8459b13 100644 --- a/example/main_gs.py +++ b/example/main_gs.py @@ -8,6 +8,7 @@ from pytilemap import MapGraphicsView, MapTileSourceHere, MapTileSourceOSM + POINTS = [(44.837632, 10.201736), (44.837621, 10.201474), (44.837594, 10.201205), @@ -130,6 +131,32 @@ def __init__(self): pin_item.setLabel("
Pin Item
",html=True) pin_item.showLabel() + lon0r = 10.06 + lat0r = 44.83 + lon1r = 10.110000000000001 + lat1r = 44.743397459621555 + lon2r = 9.936794919243113 + lat2r = 44.64339745962155 + lon3r = 9.886794919243112 + lat3r = 44.73 + + pin0 = view.scene().addPin(lon0r, lat0r) + pin1 = view.scene().addPin(lon1r, lat1r) + pin2 = view.scene().addPin(lon2r, lat2r) + pin3 = view.scene().addPin(lon3r, lat3r) + + clr = QColor(0,255,0,100) + pix = QPixmap(100,100) + pix.fill(clr) + + + view.scene().addGeoPixmapCorners(lon0r, lat0r, + lon1r, lat1r, + lon2r, lat2r, + lon3r, lat3r, + pix) + + lats_2 = list() lons_2 = list() diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index 58e1f81..546b982 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -16,6 +16,33 @@ SolidLine = Qt.SolidLine +""" +def order_points(pts): + '''https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/''' + import numpy as np + # initialzie a list of coordinates that will be ordered + # such that the first entry in the list is the top-left, + # the second entry is the top-right, the third is the + # bottom-right, and the fourth is the bottom-left + rect = np.zeros((4, 2), dtype = "float32") + + # the top-left point will have the smallest sum, whereas + # the bottom-right point will have the largest sum + s = pts.sum(axis = 1) + rect[0] = pts[np.argmin(s)] + rect[2] = pts[np.argmax(s)] + + # now, compute the difference between the points, the + # top-right point will have the smallest difference, + # whereas the bottom-left will have the largest difference + diff = np.diff(pts, axis = 1) + rect[1] = pts[np.argmin(diff)] + rect[3] = pts[np.argmax(diff)] + + # return the ordered coordinates + return rect +""" + class MapItem(object): """Base class for each item in the MapGraphicScene @@ -466,6 +493,159 @@ def setLonLat(self, lon0, lat0, lon1, lat1): # end MapGraphicsGeoSvg +class MapGraphicsGeoPixmapItemCorners(QGraphicsPixmapItem, MapItem): + ''' + A pixmap that has all 4 corners specified so it warps to the map + ''' + + QtParentClass = QGraphicsPixmapItem + + def __init__(self, lon0, lat0, lon1, lat1, + lon2, lat2, lon3, lat3, pixmap, parent=None): + """Constructor. + + Args: + lon0(float): Longitude (decimal degrees) of the upper left corner of the image + lat0(float): Latitude of the upper left corner of the image + lon1(float): longitude of the next point clockwise + lat1(float): latitude of the next point clockwise + lon2(float): longitude of the next point clockwise + lat2(float): longitude of the next point clockwise + lon3(float): latitude of the next point clockwise + lat3(float): latitude of the next point clockwise + pixmap(QPixmap): Pixmap. + scene(MapGraphicsScene): Scene the item belongs to. + parent(QGraphicsItem): Parent item. + + Show a pixamp with geo-registered corners + """ + QGraphicsPixmapItem.__init__(self, parent=parent) + MapItem.__init__(self) + + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + self._lon2 = lon2 + self._lat2 = lat2 + self._lon3 = lon3 + self._lat3 = lat3 + self._xsize = 0 + self._ysize = 0 + self.setPixmap(pixmap) + self.setShapeMode(1) + self.x_mult = 1 + self.y_mult = 1 + + def updatePosition(self, scene): + + # 1. Get pix coords for each lat/lon point + pos0 = scene.posFromLonLat(self._lon0, self._lat0) + pos1 = scene.posFromLonLat(self._lon1, self._lat1) + pos2 = scene.posFromLonLat(self._lon2, self._lat2) + pos3 = scene.posFromLonLat(self._lon3, self._lat3) + + + self.prepareGeometryChange() + + # 2. Get height and width in pixels + import math + h = math.sqrt( (pos3[0] - pos0[0])**2 + + (pos3[1] - pos0[1])**2 ) + w = math.sqrt( (pos1[0] - pos0[0])**2 + + (pos1[1] - pos0[1])**2 ) + + # get horizontal rotation in pixels + a = pos3[1] - pos0[1] + + # solve for rotation angle + ang = math.acos( a/h ) * 180 / math.pi + + # CHECK IN LLA + #h2 = math.sqrt( (self._lat3 - self._lat0)**2 + + # (self._lon3 - self._lon0)**2 ) + #a2 = self._lat0 - self._lat3 + #ang2 = math.asin( a2/h2) * 180 / math.pi + + xsize = abs(int(pos1[0] - pos0[0])) + ysize = abs(int(pos0[1] - pos1[1])) + + rect = scene.sceneRect() + x = rect.x() + y = rect.y() + width = rect.width() + height = rect.height() + self.ul_x = min(pos0[0], pos1[0]) + self.ul_y = min(pos0[1], pos1[1]) + self.lr_x = max(pos0[0], pos1[0]) + self.lr_y = max(pos0[1], pos1[1]) + + self._xsize = w + self._ysize = h + self.x_mult = self._xsize / self.pixmap().width() + self.y_mult = self._ysize / self.pixmap().height() + + # Set the image to 0, 0, then use a transform to + # to translate, rotate and warp it to the map + self.setPos(0, 0) + + # Method 1: tranfsorm and scale + if 0: + self.setTransformOriginPoint(self.ul_x, self.ul_y) + t = QTransform().rotate(ang) + t.scale(self.x_mult, self.y_mult) + self.setTransform(t) + else: + pts = self.boundingRect() + t = QTransform() + poly1 = QPolygonF() + + poly1.append(QPointF( 0, 0 )) + poly1.append(QPointF( w, 0 )) + poly1.append(QPointF( w, h )) + poly1.append(QPointF( 0, h )) + + poly2 = QPolygonF() + poly2.append(QPointF(pos0[0], pos0[1])) + poly2.append(QPointF(pos1[0], pos1[1])) + poly2.append(QPointF(pos2[0], pos2[1])) + poly2.append(QPointF(pos3[0], pos3[1])) + success = QTransform.quadToQuad(poly1, poly2, t) + if not success: + logging.error('Unable to register image') + t.scale(self.x_mult, self.y_mult) + self.setTransform(t) + + + def getGeoRect(self): + ''' get geo referenced rectangle for this object + + Returns: + QRectF (upper left x, upper left y, width, height) + ''' + pos0 = self.scene().posFromLonLat(self._lon0, self._lat0) + pos1 = self.scene().posFromLonLat(self._lon1, self._lat1) + xsize = abs(int(pos1[0] - pos0[0])) + ysize = abs(int(pos0[1] - pos1[1])) + ul_x = min(pos0[0], pos1[0]) + ul_y = min(pos0[1], pos1[1]) + rect = QRectF(ul_x, ul_y, xsize, ysize) + return rect + + + def setLonLat(self, lon0, lat0, lon1, lat1): + self._lon0 = lon0 + self._lat0 = lat0 + self._lon1 = lon1 + self._lat1 = lat1 + scene = self.scene() + if scene is not None: + self.updatePosition(self.scene()) + +# end MapGraphicsGeoPixmap + + + class MapGraphicsGeoPixmapItem(QGraphicsPixmapItem, MapItem): @@ -520,10 +700,9 @@ def updatePosition(self, scene): self._xsize = xsize self._ysize = ysize self.x_mult = xsize / self.pixmap().width() - self.y_mult = ysize / self.pixmap().width() + self.y_mult = ysize / self.pixmap().height() self.setPos(self.ul_x, self.ul_y) - #self.setPixmap(self.orig_pixmap) t = QTransform().scale(self.x_mult, self.y_mult) self.setTransform(t) diff --git a/pytilemap/mapscene.py b/pytilemap/mapscene.py index 68fa005..accb283 100644 --- a/pytilemap/mapscene.py +++ b/pytilemap/mapscene.py @@ -13,7 +13,7 @@ from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ MapGraphicsRectItem, MapGraphicsLinesGroupItem, MapGraphicsGeoPixmapItem, \ - MapGraphicsLabelItem, MapGraphicsGeoSvgItem, MapGraphicsRectShapeItem + MapGraphicsLabelItem, MapGraphicsGeoSvgItem, MapGraphicsRectShapeItem, MapGraphicsGeoPixmapItemCorners from .maplegenditem import MapLegendItem from .mapescaleitem import MapScaleItem from .mapnavitem import MapNavItem @@ -566,6 +566,28 @@ def addGeoPixmap(self, lon0, lat0, lon1, lat1, pixmap): self.addItem(item) return item + def addGeoPixmapCorners(self, lon0, lat0, lon1, lat1, lon2, lat2, lon3, lat3, pixmap): + '''Add a geo-registered pixmap to the scene using 4 lat-lon corners + + Args: + lon0(float): Longitude (decimal degress WGS84) upper left of image + lat0(float): Lattitude (decimal degrees WGS84) upper left of image + lon1(float): Lat of next point clockwise + lat1(float): Lon of next point clockwise + lon2(float): Lat of next point clockwise + lat2(float): Lon of next point clockwise + lon3(float): Lat of next point clockwise + lat3(float): Lon of next point clockwise + + Returns: + MapGraphicsGeoPixmapItem + ''' + item = MapGraphicsGeoPixmapItemCorners(lon0, lat0, lon1, lat1, + lon2, lat2, lon3, lat3, pixmap) + self.addItem(item) + return item + + def addText(self, longitude, latitude, text): """Add a test item to the graphics scene. From 614ef5ca0a53052622a9ca8fb868d82c3827d3bd Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 29 Aug 2019 09:41:39 -0400 Subject: [PATCH 20/31] updated readme --- README.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f5d2dae..d2514f7 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,26 @@ # PyTileMap -Tile map visualization for PyQt4. +PyQt Map System forked from: -This project allows the visualization of Open Street Map, HERE and other maps -in a PyQt4 GUI. +https://github.com/allebacco/PyTileMap -The project has been inspired from of https://github.com/emka/python-lightmaps. +Simple to use map widget that can be used in a PyQt GUI. + +# Example: + +examples/main_gs.py + +Provides the following types: + +- MapGraphicsLineItem - a line between two lat/lon points +- MapGraphicsPolyLineItem - lines between a series of lat/lon points +- MapGraphicsPixmapItem - place a pixmap at a given lat/lon (does not scale with map zoom) +- MapGraphicsTextItem - place text at a given lat/lon +- MapGraphicsLinesGroupItem - a group of lines +- MapGraphicsCircleItem - draw a circle centered at a lat/lon +- MapGraphicsRectItem - draw a rectangle given upper left and lower right lat/lon (scales with zoom) +- MapGraphicsRectShapeItem - draw a rectangle with a fixed with and height (does not scale with zoom) +- MapGraphicsGeoSvgItem - draw an svg given upper left and lower right lat/lon (scales with zoom) +- MapGraphicsGeoPixmapItem - draw a pixmap given upper left and lower right lat/lon (scales with zoom) +- MapGraphicsGeoPixmapItemCorners - draw a pixmap given all four lat/lon corners (scales with zoom) +- MapGraphicsLabelItem - a label that is attached to another map item From 1ec96122cb2b5c7804a8bb02f9892cb418851f3d Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 29 Aug 2019 09:42:34 -0400 Subject: [PATCH 21/31] more readme fixes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2514f7..393ecb7 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Simple to use map widget that can be used in a PyQt GUI. examples/main_gs.py -Provides the following types: +# Map Widgets - MapGraphicsLineItem - a line between two lat/lon points - MapGraphicsPolyLineItem - lines between a series of lat/lon points From d3aaae2e60b12d8e44b0c5282d9a39094559aef7 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 29 Aug 2019 09:44:16 -0400 Subject: [PATCH 22/31] adde screenshot --- screenshot.png | Bin 0 -> 701205 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshot.png diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b45c566f2c8cb490978d9d021edae5b25ff94e7e GIT binary patch literal 701205 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

6t{9_a6@rM$pkAX(aFvaJj@p|HL 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%0DdM#+e*& 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≷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 B zdw>L$LJ`RF`|4PyPapo~KnHwFW=2#H5=um=4Z)lO4_%DrmIyjdm^3JZd=uwYf^h9q z%44!PIt^O0`eT{5z;Ol4Faiz&8G=x4{|vW@K(wioz{43sc|TMwV|uD}d2--N@N{&3 zNN6nOdW*1>axCfx473D=xlwCN_CjuGnbX2P%(N=(iU)j7PW#`)0 zC6KxlqHTu}Fm@go)TmMw*PCrzb+WMs)7p1SP)VSXfB{sc0{>I+!TfaT>Yf0&uLPOf zco+_obVA@cH@YJ_B$+hunxo7cj~oCsj)v1Vm4P|qM9m#aNm?!&kQ)gS@iCg}G|&4$-ZTxr$8;kt*RBGj<`1My(69tw0xR(>U1 z=$3}#!v@d52Lm?1z;*Lrd$_Kto)`ug@0ZWa=h64icc-F9zE{Ta{p2N7LWg-Rb~4YB zp%iBoj*Lr+G2N$=s?GBk5pKryM<3#(H|>oTbwZ=m;kF8%YMG8reB1Ldi$6k1HQpa`kCNro82F zjapfe2pxN$9JsgBuYz$60Lbjn(P~P32R4z(o`|8h(|yr%^UfjZ7)ge=pmc{JU|HI3 z$#8HWoD|5zeXwT`U68A3D(508_tlEY(J% zo(SLPDz#ueTzOKalzX}uW`fKfCWn!<0oZnMBd>TVkVi~*bErUArm$XJ>^vF zdE>0^I!v1ON2ZBI3Odf*6Y5BC+!1)r0WD11fepHfvuA}R6e^wJhH!jN?elzA)87e5 zeBJ27cmPO1yhAzoKF&grXBc){IL9aXmr`fQlN2kV+ExGN4dOZA;HWxz@0`52>P_PJ zh(!trYNBSU&5XjFh=iMv7@w zx6agx5IaJ z{tjH^CVvu?cQE|;b9!YzY+!1*k-2BfGf&I7C8%3&f*kRy7t?D z0oKpp?)RM!4Z!H>?#06BpzOb7q3M%jA&|}8*G=1o(}&Mtw|Vd(i_Ho@w;b?+msINL z=z`sBp6q|X0$Kg>X9lE9gT2e#xiic@CcOaT?*haq@L>9a!u)XhCV-mak|O!=gHL3? z#q;6CHC;aXaE)x;S_2pA6$Ze?W85-}tr#;DB(Q$AO|~zF5pwWci9mt>2)sC+Fb&nL z*fuzaD6!ou(9kf}#W3cvft$v2n*^$9)$OdqVnRkt<8%97n2+~L{+8a)se(sa50V3_ z5@4?dY2{hJddCDh*eT9PJ}$cN1FQyM)gCG`4(PyV#*Gc?5>zP1R1fU*ly*>+ii0pI zBMD%mVzF%B@s7-%dvv%c4lHHaP<6oALSy9qU_@jUPBeuRGH9WyrjUB#BxJ^viJ3Un zu4Bl&k@V=!QJU-wDz$;nu@d%~(=m`oji=q|?Q4Cfc9?xmMxB2OfHY3;g)9O=hjeyI zqrV0X5IcnTcA}HQ&p1?)NGaH18_wadduWIFvXZ1N0j>_E)ZAzN;N*iUSG1`L1s3pM z!Z`Q$^vQrX)%5J1 z`XhH{9}R(xc&MxJk3^4tj3W_zkaiB%m{ol`K2XrXaA(!UvFmX&Q;fHX>Qu>N+2V^! zh1*z1Eoacv592wg2x2+hA1uYL-!LYRZ--3-2X8P4kb1QTu_>Mx?F3`RM3jh?+wO+d z@T)U5dSZQ~tlqZm;sub8v@kH_K;=}6vPr!+vAOYmlWbSAyfzbv2j1oI=NpAVAnZ4& zHWke#GUb;~{%;>IZ~yeSa=?)X8L3D8>(5J}3wTUctAdS*zzFlI)Wa@^%z*nnFrF$^ zs@9Ecy&XzZ0$?l%o=M}GW@;8TNDI^?21lR*hCV-4;`r;Gqzz4_ z95MxDthqo(SFyEC4O7Xs+iA3|#{x>bT^KSbkkPz+?|oghQQoX5?TAI?C5;G9kZqrP zWY!_hB2cV!b{M5XUD)xt8GHhP*+k!o-hGBg9Zx$dnISkJBTmwVKf7!_S4JuctF?jN z<|yDnW=>b7HN9E=)e9Ue()TjVmlKp^R7@DAk_s#7Zk_h@cc6_psw;Lz?@&Ip8K6~w zIsVHc?%74^fzY64^N>9A!DiVbqfPGn!D2aK?q<34)^7?Kb`m%8yzlOZf)-~Hno1yJBZjEl(Mkk9FWM1kM19}+T3n7yz8>jVhM z%FdGY>o&;-{1ripk>!srzr7uswL;3l{kb^*WMqsV^^1xNOdUP|nh{6?NJC(tcGmAO z(g8{cY$}3;gv9h*sOG&9%n)>tN&rN*ZQEgh2NxqaMsgv5{I*TnCQX=24&cZ>oW&lK z7v)f5LI6Np4rea4OB;XAd^%3MV}qz~2>s0uphs!NR6JkN16n-!rc_6$;4ag1?WuDi z;&B=*kxeX0Oo)^BHnzgo^^nY-5qp5JnO{BxSE0CCGK>K~1KZFObl7C4XE^tM;0lbb z>zbER0-KNMN!l)BSLbfEt6im!6|XDpjMJ50J=c|Y%|`~F10kPHnSG7ZqjnDan&$)@ zZYmE=r1gUv!cp$`#t7b*0*i1$oajBUPLlh6H4pE36ss}`03M{|^6Aj*m?o*IezQW& zFfz#`A9QP#2sjuXYZczTTCcbpuO>|P3O;yh!@Mgqt}EVrUOwMY2)NnLFaR+7`GZeL z?tiTo|E5}qN}(qVrgGzP0clGemBAcHKdLHa+R~*^6^R~XcoSnG-`4SPJ6AbUC5y)n zFs^jNH;5Dcp7dD7Jvx-CQUT1sq-19RropFa(BtUJGaf9CCX0F0csDqn3b4@kI;qql zX04M4jsjp0VTaxL!V;*eTR0f>qp#2wz)e)k zN=l2gG4;r$={SMeY8o2;MUP{Ue3xQV!-& zx5Q*pe!cIh965fdij}%Kj+Kw;NMtw&I%qhpV^6H~R6DX&++wBCFm(c;*KSW!3@6Al zgf?e0Jql1v7~%-9G%Z!PsK&+hNWO1^xuhV}sbQSYI!NRNYC4@~GXbHWlcquX-tSx_ z4_4SwyFAatejBuFV%hrMm`T;F2rB4O)C(hV5&?&8Sgw){6Y2V~89aKo>SHH#k=El1 z4qw{k6X;-(-7tcafsa^Hj&OmYla63LwyTZIzYHdWsWu&&o^|Ry*w3T!Q#l@b=whjw zwTB#g^zm}q8JEe-^f;)ik1%saW9gFgoB~s(C#eih zh+^}jCINnuu?LKs$m>wWh}7HTG_dTPY)ONmd@5Z09|&nib7PBq`pH@;fwZEsvMj0y zs!(y|-`)S|m6a3(KRYryXzV6<-3MSpsl{IN<^oXoWb2k122V;+{R{n_?U=;-HfBfQe$Ny`)q{0nca`rSWKkC>M7>1}Y5y&ZCEX)yu+@mK&VJDt~vw zz9@sHk`CTCkt)@pCX+sBoH7zNgRBg`-a9)-x({v*hdaVdoyOTmGJO?kdxypHb{x-D zVqw>1r%}McFg=flq4;n}U!CE+PUu6Yf{vA8er+gJcBd{a|AVY}0Bz$0I$ZN#m`Oa%Bees_;Uly-n|o1W~fxZC;p zK9p&+!>4lI1Ap>aK4;a3iwa2tiBjL%B*nP}VXsJenb}f5)C$G{<3#`~K_T$L@|CgF zy1YYKkexvt6H>V(90Tw>L`es!4U&(-^b)uV&64N;@uGYLk+v7BSF|_UW6xRAGE^rc z0Wd-Ml+%(Ni3?SEI0+qk^m0f)qJal@D^K^ALp>BKO(Ec|_rW8_Go3_M)rhpCO^~=L z+LCEwvb_Q=SCBiU3Y)MlJC;Q+kEknq~^M~_2XSa3SoR6qsO@{egr z{}T{G&=LRa3oxY608&~`r9Aq*)kYFR*RUjImT9lx#VV>d=tw(C()g~& zGs`AZj351m+p&9fWrj1xXfoO}DJcNaYaaC(6o?YQ@&2?-JFR_ACZDt`@WJoH6@PtZ z1s%%lunhG|6{}8d-%O{ZV1(CP{UkF&Kt~WahCLm8*qe)_b=dB68BP_%+D~hwe3tW$ zJw+u9-fbc;!ROO)TMOVjnb8~d@H zkO($xQt;sh5_TH*MuprfB->Zy+&5OZ6=2!VVdtO9xk?i~BirSHpFe=Tf}q|8L-W-y8 z%4ion`Nc0}5SVWK!0TnI-4QIXP1#) zc1A#c?pfcL=U;+)-LwP3eaj6xxcRo{r9dgTFOI}5!j7ES;`gJcdMw7Ms8!0QIH znuyM%#>$$9M+F^fp-&((f*Vq5>uE;&S}V!vh0Yf0Y!EK-6bF-?n0WrTNLQ7)+D6b} zlMc?h0?#-F9hy!70rTs`qH#QC`-&w1U+VE=j;^g8r{}CE85`qK|G6B4RSgC!G7}8v z`OAu)$ly8E z(fG&4%KOxNWJfn~co$P4=F|7bXVG)b%g)udsYaU4`LSFX4~7%{&pkXD75NVvJq+vLkm7~-3~je~IIYqgvpfShrohwN z81$0i?Zo4(%nS?-NCJ3eEQI_^h>`<(X45vQmGIqvscKhTmP>|M2gJ6f#P;SeyHl5T zXkH$BMq9B)=S(KNrj1wDXl596P<4Xeyex4KGj?>xHRHJ)XAKJe?E%nnObM5T!KnEM zzyJUwX-PyuRIYFv>qH$~;o~5f1uq&8-1`@-Jk`qSXCE)U9Ru>qo9>g#t~g(2Eh@*r z>_wYMF#{;?hji=8pE@V_wHdAC>HA1s&3mTLalmzxGFE-VaWX5He@;ux^ikIq3pN=o z5~!;RXKQV05#R6z$xo<=+F?ALAavs1%Y(pSGVs9f!#?LGJ8ZK2?tFSZ28Oluo%PHyis7>hh1~6-VW@MiBrj!|6&o>7|yVQU`i{>V|`n*6vQsXK#qAX7QjYj-QOOSwR?R>>cCUapPM7Uy!Ick_1H%izV-|> zBDk=eAaA_>fjn^kpJljVv-msH<&t|>%0Z}xeFIYIw*mKN;;W+J7 z($cVVJksv7U@vKFX*Y)BWcUN{#x-}(YGyaY){u&gBWKU8h6LjiV;ho;`H+2uK*Qrn z4y8mtf+S3-AU{uPw(c-e4~9`9I~lQVdjEXu%@0f+EPwujc}Bvai^I09g#j3N4GQ*c z(4pg@U7wkg&?gwTZrx_6C3efKIaN>#8^wgU_50bf`@R2bg61k#r+DdPAb|vR>N^F~j%* z6i^J&$R&jCyBh&IM&L1LbU+&GSEIxDC76^Yc@&>w6G86h!TLCl8r|?18wQ#i`I3L! zjGe7wrB&%9!)slI*T%vy`yKF_q~ODyp6J#t&q*Eqn*xqjS91tHwuB}(tw$Miy$2g~ z_{>BwBxw+Zg98vBj=lNCMshQl22MFdENd752RIq4$OGm(;nU$8a78g%)M-mJG(V5- zccox~x|Mb#o@^3fIn2lR#6Nu|hU+!M2C$3zXJ=h07lCpGo?q{-_j0Rnb^D+pLC9wK5N;JyrFx^9;pB-X^~p$91+1GPU{**&dvJ zGQMrtWx3C3P_8a&8AlIx9lcN|qGc(F^=$0;2zxQif(IuI>R832VLDhs*oDB}D2|g7 z+X21@RHQP4(*S7NO&EV@v%yK8t8VRBf%=bUUy(mNdb?zY)awRDz9Ikq$P@C*1veX@ zdfhd*%94W?%cFmOQvUepJ@TW=u9KC&y1{^vpZ@q($7>4~Sk5``8?tzQwP9|4bj5YD zblCy&!t<+4y|?`GI^)`tpkvKv8|A^@+-(N;neYa4<(2;?fzEnK8-hoy@Ld7~FDf-x z%>&pO8)|y_N#j>~dq*OwrDU3?0vIL&Cdzd4z41?(aqE^QJSFJpe&mHH(6OnZTjrc_ zaLhcaD#b|l3EOj0ENPJzqT{1p^T@Jjm`g@XS6>;f0E6cwK94@56Cy&;VUwG|?~H@H zT!}CoOw0B+HaaBRh8$2bGsl_hI-tW&)hz{`Oc#sXb;gox*!g(RZgK+__gHDyP1UIq z*sx87D9y>HS3wTyAkNDZfetb^3MRB{tylAFxR#~YbZ#U^i^2SHsP?+O}vyGSe(irDHaTWg1?q+MMas2qQzIphG1bWWp5y zFrPBz3QTydVT`wF3_MC47An3dX}M(BxXQ0yeaO7+=&$>t#YW|$$GX8@N3x^!X#)4P zhVSb5(1W*P4~`-O=z4EFU9LIxt8&2f--ogtCy%`QYdL9N1T22#D+dez-dMR*Hp{hg z(18nO@#0q{H!fSw{e6SH+xnnvy7({h5!(H8Fa6b&!?&7%y)Kf|a%JP{zhQwFbAjJc z>*;{^$MVW_8EB1tr+ZCHk?q@@KD2E4l5vT+P*q+w4J-V`rroOqsSw_#ii!%%wgQxB za9(5DLl0XDUc#CGN+2cSALD31PN3jRa-;++zJj{qoUx6bsB~UDWa$A0M7sCkIQ)oZ z;d`5dc|nO17aFB=djm>jNE`=k()(eU8+2&Bc6y$3aYy^_AQtm?Y_F50D-JZ{rXw+N z%pIs2M&QL~ubNpQ1u&RzY;2Mm*qSJn;vQKR!wL#={liY%+|#;K?eBs8-O< zg2Yu9N;6^&HYNdnR7|aIa2c+H6hVpE5D;jXl^U-lT)G7n6zzk}f}GJPh>qRg2?NjR zS<-@)3Zs4z+T6uEmTzoB+GU%`7wd=ODFrkdAB$nuIQP*FHZ-2P<4R<9$@r2fW+4j=r9>yGa{(g59U3*rVF z*o*^6fMCOi4g-LfADIN4CayI_j$_z#&j*#I9z3^B)Cuv}AP$|+t?Ht=Y=e8=t4fCS zeJOBY<7S!ewxr-h@81R;tb^~@e#b12Y2Uc+F1ZYnheSw%oS{PRDEc^SlQ#?j%NsQ0 zJQ%~YdtnFa*Z%mhoO{_lvS4&E+Iavg=hzG@q+-K&uN_xQV_Y}%srjvxGUFn^jqi@+ z25FjhcaD6g6TNRO$Ehcx(l(KVO4GZKu|S8}og9k@<~q{a zFw~_@9Z4w)<}MSt^pm}IyZ>lmoIawtL4@;cWF{tvt})v0_4fPzq`#am76wgHDg{d&?)C% zdWOlnV^fX%@QR zXmL4z(d=qj?pF) ze)tVHc7Cjv6CU-R^j_?Qj3f960v4qwj0dDqX~CrMUflO#r{Ov6K7S>Ouh+(88Fj4gF5Fa0r4%%u~d*+RypAASi3{OMO0wtJOj&_=8-m~sb z&NQ?gA&=qlIJP4MAU60QAf);j+foFaIQvNuXehAYeSJ}*Yl2a4XmNz)#3EhM<%+MK zYdQ@hJ7J_jh#(js5San@!IRzBRKA7Qt*?mA}IV zx`pHAaCKC@4#QSOr~FYxYU0AL4<(EN_HgVU06VjMVSD(?7t)EzaFgayNP@Q z7rT`xk>xl*ce3ou>Z!`%F(Ss?aVYC!sAd~U2Y42$TFu_0+5oVTpaa z@J6}wH#Zww4uT8r{C?^;PLv@?^=!KG>hD1fEnBwL)XDe0bA&5s>19a%QjT58t8 z_df=zoLt941*I(Z>PI`U5MB1V_X~*yI#~a%7(g;esxz+!%p9C;hEFF34y;HX#Q<~g zwwY{YoLRSwEQaGWr+;mTNST#i_E3Jnea*QBj)EAzd8OJ|T0Dqc?*Y>+o zP{H@1Ab|iuK?l?8yX3i&f)2f&>an}2RpzY4iX|pH2tcEEl_Fe z#6BMW$bd{w=Zl|hmuX+Y;5pX|16_z*xw4B1IwK`DY9O@>=QC5K3PN5J9FK1(Q}%OY zmo)jgGWe6Ha@si6tOz=Gmk0>Lu8%{R2OAqDzi9ucqEy{VzaPenYAf$ z9MSf}aJ&8RTH{*A!0=)GA*nP?`!7MvFuV|T1C+B4ZBw+h((-uJvRH<*nNc4m7Dqaz zVsBqsL^K|ZcYxxtUtccV1BUR}DndeGi!1%Dpp4wvmBC?r{%?SDEVK3bS7mSP-=XyBhihfdRk!HnxFhEQ zN+!qvjrVxss9|x^BOp8BYsVTXf?WuB7Bf~cjANWxsIn7GaIQegj&_Inf*JU>VD{h+ zocpDu!-?{r9{FqdKFGLIm%n`0Qt|c%@eLyrJDEQ+zmzbjYg=s#Yi52l2SA^%!obEfZH zpF;tlDI7nnkM+_Jm%AuyJQ-q@a_EtHY%ro_Om>VLg~Warz=Qd1H50o$W%zky-ykE; zF)7TjgZZ?HF172S4!AqS{XIH{z;B^!0vb0U*qySNwjZkS+4-|fHU&mr^vR4I$GfF_ zxk8_v^}8t-YTev4Ze+yS_rZ>5+58^d|AfZ>eN9^>yU^)-G%P3eg&cL*`Sg6xz2?F7 z?Ha>qQ%#6ODFL6KPLj-fKyln4j|&{U<`@_l4NW*&Q0U0#7=j5wb#;Z|EO;j~D#~OO zgVPWeibud-B>)6>qn&Yl((#npaXBfWdPBApqXWRe4^L##T#ObIDvFtG$9^MBjfM;P@1R?!U`{fvtn+r)Lq!7F}*441H0sD$n z!hR+Q<9zTraB21Tzps*W&pSgZ%BRV@P;1N1#@-`P7b6{c)N*<3FVD!=PCWwrR73@r zZN3w(UFhB&1PPRqaMy7X zr6lb9qmW)0JCH%AK`@Tx5@>LB#1`oW6Y(ZMIso!q>vMw*#woca9SkS)G8vJ9aoZuV zUK@0na?n8SNg`I6WQ6SfH&_lEql&>8PiCBxgqvs(OE6Fm-`oX>&Ie42&x9ldA38)V zPbXl44l=%6CH7(fOK7Oa@)AaPtQ1KqfCdnx58y2$uEb2>>9A>FLnQeFp$Dq=}`=<&RfkCW+WLIiEeCEl3n5j7QGf_HaFcru!xrX&M zw@GC;)WIO`v?&$OdMn<`-H>Qtk57rmqc6pC{$SIvytT+d;a)H|%m0}qiFHZx>WeQ( z*<44`M~Q|?HPYZhIyD4}?Fp83^$t7zBmpX3-jqhONn#>aNXHU}&|Uv`NSXAh)~-?r z1s^>EkCY$%-W7CcpHc}K`=&BzWN7SnN%c$uz0uU> zNU=EMvrvj+6U$YQ&-S40z)s^n&%|Kf2qvGDm69WA@qSsqX&W|~%E#U*4(MQ9PS!MO z?S=QCOosvD^Y7TSNq+j1yX2~CzAq*D`(h>MDJG2~eXj0-$P}D_KAwbK%`=nWQ3Wes z16c9%B|)_@5MeA5i?d8Qg_u+u2eupOgMtqlARG7MR!wAN$%vVq)#2HSM&@6Hv<~K_ zAu5Ucs@S_MGfX!b?0M&7sltYd$wf|Df{xjffDQsTF0Kr~^}0XZCl5dPDD;YHl$nAF ztV#|#nS_BO|w-p|cZ$5I6ste4CjiH7HqJr*M2 zK3|5s_{{6l52oUzv$^If#+ks;M=cdkhF|(Swo6`qg#jbAbxqg_InCVn@)d`eIf?U` zs`T*N8$)b73&Uwh`PRG7n=@=~dU?fSlniZuTB!Y>+$ZB)mRyQjCnP74- zMyQcGfj*y?&rW+$z2{g)^ja^ON-{K=G3HuRQRpYk@Z;JBCw3b9JQ=ICEsg7<-09l! zJXgkB&lPOA({YuTOt|XD+xKFp<$K=M_h5SN>0#H+u|jtfx68B7nSP@C({w|F{Su$# zH;lT5@%@qr7QC3_l?-!_YmL`%J@R?^UFh1Fb}nqoHjx1)AR~1*H%e)_Gn3M=d`)Zg zTw~|sc_R49eHJXjW`LdWEY)k~7`Atg5o|w{T#Vv*7w)&O0pOfF!uFfU&qbwe+qTPs z`OX;AP`g@+O7}6`s!QQ*JQCt^Vz3s&Axs6>^sj~Ct(bK z`QRWWUhbS!2Yqj#%ouDVIC`N?IH1JL^DBafT>RE6wp zYZXt+&d;T|%z5GbaDliEB#1D;b_IG)K%n4*k`Mk7fKbJXL;#Qi101zaU>HBT=}>0% zF0y<_+X9;=0~>Za`+QdnG1HPsQVECVWdqg8OvA|RkQCAKqw=HMjIv%czYczypR3jy zrp7oL=ad^SJ=obh-!nr302*|aTkM+!sZVm)%axtp$>V`>Pnz@%^qQ4fFF-~BM!A$~ zuwm+Z=IVV)LNYqLBOT%DVOCPUQO_E{*pVC$>54Bq#3;a!9FmUSu~sl05Cvle)Ei90 zvE5Y9XPhdtr}xV|?svlXNU&pv>$`M^X*hw8)~{vrUdDR+#Y?$0)H9UWl5WG`bv;0b zGpwQ4;{W4lgWdJ%a?%I}WNh%b;*Dg<=tc*|t~PCTb(%eV%;rRg&O3N_*c`SqefLc6@B49ST%6AKMVWgMJeY zS8(qJ{t7xY9s4nDHh>($-=20IwB3kHr5tTM;gdxX$0L4sCANvls2`wa_TE(x6Z>V= z3vbJzUp*L;&xkzp)bp|&18o#RCxrWaq$D~_664ly*eT`Zr6>dL02@0@as?W8-VW@1 zo0;pV+f|iUNJD)ip0g84vgKnKCRS92s_BCOwFKsMSdNIaQB0+|e2FMwq z-PEHp;zB1=clcDUm6_GF3NF}ZxCaPrX_N>`dOvzgs@i)b4Lg*R=)o%CtYb9ExFg3o z>fzgV7%#rCO3pg_>)1fkFHb`+coinUpWS@50iqKb@xz!0&k0o;O!PMC_%O$}ARJ6r z!)~ItvR*Lcbg@gK@A|y7N_R3i^?;Wf)UopR8w{vpg3k60SZS?-UC_&N{7Fa4EUb7w z_2fUo_f3Y5u5C%2zc^b_{fhTy6R-1=D(s-}`3PJ+Q-#itu{b-iFdSYOUxx9w)3gN* zR0$ZFGy^8`}DTkKJaH7x&p`{ZN2NsOP2Ouu*m>R7gdI>x>F>f2`TiM)bBBW1F` z4c|pa$2xg!)jM+B@yE!g?>#09mz<_W$|aXvFK2%9WXa9<%X81ZDv7XFz4oV9n0ReF zT;$MqYM0GK8XhjtI#E@#v(Edb2_?^=M1G9`jl^$Ye@k~Anuo_`NEYJL;5iM8prj=5 zM-|hnK%ljXECMUqN7>O!RTej|$PRw5m_gf@&bq(^`YwyVoH~+*K-T(Pd&&cl{ zx)X~P&b+XBOO5>fsTbtV`+jcJ=h%kJvDHFDeUqt^@0*(;?gQ|~_hR4gXV{35`@1ZJ z;e2fq=Eo56JJr?h5KsR=lWcC;UyL zYIv@B+(!;{v}0(-&YPW{40m+++6_inw%(UA-QmPBPHfP@ft2+sxuqQpSE&WhOs|g)-a}5=F`^O)c7s{uV*m8 zIiN#B>3>S(<)BBt^L~mfs{`PG5ip7G#hz?UVCaXdZd4H@fTM(oV2=_2GJkE@5uF~b z(h~b+Gz2uLvXl^?FQYx#kUC-K_wnPkUHrInwo8>3Fw$;!;}Tl|yKC3MtO_)&VvMvS zArVqE%M~%>*}q8KM@CfuO#pt}fP>-gK9n@%Fjs9u@K6QMVQhDl)(t0ztOcF<28`y! zlM5Eg47mZQ-PfEHp>$|_$^c*UlS||mx85z!JpF?4 z@Ira)(WmA5tL`vCDXGb(ttb;W25E+^KGKgiRSu^Z7hHIbTzK9OjA)zEjw^m}j*NWj zFj_2#Zgi*bKUb@fd>)(iS-PX+X!p z$H>g0>IrM+Jrbb0sd8qy%$zwBY75nJ;&I9xiN=;aq*k>crPvV7To^57pHGoEYcxS%+srtB_j$?^q|05}>0EKiAL za+RNdblFY7!7wtJvBpi!XCKWtkN0i^4LjaF4%+3a3ZjNl-Dx~U=Fz|ayvz;v!?rWm z^qD_@7Ku}7M^oK8DaiW}s#pnF{27(X11|{|sr|aNpvXM0y5}VbA?bS#XTS;b=>54@ z(`_cmK4*USwOyv3E2Ec@T_N3VTO_*xizpM2rnRGEF`on+R0&fc<7V3J{O&~qJI;Mh zutkQB%%7^4YMNO0rg1##efD=Z8#Sxq83&qZWw34aG}fW-S)aiTI+$4v{CTeNnop06 zBjBK_6)8a)@Ea%nT~L>XidJ#znAG=8JU^IB_~Csj=y>b`p(Hd&58;V8q1r^2ml60}A-TCr>R9u7Yh=!0DZ_AVn;%_^5Y=gvWU_6a?F z@jYI1)y`4E=OuE)5i1xaSN;GSDK1?iFFyYw zq~Tt<{?@AvK)U3jtL5gEKLP*X*tprCL+vt50j?k0oie3fG}b0{OQYfGk^qR5es&A$ z_}Lxu_+!r)sndZl`ak{5Q_LJk+YAzSb|*dZ@L#1Jn;U-joJ-C1>1Un{&s*=AuuCtv z%7lIWv=fYR`2`oAZRR^lgJ`7wi#u-!gMRMe!S{5@W#2XR@SMbY*zan#Y{p^_cBikc zACR2kI!P|5mLM3a#6YgZgNaf*2r{;0M96Tc3KR?K2(8j-$5+?891JMk;A(|EFc6G{ zr5?zy15F$OM+X`mJa0@!$_y#vL*QXE-LdkLdEs-AxwDyMJ1yhLI8C(b%)y(CCy5NO z8+2${Dk0HprXv&WCaO3QND$!pu%k2c^^Uce6;CpHBrIv5`ZMsUEAb})=z#`!wDiYDTKjO|`Y1cS#f!CLCUDCJC>7M(D3rGu?X zJO~c6yoKf+b`D^N*3^!1DncV3iZ{PF@%`|98YThnOab*oCGIMIqI~Xf_FGCj{L`J4 zc*e(SKkj@JUGu)!Hwiihyp4{u!<6YTAhm(DXpE8ECOtmfL|~0JBsOUqv%`4KHc3cH zRU5W9u6~zQRLcDi+<|?9ur~vkP8z-TkMu~>@HQz+u9Byo`-3TFd-pn-le)lMrzEBr zFI5lz{zk#pMUs(~V^-kFT$4e2;Xj`+E4f|0adP(eoxz!^B>X%1{O;T!&{m_;@suh(?Sq(1F#i1iAcBzoDhDvKzD`U+ z(<>$h9lTF9DxT>6TCjS}9eP!zherHHk`_!f6B8MPZCkg?W#9j?5O|QG-*3@8>FDZ{ z%P+ZBPCDgS$;r!;F6cw^dfvW!o2o9o@uu+)<5=Sss@VVNX;9DQ}O(uy<4JXl@ z+-#|-*)A7~}z>aAX9U1Xw+ujA_&IcXhOx^^ELtY1z4YQsANGDHE^P zv5s8aqFdd3ELgZn0Z~XL-yLnP-6~d^h>`?*#h>B&924D_hWGb%2_-vuGgcS|Qp?n% zf(KqJP+)uLh5DkBN-_AoY_Ov7v5r*1Vma(TDVgkp@TMq5@_B2#tSActc*M#T3DfzS z@05Vmo&;|;gVy${_kv^lx(yFZjY_nu>R3_s_*6HOZK z(^0eWHOwDgI6suW<30KO)AjQDs<-7^XPs)&aok~DwY59tq6@Axz@rIvr?;)V zTmJl)Ujy*unXxQ0J=NGzP-^k%nsu`HfcbLgZ+|Jb-1IAX0}^0@pG_OLLM0p%4ec>3 zNeA1nem7RC--t&$oN?Q_KbO?eVkqu!HxeXVdFYS7#^PH$#>;d(pTlSU zJ2rcy)Yfh Date: Thu, 29 Aug 2019 09:45:59 -0400 Subject: [PATCH 23/31] Added screenshot to readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 393ecb7..7ca4f38 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,6 @@ examples/main_gs.py - MapGraphicsGeoPixmapItem - draw a pixmap given upper left and lower right lat/lon (scales with zoom) - MapGraphicsGeoPixmapItemCorners - draw a pixmap given all four lat/lon corners (scales with zoom) - MapGraphicsLabelItem - a label that is attached to another map item + +# Screenshot +[image] https://github.com/bthcode/PyTileMap/blob/devel/screenshot.png From 5d35a20ed625224c98d5899ea1addbc4cc021d94 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 29 Aug 2019 09:47:09 -0400 Subject: [PATCH 24/31] try image again --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ca4f38..6aea992 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,4 @@ examples/main_gs.py - MapGraphicsLabelItem - a label that is attached to another map item # Screenshot -[image] https://github.com/bthcode/PyTileMap/blob/devel/screenshot.png +![alt text] (https://github.com/bthcode/PyTileMap/blob/devel/screenshot.png) From 72ba8ffe44cd7e83c7cdf703b4f5a09a71e3fb10 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Thu, 29 Aug 2019 09:47:51 -0400 Subject: [PATCH 25/31] try image again --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6aea992..6c3e433 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,4 @@ examples/main_gs.py - MapGraphicsLabelItem - a label that is attached to another map item # Screenshot -![alt text] (https://github.com/bthcode/PyTileMap/blob/devel/screenshot.png) +![Screenshot](screenshot.png) From aa5e231620ea3dd0348bd2743daa77b19232eaa6 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Mon, 7 Oct 2019 15:40:59 -0400 Subject: [PATCH 26/31] working rotation code --- pytilemap/mapitems.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index 546b982..a985e2e 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -508,7 +508,7 @@ def __init__(self, lon0, lat0, lon1, lat1, lon0(float): Longitude (decimal degrees) of the upper left corner of the image lat0(float): Latitude of the upper left corner of the image lon1(float): longitude of the next point clockwise - lat1(float): latitude of the next point clockwise + lat0(float): latitude of the next point clockwise lon2(float): longitude of the next point clockwise lat2(float): longitude of the next point clockwise lon3(float): latitude of the next point clockwise @@ -548,6 +548,7 @@ def updatePosition(self, scene): self.prepareGeometryChange() + ''' # 2. Get height and width in pixels import math h = math.sqrt( (pos3[0] - pos0[0])**2 + @@ -584,22 +585,31 @@ def updatePosition(self, scene): self._ysize = h self.x_mult = self._xsize / self.pixmap().width() self.y_mult = self._ysize / self.pixmap().height() + ''' # Set the image to 0, 0, then use a transform to # to translate, rotate and warp it to the map - self.setPos(0, 0) # Method 1: tranfsorm and scale if 0: - self.setTransformOriginPoint(self.ul_x, self.ul_y) + self.setTransformOriginPoint(pos0[0] + (pos0[0] - pos1[0]) / 2, pos0[1] + (pos0[1] - pos2[1])/2) + self.setPos(self.ul_x, self.ul_y) t = QTransform().rotate(ang) t.scale(self.x_mult, self.y_mult) self.setTransform(t) else: - pts = self.boundingRect() + #print ('0: {},{}'.format(self._lon0, self._lat0)) + #print ('1: {},{}'.format(self._lon1, self._lat1)) + #print ('2: {},{}'.format(self._lon2, self._lat2)) + #print ('3: {},{}'.format(self._lon3, self._lat3)) + self.setPos(0, 0) t = QTransform() poly1 = QPolygonF() + w = self.pixmap().width() + h = self.pixmap().height() + print ('w={}, h={}'.format(w,h)) + poly1.append(QPointF( 0, 0 )) poly1.append(QPointF( w, 0 )) poly1.append(QPointF( w, h )) @@ -613,7 +623,8 @@ def updatePosition(self, scene): success = QTransform.quadToQuad(poly1, poly2, t) if not success: logging.error('Unable to register image') - t.scale(self.x_mult, self.y_mult) + else: + print ("success!") self.setTransform(t) From 2d545aacdfcd89b2573e368b86042c0d8751fec4 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Fri, 2 Oct 2020 20:54:26 -0400 Subject: [PATCH 27/31] cleanups to example --- .gitignore | 3 +++ example/main_gs.py | 7 +------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 922918e..7f15977 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ __pycache__/ *.py[cod] +# Ctags +tags + # C extensions *.so diff --git a/example/main_gs.py b/example/main_gs.py index 8459b13..051aa1a 100644 --- a/example/main_gs.py +++ b/example/main_gs.py @@ -131,6 +131,7 @@ def __init__(self): pin_item.setLabel("

Pin Item
",html=True) pin_item.showLabel() + # Pixmap with all four corners geo-referenced lon0r = 10.06 lat0r = 44.83 lon1r = 10.110000000000001 @@ -140,16 +141,10 @@ def __init__(self): lon3r = 9.886794919243112 lat3r = 44.73 - pin0 = view.scene().addPin(lon0r, lat0r) - pin1 = view.scene().addPin(lon1r, lat1r) - pin2 = view.scene().addPin(lon2r, lat2r) - pin3 = view.scene().addPin(lon3r, lat3r) - clr = QColor(0,255,0,100) pix = QPixmap(100,100) pix.fill(clr) - view.scene().addGeoPixmapCorners(lon0r, lat0r, lon1r, lat1r, lon2r, lat2r, From 671c243b3e06fed9b5c2c728e54d987eefdc791a Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Fri, 2 Oct 2020 21:02:25 -0400 Subject: [PATCH 28/31] updated README and remove debug printouts --- README.md | 3 ++ pytilemap/mapitems.py | 100 ++++++++++-------------------------------- 2 files changed, 26 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index 6c3e433..a25a1a8 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ https://github.com/allebacco/PyTileMap Simple to use map widget that can be used in a PyQt GUI. +# Install: +python setup.py install + # Example: examples/main_gs.py diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index a985e2e..a48ea40 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -544,88 +544,34 @@ def updatePosition(self, scene): pos1 = scene.posFromLonLat(self._lon1, self._lat1) pos2 = scene.posFromLonLat(self._lon2, self._lat2) pos3 = scene.posFromLonLat(self._lon3, self._lat3) - - self.prepareGeometryChange() - ''' - # 2. Get height and width in pixels - import math - h = math.sqrt( (pos3[0] - pos0[0])**2 + - (pos3[1] - pos0[1])**2 ) - w = math.sqrt( (pos1[0] - pos0[0])**2 + - (pos1[1] - pos0[1])**2 ) - - # get horizontal rotation in pixels - a = pos3[1] - pos0[1] - - # solve for rotation angle - ang = math.acos( a/h ) * 180 / math.pi - - # CHECK IN LLA - #h2 = math.sqrt( (self._lat3 - self._lat0)**2 + - # (self._lon3 - self._lon0)**2 ) - #a2 = self._lat0 - self._lat3 - #ang2 = math.asin( a2/h2) * 180 / math.pi - - xsize = abs(int(pos1[0] - pos0[0])) - ysize = abs(int(pos0[1] - pos1[1])) - - rect = scene.sceneRect() - x = rect.x() - y = rect.y() - width = rect.width() - height = rect.height() - self.ul_x = min(pos0[0], pos1[0]) - self.ul_y = min(pos0[1], pos1[1]) - self.lr_x = max(pos0[0], pos1[0]) - self.lr_y = max(pos0[1], pos1[1]) - - self._xsize = w - self._ysize = h - self.x_mult = self._xsize / self.pixmap().width() - self.y_mult = self._ysize / self.pixmap().height() - ''' - # Set the image to 0, 0, then use a transform to # to translate, rotate and warp it to the map - # Method 1: tranfsorm and scale - if 0: - self.setTransformOriginPoint(pos0[0] + (pos0[0] - pos1[0]) / 2, pos0[1] + (pos0[1] - pos2[1])/2) - self.setPos(self.ul_x, self.ul_y) - t = QTransform().rotate(ang) - t.scale(self.x_mult, self.y_mult) - self.setTransform(t) - else: - #print ('0: {},{}'.format(self._lon0, self._lat0)) - #print ('1: {},{}'.format(self._lon1, self._lat1)) - #print ('2: {},{}'.format(self._lon2, self._lat2)) - #print ('3: {},{}'.format(self._lon3, self._lat3)) - self.setPos(0, 0) - t = QTransform() - poly1 = QPolygonF() - - w = self.pixmap().width() - h = self.pixmap().height() - print ('w={}, h={}'.format(w,h)) - - poly1.append(QPointF( 0, 0 )) - poly1.append(QPointF( w, 0 )) - poly1.append(QPointF( w, h )) - poly1.append(QPointF( 0, h )) - - poly2 = QPolygonF() - poly2.append(QPointF(pos0[0], pos0[1])) - poly2.append(QPointF(pos1[0], pos1[1])) - poly2.append(QPointF(pos2[0], pos2[1])) - poly2.append(QPointF(pos3[0], pos3[1])) - success = QTransform.quadToQuad(poly1, poly2, t) - if not success: - logging.error('Unable to register image') - else: - print ("success!") - self.setTransform(t) + # tranfsorm and scale + self.setPos(0, 0) + t = QTransform() + poly1 = QPolygonF() + + w = self.pixmap().width() + h = self.pixmap().height() + + poly1.append(QPointF( 0, 0 )) + poly1.append(QPointF( w, 0 )) + poly1.append(QPointF( w, h )) + poly1.append(QPointF( 0, h )) + + poly2 = QPolygonF() + poly2.append(QPointF(pos0[0], pos0[1])) + poly2.append(QPointF(pos1[0], pos1[1])) + poly2.append(QPointF(pos2[0], pos2[1])) + poly2.append(QPointF(pos3[0], pos3[1])) + success = QTransform.quadToQuad(poly1, poly2, t) + if not success: + logging.error('Unable to register image') + + self.setTransform(t) def getGeoRect(self): From 11f321a463fe7a1c0d4584d2196c1a92a2697c80 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Mon, 5 Oct 2020 08:54:11 -0400 Subject: [PATCH 29/31] synced mapitems from sandbox --- pytilemap/__init__.py | 5 +++-- pytilemap/mapitems.py | 43 +++++++++++-------------------------------- 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/pytilemap/__init__.py b/pytilemap/__init__.py index 2e09070..7598737 100644 --- a/pytilemap/__init__.py +++ b/pytilemap/__init__.py @@ -2,7 +2,7 @@ from .mapscene import MapGraphicsScene from .mapview import MapGraphicsView -from .mapitems import MapGraphicsCircleItem, MapGraphicsLineItem, \ +from .mapitems import MapItem, MapGraphicsCircleItem, MapGraphicsLineItem, \ MapGraphicsPolylineItem, MapGraphicsPixmapItem, MapGraphicsTextItem, \ MapGraphicsRectItem from .maplegenditem import MapLegendItem @@ -28,7 +28,8 @@ 'MapTileSourceOSM', 'MapTileSourceHTTP', "MapNavItem", - "ImageButton" + "ImageButton", + "MapItem" ] __version__ = '1.0.0' diff --git a/pytilemap/mapitems.py b/pytilemap/mapitems.py index a48ea40..b949845 100644 --- a/pytilemap/mapitems.py +++ b/pytilemap/mapitems.py @@ -16,33 +16,6 @@ SolidLine = Qt.SolidLine -""" -def order_points(pts): - '''https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/''' - import numpy as np - # initialzie a list of coordinates that will be ordered - # such that the first entry in the list is the top-left, - # the second entry is the top-right, the third is the - # bottom-right, and the fourth is the bottom-left - rect = np.zeros((4, 2), dtype = "float32") - - # the top-left point will have the smallest sum, whereas - # the bottom-right point will have the largest sum - s = pts.sum(axis = 1) - rect[0] = pts[np.argmin(s)] - rect[2] = pts[np.argmax(s)] - - # now, compute the difference between the points, the - # top-right point will have the smallest difference, - # whereas the bottom-left will have the largest difference - diff = np.diff(pts, axis = 1) - rect[1] = pts[np.argmin(diff)] - rect[3] = pts[np.argmax(diff)] - - # return the ordered coordinates - return rect -""" - class MapItem(object): """Base class for each item in the MapGraphicScene @@ -631,6 +604,8 @@ def __init__(self, lon0, lat0, lon1, lat1, pixmap, parent=None): self._lat1 = lat1 self._xsize = 0 self._ysize = 0 + + self.orig_pixmap = pixmap self.setPixmap(pixmap) self.setShapeMode(1) self.x_mult = 1 @@ -653,15 +628,19 @@ def updatePosition(self, scene): self.lr_x = max(pos0[0], pos1[0]) self.lr_y = max(pos0[1], pos1[1]) + #if xsize != self._xsize or ysize != self._ysize: self._xsize = xsize self._ysize = ysize - self.x_mult = xsize / self.pixmap().width() - self.y_mult = ysize / self.pixmap().height() - + self.x_mult = xsize / self.orig_pixmap.width() + self.y_mult = ysize / self.orig_pixmap.width() + if 1: + newscale = QSize(xsize, ysize) + scaled = self.orig_pixmap.scaled(newscale) + self.setPixmap(scaled) + self.ul_x = min(pos0[0], pos1[0]) + self.ul_y = min(pos0[1], pos1[1]) self.setPos(self.ul_x, self.ul_y) - t = QTransform().scale(self.x_mult, self.y_mult) - self.setTransform(t) def getGeoRect(self): From 6cfab975f9e97cdf65841802b77378a7a62fc9e1 Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Fri, 27 May 2022 14:17:45 -0400 Subject: [PATCH 30/31] updated README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index a25a1a8..643355e 100644 --- a/README.md +++ b/README.md @@ -30,3 +30,7 @@ examples/main_gs.py # Screenshot ![Screenshot](screenshot.png) + +# Other Python Maps + +https://github.com/TomSchimansky/TkinterMapView From 3350ec6f94aee5a22fab84ef4cfd9dfa5038ed5c Mon Sep 17 00:00:00 2001 From: Brian Hone Date: Sat, 28 Jan 2023 15:36:19 -0500 Subject: [PATCH 31/31] fixed __init__ --- pytilemap/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pytilemap/__init__.py b/pytilemap/__init__.py index 7598737..42a075f 100644 --- a/pytilemap/__init__.py +++ b/pytilemap/__init__.py @@ -10,6 +10,7 @@ from .maptilesources import MapTileSource, MapTileSourceHere, MapTileSourceHereDemo, \ MapTileSourceOSM, MapTileSourceHTTP from .mapnavitem import MapNavItem +from .imagebutton import ImageButton __all__ = [