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

Python与开源GIS教程的内容,开发了单独的内容,请打开

https://www.osgeo.cn/pygis/

查看。

本页面的内容不再更新。

Mapnik 是一个开源的 Python/C++ 地图渲染引擎,他的功能是

把数据形式的地图,包含一些地理对象,如地图、层、数据源、特征和地理几何等,通过一个样式表的定义,渲染成位图格式,用来提供 WMS 服务。其核心是一个 C++的共享库提供空间数据

访问和可视化的算法和模式。该共享库支持多种操作系统,可

以在多线程环境下很好的运行。 最近使用Mapnik做了些地图的

渲染。后来相做一些程序,先考虑最简单的,将渲染的结果显

示出来。于是就选择了wxPython与PyQt分别试了一下,没想到

出现问题了:显示的颜色不一样。

其中使用wxPython的是对的,显示效果如下:

f7d34674-f322-11e4-9faf-00163e022551.png

使用PyQt的颜色是不对的,显示效果如下。对PyQt了解的还比

较少,没发现问题出现在什么地方。

08528456-f323-11e4-9faf-00163e022551.png

程序的代码如下:

首先是使用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_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值