分别使用wxPython与PyQt显示Mapnik的渲染结果出现问题

分别使用wxPython与PyQt显示Mapnik的渲染结果出现问题


发布日期: 2017-04-03 更新日期: 2019-10-28 编辑:xuzhiping 浏览次数: 7358

标签:

摘要: Python与开源GIS教程的内容,开发了单独的内容,请打开 https://www.osgeo.cn/pygis/ 查看。 本页面的内容不再更新。 Mapnik 是一个开源的 Python/C++ 地图渲染引擎,他的功能是 把数据形式的地图...

Python与开源GIS教程的内容,开发了单独的内容,请打开 https://www.osgeo.cn/pygis/ 查看。
本页面的内容不再更新。



Mapnik 是一个开源的 Python/C++ 地图渲染引擎,他的功能是 把数据形式的地图,包含一些地理对象,如地图、层、数据源、特征和地理几何等,通过一个样式表的定义,渲染成位图格式,用来提供 WMS 服务。其核心是一个 C++的共享库提供空间数据 访问和可视化的算法和模式。该共享库支持多种操作系统,可 以在多线程环境下很好的运行。 最近使用Mapnik做了些地图的 渲染。后来相做一些程序,先考虑最简单的,将渲染的结果显 示出来。于是就选择了wxPython与PyQt分别试了一下,没想到 出现问题了:显示的颜色不一样。

其中使用wxPython的是对的,显示效果如下: 使用PyQt的颜色是不对的,显示效果如下。对PyQt了解的还比 较少,没发现问题出现在什么地方。

程序的代码如下:

首先是使用mapnik对shapefile进行渲染的代码:

import wx
import mapnik
from PyQt4 import QtGui
class MapObj:
    def __init__(self, shpfile, width, height):
        self.map = mapnik.Map(width, height)
        self.width = width
        self.height = height
        self.wxbmp = ''
        self.qtbmp = ''
        self.createMap(shpfile)
    def createMap(self, shpfile):
        self.map.background = mapnik.Color('steelblue')
        s = mapnik.Style()
        r = mapnik.Rule()
        polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color('#f2eff9'))
        r.symbols.append(polygon_symbolizer)
        line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1)
        r.symbols.append(line_symbolizer)
        s.rules.append(r)
        self.map.append_style('My Style',s)
        ds = mapnik.Shapefile(file=shpfile)
        layer = mapnik.Layer('world')
        layer.datasource = ds
        layer.styles.append('My Style')
        self.map.layers.append(layer)
        bbox = mapnik.Envelope(mapnik.Coord(-180.0, -75.0), mapnik.Coord(180.0, 90.0))
        bbox = ds.envelope()
        self.map.zoom_to_box(bbox)
    def genWxBmp(self):
        image = mapnik.Image(self.width, self.height)
        mapnik.render(self.map, image)
        self.wxbmp = wx.BitmapFromBufferRGBA(self.width, self.height, image.tostring())
    def genQtBmp(self):
        image = mapnik.Image(self.width, self.height)
        mapnik.render(self.map, image)
        data = image.tostring()
        qimage = QtGui.QImage(data, self.width, self.height, QtGui.QImage.Format_RGB32)
        self.qtbmp = QtGui.QPixmap.fromImage(qimage)
    def GetWxImage(self):
        return(self.wxbmp)
    def GetQtImage(self):
        return(self.qtbmp)

下面是使用wxPython进行显示的代码:

    import wx
    from MapObj import MapObj
    class Frame(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, size=(800, 500) ,*args, **kwargs)
            self.Bind(wx.EVT_PAINT, self.onPaint)
            self.width = 800
            self.height = 500
            self.wxbmp = ''
            self.initMap()
        def initMap(self):
            shpfile = '/gdata/world_borders.shp'
            mapobj = MapObj(shpfile,  self.width, self.height)
            mapobj.genWxBmp()
            self.wxbmp = mapobj.GetWxImage()
        def onPaint(self, event):
            dc = wx.PaintDC(self)
            memoryDC = wx.MemoryDC(self.wxbmp)
            dc.Blit(0, 0, self.width, self.height, memoryDC, 0, 0)
    if __name__ == '__main__':
        app = wx.App()
        frame = Frame(None, title="WxPython + Mapnik")
        frame.Show()
        app.MainLoop()

下面是使用PyQt进行显示的代码:

    import sys
    from PyQt4 import QtGui
    from MapObj import MapObj
    class ImageLabel(QtGui.QLabel):
        def __init__(self, parent=None):
            QtGui.QLabel.__init__(self, parent)
            self.width = 800
            self.height = 500
            self.setGeometry(300, 300, self.width, self.height)
            self.setWindowTitle('PyQt + Mapnik')
            shpfile = '/gdata/world_borders.shp'
            mapobj = MapObj(shpfile,  self.width, self.height)
            mapobj.genQtBmp()
            self.pix = mapobj.GetQtImage()
            self.setPixmap(self.pix)
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        imageLabel = ImageLabel()
        imageLabel.show()
        sys.exit(app.exec_())

返回目录:Python与开源GIS

关注公众号
获取免费资源

随机推荐


Copyright © Since 2014. 开源地理空间基金会中文分会 吉ICP备05002032号

Powered by TorCMS

OSGeo 中国中心 邮件列表

问题讨论 : 要订阅或者退订列表,请点击 订阅

发言 : 请写信给: osgeo-china@lists.osgeo.org