forked from mapnik/mapnik
-
Notifications
You must be signed in to change notification settings - Fork 1
Mapnik with wxPython
tmcw edited this page Jan 24, 2012
·
1 revision
Here's a sample application integrating Mapnik with wxPython
"""
This is a simple wxPython application demonstrates how to
integrate mapnik, it do nothing but draw the map from the World Poplulation XML
example:
https://github.com/mapnik/mapnik/wiki/GettingStartedInXML
Victor Lin. ([email protected])
Blog http://blog.ez2learn.com
"""
import wx
import mapnik
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.mapfile = "population.xml"
self.width = 800
self.height = 500
self.createMap()
self.drawBmp()
def createMap(self):
"""Create mapnik object
"""
self.map = mapnik.Map(self.width, self.height)
mapnik.load_map(self.map, self.mapfile)
bbox = mapnik.Envelope(mapnik.Coord(-180.0, -75.0), mapnik.Coord(180.0, 90.0))
self.map.zoom_to_box(bbox)
def drawBmp(self):
"""Draw map to Bitmap object
"""
# create a Image32 object
image = mapnik.Image(self.width, self.height)
# render map to Image32 object
mapnik.render(self.map, image)
# load raw data from Image32 to bitmap
self.bmp = wx.BitmapFromBufferRGBA(self.width, self.height, image.tostring())
def onPaint(self, event):
dc = wx.PaintDC(self)
memoryDC = wx.MemoryDC(self.bmp)
# draw map to dc
dc.Blit(0, 0, self.width, self.height, memoryDC, 0, 0)
if __name__ == '__main__':
app = wx.App()
frame = Frame(None, title="wxPython Mapnik Demo By Victor Lin")
frame.Show()
app.MainLoop()
The key point of this program is this:
# create a Image32 object
image = mapnik.Image(self.width, self.height)
# render map to Image32 object
mapnik.render(self.map, image)
# load raw data from Image32 to bitmap
self.bmp = wx.BitmapFromBufferRGBA(self.width, self.height, image.tostring())
We create an Image32 object, and render map on to that image, then load raw data of image into wxPython's Bitmap object. That's it! Now you can use your memory dc to do whatever you like
memoryDC = wx.MemoryDC(self.bmp)
# draw map to dc
dc.Blit(0, 0, self.width, self.height, memoryDC, 0, 0)
Screenshots