摘要: 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