예제 #1
0
 def GetMap(self, params):
     if params["bbox"][0] >= params["bbox"][2]:
         raise OGCException("BBOX values don't make sense.  minx is greater than maxx.")
     if params["bbox"][1] >= params["bbox"][3]:
         raise OGCException("BBOX values don't make sense.  miny is greater than maxy.")
     if params.has_key("styles") and len(params["styles"]) != len(params["layers"]):
         raise OGCException("STYLES length does not match LAYERS length.")
     m = Map(params["width"], params["height"])
     if params.has_key("transparent") and params["transparent"] == "FALSE":
         m.background = params["bgcolor"]
     else:
         m.background = Color(0, 0, 0, 0)
     maplayers = self.mapfactory.layers
     mapstyles = self.mapfactory.styles
     for layername in params["layers"]:
         try:
             layer = maplayers[layername]
         except KeyError:
             raise OGCException('Layer "%s" not defined.' % layername, "LayerNotDefined")
         for stylename in layer.styles:
             if stylename in mapstyles.keys():
                 m.append_style(stylename, mapstyles[stylename])
             else:
                 raise ServerConfigurationError(
                     'Layer "%s" refers to non-existent style "%s".' % (layername, stylename)
                 )
         m.layers.append(layer)
     m.zoom_to_box(Envelope(params["bbox"][0], params["bbox"][1], params["bbox"][2], params["bbox"][3]))
     im = Image(params["width"], params["height"])
     render(m, im)
     im = fromstring("RGBA", (params["width"], params["height"]), rawdata(im))
     fh = StringIO()
     im.save(fh, PIL_TYPE_MAPPING[params["format"]], quality=100)
     fh.seek(0)
     return Response(params["format"], fh.read())
예제 #2
0
 def GetMap(self, params):
     m = self._buildMap(params)
     im = Image(params['width'], params['height'])
     render(m, im)
     im = fromstring('RGBA', (params['width'], params['height']), rawdata(im))
     fh = StringIO()
     im.save(fh, PIL_TYPE_MAPPING[params['format']], quality=100)
     fh.seek(0)
     return Response(params['format'], fh.read())
예제 #3
0
    def renderTile(self, tile):
        import mapnik, StringIO
        import PIL.Image

        if self.mapnik:
            m = self.mapnik
        else:
            if self.fonts:
                engine = mapnik.FontEngine.instance()
                for font in self.fonts:
                    engine.register_font(font)

            # Init it as 0,0
            m = mapnik.Map(0, 0)
            mapnik.load_map(m, self.mapfile)

            if self.projection:
                m.srs = self.projection

            # Restrict layer list, if requested
            if self.layers and self.layers != self.name:
                layers = self.layers.split(",")
                for layer_num in range(len(m.layers) - 1, -1, -1):
                    l = m.layers[layer_num]
                    if l.name not in layers:
                        del m.layers[layer_num]
                    if self.debug:
                        print >> sys.stderr, "Removed layer %s loaded from %s, not in list: %s" % (
                            l.name, self.mapfile, layers)

            # this will insure that it gets cached in mod_python
            self.mapnik = m

        # Set the mapnik size to match the size of the current tile
        m.width = tile.size()[0]
        m.height = tile.size()[1]

        bbox = tile.bounds()
        bbox = mapnik.Envelope(bbox[0], bbox[1], bbox[2], bbox[3])
        m.zoom_to_box(bbox)

        im = mapnik.Image(*tile.size())
        mapnik.render(m, im)
        if hasattr(im, 'tostring'):
            data = im.tostring()
        elif hasattr(mapnik, 'rawdata'):
            data = mapnik.rawdata(im)
        else:
            raise Exception(
                "Something is wrong: your version of Mapnik can't create a string from an image."
            )
        im = PIL.Image.fromstring('RGBA', tile.size(), data)
        buffer = StringIO.StringIO()
        im.save(buffer, self.extension)
        buffer.seek(0)
        tile.data = buffer.read()
        return tile.data
