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_())