hi, list:
some python code:
im = mapnik.Image(self.map.width, self.map.height)
mapnik.render(self.map, im)
qim = QImage()
qim.loadFromData(QByteArray(im.tostring('png')))
The questions are: why we should pass a string 'png'? What is stored
in mapnik.Image? What is done in the tostring()?
I also wrote a simple pyqt4 widget to show mapnik map. You can zoom
with mouse wheel or drag to pan. Hope this helps for other newbie like me.
--Regards, zsj
# -*- coding: utf-8 -*-
import mapnik
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MapnikWidget(QWidget):
def __init__(self, parent = None):
QWidget.__init__(self, parent)
self.map = mapnik.Map(256, 256)
self.qim = QImage()
self.startDragPos = QPoint()
self.endDragPos = QPoint()
self.drag = False
self.scale = False
self.timer = QTimer()
self.timer.timeout.connect(self.updateMap)
self.total_scale = 1.0
def open(self, xml):
self.map = mapnik.Map(256, 256)
mapnik.load_map(self.map, xml)
self.map.resize(self.width(), self.height())
self.zoom_all()
def close_map(self):
self.map = mapnik.Map(256, 256)
self.updateMap()
def updateMap(self):
self.timer.stop()
self.total_scale = 1.0
self.scale = False
im = mapnik.Image(self.map.width, self.map.height)
mapnik.render(self.map, im)
self.qim.loadFromData(QByteArray(im.tostring('png')))
self.update()
def paintEvent(self, event):
painter = QPainter(self)
if self.drag:
painter.drawImage(self.endDragPos - self.startDragPos, self.qim)
elif self.scale:
qw = self.qim.width()
qh = self.qim.height()
newWidth = int(qw * self.total_scale)
newHeight = int(qh * self.total_scale)
newX = (qw - newWidth) / 2
newY = (qh - newHeight) / 2
painter.save()
painter.translate(newX, newY)
painter.scale(self.total_scale, self.total_scale)
exposed =
painter.matrix().inverted()[0].mapRect(self.rect()).adjusted(-1, -1, 1, 1)
painter.drawImage(exposed, self.qim, exposed)
painter.restore()
else:
painter.drawImage(0, 0, self.qim)
painter.setPen(QColor(0, 0, 0, 100))
painter.setBrush(QColor(0, 0, 0, 100))
painter.drawRect(0, 0, 256, 26)
painter.setPen(QColor(0, 255 , 0))
painter.drawText(10, 19, 'Scale Denominator: ' +
str(self.map.scale_denominator()))
def zoom_all(self):
self.map.zoom_all()
self.updateMap()
def resizeEvent(self, event):
self.map.resize(event.size().width(), event.size().height())
self.updateMap()
def wheelEvent(self, event):
self.scale = True
scale_factor = 1.0 - event.delta() / (360.0 * 8.0) * 4
self.map.zoom(scale_factor)
self.total_scale *= 1 / scale_factor
self.update()
self.timer.start(400)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.startDragPos = event.pos()
self.drag = True
def mouseMoveEvent(self, event):
if self.drag:
self.endDragPos = event.pos()
self.update()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag = False
self.endDragPos = event.pos()
cx = int(0.5 * self.map.width)
cy = int(0.5 * self.map.height)
dpos = self.endDragPos - self.startDragPos
self.map.pan(cx - dpos.x() ,cy - dpos.y())
self.updateMap()
_______________________________________________
Mapnik-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-users