예제 #4
0
 def GetMap(self, params):
     m = self._buildMap(params)
     im = Image(params['width'], params['height'])
     render(m, im)
     im = fromstring('RGBA', (params['width'], params['height']),
                     rawdata(im))
     fh = StringIO()
     im.save(fh, PIL_TYPE_MAPPING[params['format']], quality=100)
     fh.seek(0)
     return Response(params['format'], fh.read())
예제 #5
0
 def renderTile(self, tile):
     import mapnik, StringIO
     import PIL.Image 
     
     if self.mapnik:
         m = self.mapnik
     else:
         if self.fonts:
             engine = mapnik.FontEngine.instance()
             for font in self.fonts:
                 engine.register_font(font)
         
         # Init it as 0,0
         m = mapnik.Map( 0, 0 )
         mapnik.load_map(m,self.mapfile)
          
         if self.projection:
             m.srs = self.projection
         
         # Restrict layer list, if requested
         if self.layers and self.layers != self.name:
             layers = self.layers.split(",")
             for layer_num in range(len(m.layers)-1, -1, -1):
                 l = m.layers[layer_num]
                 if l.name not in layers:
                     del m.layers[layer_num]
                 if self.debug:
                     print >>sys.stderr, "Removed layer %s loaded from %s, not in list: %s" % (l.name, self.mapfile, layers)
                     
         # this will insure that it gets cached in mod_python
         self.mapnik = m
     
     
     # Set the mapnik size to match the size of the current tile 
     m.width = tile.size()[0]
     m.height = tile.size()[1]
     
     bbox = tile.bounds()
     bbox = mapnik.Envelope(bbox[0], bbox[1], bbox[2], bbox[3])
     m.zoom_to_box(bbox)
                 
     im = mapnik.Image( *tile.size() )
     mapnik.render(m, im)
     if hasattr(im, 'tostring'):
         data = im.tostring()
     elif hasattr(mapnik, 'rawdata'):
         data = mapnik.rawdata(im)
     else:
         raise Exception("Something is wrong: your version of Mapnik can't create a string from an image.") 
     im = PIL.Image.fromstring('RGBA', tile.size(), data)
     buffer = StringIO.StringIO()
     im.save(buffer, self.extension)
     buffer.seek(0)
     tile.data = buffer.read()
     return tile.data 
예제 #6
0
 def GetMap(self, params):
     if params['bbox'][0] >= params['bbox'][2]:
         raise OGCException(
             "BBOX values don't make sense.  minx is greater than maxx.")
     if params['bbox'][1] >= params['bbox'][3]:
         raise OGCException(
             "BBOX values don't make sense.  miny is greater than maxy.")
     if params.has_key('styles') and len(params['styles']) != len(
             params['layers']):
         raise OGCException('STYLES length does not match LAYERS length.')
     m = Map(params['width'], params['height'])
     if params.has_key('transparent') and params['transparent'] == 'FALSE':
         m.background = params['bgcolor']
     else:
         m.background = Color(0, 0, 0, 0)
     maplayers = self.mapfactory.layers
     mapstyles = self.mapfactory.styles
     for layername in params['layers']:
         try:
             layer = maplayers[layername]
         except KeyError:
             raise OGCException('Layer "%s" not defined.' % layername,
                                'LayerNotDefined')
         for stylename in layer.styles:
             if stylename in mapstyles.keys():
                 m.append_style(stylename, mapstyles[stylename])
             else:
                 raise ServerConfigurationError(
                     'Layer "%s" refers to non-existent style "%s".' %
                     (layername, stylename))
         m.layers.append(layer)
     m.zoom_to_box(
         Envelope(params['bbox'][0], params['bbox'][1], params['bbox'][2],
                  params['bbox'][3]))
     im = Image(params['width'], params['height'])
     render(m, im)
     im = fromstring('RGBA', (params['width'], params['height']),
                     rawdata(im))
     fh = StringIO()
     im.save(fh, PIL_TYPE_MAPPING[params['format']], quality=100)
     fh.seek(0)
     return Response(params['format'], fh.read())