示例#1
0
文件: wsgi.py 项目: zjlwmz/OGCServer
 def __init__(self, configpath, mapfile=None,fonts=None,home_html=None):
     conf = SafeConfigParser()
     conf.readfp(open(configpath))
     # TODO - be able to supply in config as well
     self.home_html = home_html
     self.conf = conf
     if fonts:
         mapnik.register_fonts(fonts)
     if mapfile:
         wms_factory = BaseWMSFactory(configpath)
         # TODO - add support for Cascadenik MML
         wms_factory.loadXML(mapfile)
         wms_factory.finalize()
         self.mapfactory = wms_factory
     else:
         if not conf.has_option_with_value('server', 'module'):
             raise ServerConfigurationError('The factory module is not defined in the configuration file.')
         try:
             mapfactorymodule = do_import(conf.get('server', 'module'))
         except ImportError:
             raise ServerConfigurationError('The factory module could not be loaded.')
         if hasattr(mapfactorymodule, 'WMSFactory'):
             self.mapfactory = getattr(mapfactorymodule, 'WMSFactory')()
         else:
             raise ServerConfigurationError('The factory module does not have a WMSFactory class.')
     if conf.has_option('server', 'debug'):
         self.debug = int(conf.get('server', 'debug'))
     else:
         self.debug = 0
     if self.conf.has_option_with_value('server', 'maxage'):
         self.max_age = 'max-age=%d' % self.conf.get('server', 'maxage')
     else:
         self.max_age = None
示例#2
0
文件: wsgi.py 项目: zjlwmz/OGCServer
 def __init__(self,
              configpath,
              fonts=None,
              home_html=None,
              **kwargs
             ):
     conf = SafeConfigParser()
     conf.readfp(open(configpath))
     # TODO - be able to supply in config as well
     self.home_html = home_html
     self.conf = conf
     if fonts:
         mapnik.register_fonts(fonts)
     if 'debug' in kwargs:
         self.debug = bool(kwargs['debug'])
     else:
         self.debug = False
     if self.debug:
         self.debug=1
     else:
         self.debug=0
     if 'maxage' in kwargs:
         self.max_age = 'max-age=%d' % kwargs.get('maxage')
     else:
         self.max_age = None
示例#3
0
文件: cli.py 项目: laferrieren/invar
    def __init__(self):
        """
        Perform argument processing and other setup for a InvarUtility.
        """
        self._init_common_parser()
        self.add_arguments()
        self.args = self.argparser.parse_args()
        self._install_exception_handler()

        if hasattr(self.args, 'font_paths'):
            for font_path in self.args.font_paths:
                mapnik.register_fonts(font_path)
示例#4
0
    def __init__(self):
        """
        Perform argument processing and other setup for a InvarUtility.
        """
        self._init_common_parser()
        self.add_arguments()
        self.args = self.argparser.parse_args()
        self._install_exception_handler()

        if hasattr(self.args, 'font_paths'):
            for font_path in self.args.font_paths:
                mapnik.register_fonts(font_path)
示例#5
0
    def setUp(self):
        # The sample_world theme uses Dejavu font family which is either
        # distrubuted by mapnik or fonts-dejavu-core package.
        if sys.platform == 'darwin':
            mapnik.register_fonts('/Library/Fonts/')
        elif sys.platform == 'linux2':
            mapnik.register_fonts('/usr/share/fonts')

        theme_root = os.path.join(SAMPLE_THEME_DIRECTORY, 'sample_world')
        self.style_sheet = os.path.join(theme_root, 'sample_world.xml')

        self.map = mapnik.Map(512, 512)  # zoom > 1 so admin0 label got rendered
        mapnik.load_map(self.map, self.style_sheet)
示例#6
0
文件: wsgi.py 项目: ckey/ogcserver-b
 def __init__(self, configpath, mapfile=None, fonts=None, home_html=None):
     # 实例化 ConfigParser 并加载配置文件
     conf = SafeConfigParser()
     # 从配置文件读取并分析(分列)配置信息
     conf.readfp(open(configpath))
     # TODO - be able to supply in config as well
     self.home_html = home_html
     self.conf = conf
     if fonts:
         # 注册指定字体
         mapnik.register_fonts(fonts)
     if mapfile:
         # 生成BaseWMSFactory实例
         wms_factory = BaseWMSFactory(configpath)
         # TODO - add support for Cascadenik MML
         wms_factory.loadXML(mapfile)
         wms_factory.finalize()
         self.mapfactory = wms_factory
     else:
         # 阅读default.conf,有疑惑???
         #
         # 原default.conf文件中module未定义,需要使用要在default.conf中自行定义
         if not conf.has_option_with_value('server', 'module'):
             raise ServerConfigurationError(
                 'The factory module is not defined in the configuration file.'
             )
         # 导入指定module
         try:
             # get(section,option),Get an option value for the named
             # section.
             mapfactorymodule = do_import(conf.get('server', 'module'))
         except ImportError:
             raise ServerConfigurationError(
                 'The factory module could not be loaded.')
         if hasattr(mapfactorymodule, 'WMSFactory'):
             # Get a named attribute from an object; getattr(x, 'y') is
             # equivalent to x.y.
             self.mapfactory = getattr(mapfactorymodule, 'WMSFactory')()
         else:
             raise ServerConfigurationError(
                 'The factory module does not have a WMSFactory class.')
     if conf.has_option('server', 'debug'):
         self.debug = int(conf.get('server', 'debug'))
     else:
         self.debug = 0
     if self.conf.has_option_with_value('server', 'maxage'):
         self.max_age = 'max-age=%d' % self.conf.get('server', 'maxage')
     else:
         self.max_age = None
示例#7
0
文件: tiles.py 项目: 3Geo/landez
    def render(self, stylefile, bbox, output, width, height):
        """
        Render the specified bbox (minx, miny, maxx, maxy) with Mapnik
        """
        if not self._mapnik:
            # Register font paths
            for family in ['ubuntu-font-family', 'msttcorefonts']:
                mapnik.register_fonts(os.path.join(TRUETYPE_FONTS_PATH, family))
            mapnik.register_fonts(os.path.join(os.path.expanduser('~'), '.fonts'))
            logger.debug(_("Mapnik supported fonts are %s") % [f for f in mapnik.FontEngine.face_names()])
            # Instantiate context
            self._mapnik = mapnik.Map(width, height)
            # Load style XML
            mapnik.load_map(self._mapnik, stylefile, True)
            # Obtain <Map> projection
            self._prj = mapnik.Projection(self._mapnik.srs)

        # Convert to map projection
        assert len(bbox) == 4, _("Provide a bounding box tuple (minx, miny, maxx, maxy)")
        c0 = self._prj.forward(mapnik.Coord(bbox[0],bbox[1]))
        c1 = self._prj.forward(mapnik.Coord(bbox[2],bbox[3]))

        # Bounding box for the tile
        if hasattr(mapnik,'mapnik_version') and mapnik.mapnik_version() >= 800:
            bbox = mapnik.Box2d(c0.x,c0.y, c1.x,c1.y)
        else:
            bbox = mapnik.Envelope(c0.x,c0.y, c1.x,c1.y)
        
        self._mapnik.resize(width, height)
        self._mapnik.zoom_to_box(bbox)
        self._mapnik.buffer_size = 128

        # Render image with default Agg renderer
        im = mapnik.Image(width, height)
        mapnik.render(self._mapnik, im)
        im.save(output, 'png256')
示例#8
0
import cherrypy
import psycopg2
import mapnik
import pylibmc

import data_timestamp

# ----------------------------

tile_size = 256
pq_time_fmt = '%Y-%m-%d %H:%M:%S'

current_dir = os.path.dirname(os.path.abspath(__file__))

mapnik.register_fonts('/zdata/osm/font')
mapnik.register_fonts('/usr/local/lib/X11/fonts')
mapnik.register_fonts('/usr/local/share/fonts')

# ----------------------------
# hack to make cherrypy to output sub-second log
# modified from _cplogging.py
def time_hack(self):
    """Return now() in Apache Common Log Format (no timezone)."""
    now = datetime.datetime.now()
    monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
                  'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
    month = monthnames[now.month - 1].capitalize()
    return ('[%02d/%s/%04d:%02d:%02d:%02d.%06d]' %
            (now.day, month, now.year, now.hour, now.minute, now.second, now.microsecond))
示例#9
0
		apg_db.add_argument('--host', help='database host', default=None)
		apg_db.add_argument('--port', type=int, help='database port', default='5432')
		apg_db.add_argument('-u', '--user', help='user name for db (default: {0})'.format(default_user), default=default_user)
		apg_db.add_argument('-w', '--password', action='store_true', help='ask for password', default=False)
	options = parser.parse_args()

	# check for required argument
	if options.bbox == None and options.poly == None and (not HAS_PSYCOPG or (options.cities == None and options.area == None)) and options.list == None:
		parser.print_help()
		sys.exit()

	# custom fonts
	if(options.customfonts):
		from mapnik import register_fonts, FontEngine
 		#custom_fonts_dir = '../../../fonts/'
		register_fonts(options.customfonts);

	# writer
	if options.tiledir:
		writer = FileWriter(options.tiledir, format=options.format, tms=options.tms, overwrite=not options.skip_existing, deleteempty= options.delete_empty)
	elif HAS_SQLITE and options.mbtiles:
		writer = multi_MBTilesWriter(options.threads, options.mbtiles, options.name, overlay=options.overlay, format=options.format)
	elif options.export:
		writer = ListWriter(options.export)
	else:
		writer = FileWriter(os.getcwd() + '/tiles', format=options.format, tms=options.tms, overwrite=not options.skip_existing)

	# input and process
	poly = None
	if options.bbox:
		b = options.bbox
示例#10
0
from math import pi,cos,sin,log,exp,atan
from subprocess import call
import sys, os
from Queue import Queue

import threading
import mapnik

DEG_TO_RAD = pi/180
RAD_TO_DEG = 180/pi

# Default number of rendering threads to spawn, should be roughly equal to number of CPU cores available
NUM_THREADS = 2

custom_fonts_dir = '/Library/Fonts/'
mapnik.register_fonts(custom_fonts_dir)

from optparse import OptionParser
parser = OptionParser()
parser.add_option("--dir",dest="rep",help="DIR")
parser.add_option("--zmin",dest="zoomin",help="ZOOMIN")
parser.add_option("--zmax",dest="zoomax",help="ZOOMAX")
(options,args) = parser.parse_args()
dir=options.rep
zmin=options.zoomin
zmax=options.zoomax

def render_to_wld(map, path, x_rotation=0.0, y_rotation=0.0):
     """
     Outputs an ESRI world file that can be used to load the resulting
     image as a georeferenced raster in a variety of gis viewers.
示例#11
0
from env import *
from coords import *
from common import *
import NED
import areas
from JobManager import JobManager

__author__ = "Lars Ahlzen and contributors"
__copyright__ = "(c) Lars Ahlzen and contributors 2008-2011"
__license__ = "GPLv2"

##### Initialize Mapnik

# Import extra fonts
if EXTRA_FONTS_DIR != '':
    mapnik.register_fonts(EXTRA_FONTS_DIR)

# Check for cairo support
if not mapnik.has_cairo():
    print "ERROR: Your mapnik does not have Cairo support."
    sys.exit(1)

##### Render settings

# Set to true to save intermediate layers that are normally
# merged. Primarily useful for debugging and style editing.
SAVE_INTERMEDIATE_TILES = False

# Enables/disables saving the composite layers
SAVE_PNG_COMPOSITE = True
SAVE_JPEG_COMPOSITE = True
示例#12
0
import sys

from .cartographer import Cartographer

try:
    # From mapnik 2.0.1, module name mapnik2 is deprecated
    import mapnik
except ImportError:
    # In case of mapnik 2.0.0 or 0.7.x
    import mapnik2 as mapnik

MAPNIK_VERSION = mapnik.mapnik_version() / 100000

# Automatically add system font directory
if sys.platform == 'darwin':
    mapnik.register_fonts(r'/Library/Fonts/')
elif sys.platform == 'linux2':
    mapnik.register_fonts(r'/usr/share/fonts')
elif sys.platform == 'win32':
    mapnik.register_fonts(r'C:\Windows\Fonts')
# for face in list(mapnik.FontEngine.face_names()):
#    print face


#==============================================================================
# Render maps using mapnik
#==============================================================================
class Mapnik(Cartographer):

    """ Mapnik Renderer
示例#13
0
map_major_grid_idx = map_ref_idx[0:2]
map_minor_grid_idx = map_ref_idx

# Generate symbols
print('Creating symbols...')
call("../symbols.sh " + map_ref_idx, shell=True)
print('Finished creating symbols')

# Convert MML to XML
print('Creating XML file...')
call("carto grough_map.mml > grough_map.xml", shell=True)
stylesheet = 'grough_map.xml'

# Custom fonts
print('Registering typefaces...')
register_fonts('/vagrant/source/typefaces/')
for face in font.face_names():
    print('...' + face)

# Connect to the database
#pg_conn_string = "host='localhost' dbname='grough' user='******' password='******'"
pg_conn_string = "host='localhost' dbname='grough-map' user='******'"
print('Connecting to PG database...')
pg_conn = psycopg2.connect(pg_conn_string)
pg_cursor = pg_conn.cursor()
print('Connected to database.')

print('Target grid square is ', map_ref_idx, '...')
print('Target major grid is ', map_major_grid_idx, '...')
print('Target file is ', map_target, '...')
示例#14
0
            if not os.path.isdir(tile_dir + zoom + '/' + str_x):
                os.mkdir(tile_dir + zoom + '/' + str_x)
            for y in range(int(px0[1] / 256.0), int(px1[1] / 256.0) + 1):
                # Validate x co-ordinate
                if (y < 0) or (y >= 2**z):
                    continue
                str_y = "%s" % y
                tile_uri = tile_dir + zoom + '/' + str_x + '/' + str_y + '.png'
                # Submit tile to be rendered into the queue
                render_tile(tile_uri, x, y, z)

    print(zoom + ' ' + str_x + ' ' + str_y)


m = mapnik.Map(2800, 1800)
mapnik.load_map(m, 'stylesheet.xml')
mapnik.register_fonts('/fonts')

# http://en.wikipedia.org/wiki/Extreme_points_of_the_United_States#Westernmost
# TODO: switch this to include all 50 states
top = 49.3457868  # north lat
left = -124.7844079  # west long
right = -66.9513812  # east long
bottom = 24.7433195  # south lat

bbox = (left, bottom, right, top)
prj = mapnik.Projection(m.srs)
tileproj = GoogleProjection()

render_tiles(bbox, '/output/counties/', minZoom=7, maxZoom=9)
示例#15
0
def main():
    try:
        mapfile = os.environ['MAPNIK_MAP_FILE']
    except KeyError:
        mapfile = os.getcwd() + '/osm.xml'

    default_user = getpass.getuser()

    parser = argparse.ArgumentParser(description='Generate mapnik tiles for an OSM polygon')
    apg_input = parser.add_argument_group('Input')
    apg_input.add_argument("-b", "--bbox", nargs=4, type=float, metavar=('X1', 'Y1', 'X2', 'Y2'), help="generate tiles inside a bounding box")
    apg_input.add_argument('-p', '--poly', type=argparse.FileType('r'), help='use a poly file for area')
    if HAS_PSYCOPG:
        apg_input.add_argument("-a", "--area", type=int, metavar='OSM_ID', help="generate tiles inside an OSM polygon: positive for polygons, negative for relations, 0 for whole database")
        apg_input.add_argument("-c", "--cities", type=int, metavar='OSM_ID', help='generate tiles for all towns inside a polygon')
    apg_input.add_argument('-l', '--list', type=argparse.FileType('r'), metavar='TILES.LST', help='process tile list')
    apg_output = parser.add_argument_group('Output')
    apg_output.add_argument('-t', '--tiledir', metavar='DIR', help='output tiles to directory (default: {0}/tiles)'.format(os.getcwd()))
    apg_output.add_argument('--tms', action='store_true', help='write files in TMS order', default=False)
    if HAS_SQLITE:
        apg_output.add_argument('-m', '--mbtiles', help='generate mbtiles file')
        apg_output.add_argument('--name', help='name for mbtiles', default='Test MBTiles')
        apg_output.add_argument('--overlay', action='store_true', help='if this layer is an overlay (for mbtiles metadata)', default=False)
    apg_output.add_argument('-x', '--export', type=argparse.FileType('w'), metavar='TILES.LST', help='save tile list into file')
    apg_output.add_argument('-z', '--zooms', type=int, nargs=2, metavar=('ZMIN', 'ZMAX'), help='range of zoom levels to render (default: 6 12)', default=(6, 12))
    apg_other = parser.add_argument_group('Settings')
    apg_other.add_argument('-s', '--style', help='style file for mapnik (default: {0})'.format(mapfile), default=mapfile)
    apg_other.add_argument('-f', '--format', default='png256', help='tile image format (default: png256)')
    apg_other.add_argument('--meta', type=int, default=8, metavar='N', help='metatile size NxN tiles (default: 8)')
    apg_other.add_argument('--scale', type=float, default=1.0, help='scale factor for HiDpi tiles (affects tile size)')
    apg_other.add_argument('--threads', type=int, metavar='N', help='number of threads (default: 2)', default=2)
    apg_other.add_argument('--skip-existing', action='store_true', default=False, help='do not overwrite existing files')
    apg_other.add_argument('--fonts', help='directory with custom fonts for the style')
    apg_other.add_argument('--for-renderd', action='store_true', default=False, help='produce only a single tile for metatiles')
    apg_other.add_argument('-q', '--quiet', dest='verbose', action='store_false', help='do not print any information',  default=True)
    if HAS_PSYCOPG:
        apg_db = parser.add_argument_group('Database (for poly/cities)')
        apg_db.add_argument('-d', '--dbname', metavar='DB', help='database (default: gis)', default='gis')
        apg_db.add_argument('--host', help='database host', default=None)
        apg_db.add_argument('--port', type=int, help='database port', default='5432')
        apg_db.add_argument('-u', '--user', help='user name for db (default: {0})'.format(default_user), default=default_user)
        apg_db.add_argument('-w', '--password', action='store_true', help='ask for password', default=False)
    options = parser.parse_args()

    # check for required argument
    if not options.bbox and not options.poly and (not HAS_PSYCOPG or (not options.cities and not options.area)) and not options.list:
        parser.print_help()
        sys.exit(1)

    if options.verbose:
        log_level = logging.INFO
    else:
        log_level = logging.WARNING
    logging.basicConfig(level=log_level, format='%(asctime)s %(message)s', datefmt='%H:%M:%S')

    # custom fonts
    if options.fonts:
        mapnik.register_fonts(options.fonts)

    # writer
    if options.tiledir:
        writer = FileWriter(options.tiledir, format=options.format,
                            tms=options.tms, overwrite=not options.skip_existing)
    elif HAS_SQLITE and options.mbtiles:
        writer = multi_MBTilesWriter(options.threads, options.mbtiles, options.name,
                                     overlay=options.overlay, format=options.format)
    elif options.export:
        writer = ListWriter(options.export)
    else:
        writer = FileWriter(os.getcwd() + '/tiles', format=options.format,
                            tms=options.tms, overwrite=not options.skip_existing)

    # input and process
    poly = None
    if options.bbox:
        b = options.bbox
        poly = box(b[0], b[1], b[2], b[3])
    if options.poly:
        tpoly = poly_parse(options.poly)
        poly = tpoly if not poly else poly.intersection(tpoly)
    if HAS_PSYCOPG and (options.area or options.cities):
        passwd = None
        if options.password:
            passwd = getpass.getpass("Please enter your password: "******"Error connecting to database: %s", e.pgerror or e)
            sys.exit(3)

    if options.list:
        generator = ListGenerator(options.list, metatile=options.meta)
    elif poly:
        generator = PolyGenerator(poly, list(range(options.zooms[0], options.zooms[1] + 1)),
                                  metatile=options.meta)
    else:
        logging.error("Please specify a region for rendering.")
        sys.exit(4)

    if options.threads > 1 and writer.multithreading():
        render_tiles_multithreaded(generator, options.style, writer,
                                   num_threads=options.threads,
                                   scale=options.scale, renderlist=options.for_renderd)
    else:
        render_tiles(generator, options.style, writer,
                     scale=options.scale, renderlist=options.for_renderd)

    writer.close()
示例#16
0
#!/usr/bin/env python

import mapnik

import sys, os

from mapnik import register_fonts, FontEngine

custom_fonts_dir = '../../../fonts/'
register_fonts(custom_fonts_dir)

# Set up projections
# spherical mercator (most common target map projection of osm data imported with osm2pgsql)
merc = mapnik.Projection(
    '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over'
)

# long/lat in degrees, aka ESPG:4326 and "WGS 84"
longlat = mapnik.Projection('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
# can also be constructed as:
#longlat = mapnik.Projection('+init=epsg:4326')

# ensure minimum mapnik version
if not hasattr(mapnik,
               'mapnik_version') and not mapnik.mapnik_version() >= 600:
    raise SystemExit('This script requires Mapnik >=0.6.0)')

if __name__ == "__main__":

    mapfile = "../../tilestyles/mazda/mazda.xml"
    map_uri = "image.png"
示例#17
0
from mapnik import register_fonts, FontEngine
custom_fonts_dir = '/Users/thomas/Library/Fonts'
register_fonts(custom_fonts_dir)
for face in FontEngine.face_names(): print face
示例#18
0
		apg_db.add_argument('--host', help='database host', default=None)
		apg_db.add_argument('--port', type=int, help='database port', default='5432')
		apg_db.add_argument('-u', '--user', help='user name for db (default: {0})'.format(default_user), default=default_user)
		apg_db.add_argument('-w', '--password', action='store_true', help='ask for password', default=False)
	options = parser.parse_args()

	# check for required argument
	if options.bbox == None and options.poly == None and (not HAS_PSYCOPG or (options.cities == None and options.area == None)) and options.list == None:
		parser.print_help()
		sys.exit()

	# custom fonts
	if(options.customfonts):
		from mapnik import register_fonts, FontEngine
 		#custom_fonts_dir = '../../../fonts/'
		register_fonts(options.customfonts);

	# writer
	if options.tiledir:
		writer = FileWriter(options.tiledir, format=options.format, tms=options.tms, overwrite=not options.skip_existing, deleteempty= options.delete_empty)
	elif HAS_SQLITE and options.mbtiles:
		writer = multi_MBTilesWriter(options.threads, options.mbtiles, options.name, overlay=options.overlay, format=options.format)
	elif options.export:
		writer = ListWriter(options.export)
	else:
		writer = FileWriter(os.getcwd() + '/tiles', format=options.format, tms=options.tms, overwrite=not options.skip_existing)

	# input and process
	poly = None
	if options.bbox:
		b = options.bbox
示例#19
0
def main():
    try:
        mapfile = os.environ['MAPNIK_MAP_FILE']
    except KeyError:
        mapfile = os.getcwd() + '/osm.xml'

    default_user = getpass.getuser()

    parser = argparse.ArgumentParser(
        description='Generate mapnik tiles for an OSM polygon')
    apg_input = parser.add_argument_group('Input')
    apg_input.add_argument("-b",
                           "--bbox",
                           nargs=4,
                           type=float,
                           metavar=('X1', 'Y1', 'X2', 'Y2'),
                           help="generate tiles inside a bounding box")
    apg_input.add_argument('-p',
                           '--poly',
                           type=argparse.FileType('r'),
                           help='use a poly file for area')
    if HAS_PSYCOPG:
        apg_input.add_argument(
            "-a",
            "--area",
            type=int,
            metavar='OSM_ID',
            help=
            "generate tiles inside an OSM polygon: positive for polygons, negative for relations, 0 for whole database"
        )
        apg_input.add_argument(
            "-c",
            "--cities",
            type=int,
            metavar='OSM_ID',
            help='generate tiles for all towns inside a polygon')
    apg_input.add_argument('-l',
                           '--list',
                           type=argparse.FileType('r'),
                           metavar='TILES.LST',
                           help='process tile list')
    apg_output = parser.add_argument_group('Output')
    apg_output.add_argument(
        '-t',
        '--tiledir',
        metavar='DIR',
        help='output tiles to directory (default: {0}/tiles)'.format(
            os.getcwd()))
    apg_output.add_argument('--tms',
                            action='store_true',
                            help='write files in TMS order',
                            default=False)
    if HAS_SQLITE:
        apg_output.add_argument('-m',
                                '--mbtiles',
                                help='generate mbtiles file')
        apg_output.add_argument('--name',
                                help='name for mbtiles',
                                default='Test MBTiles')
        apg_output.add_argument(
            '--overlay',
            action='store_true',
            help='if this layer is an overlay (for mbtiles metadata)',
            default=False)
    apg_output.add_argument('-x',
                            '--export',
                            type=argparse.FileType('w'),
                            metavar='TILES.LST',
                            help='save tile list into file')
    apg_output.add_argument(
        '-z',
        '--zooms',
        type=int,
        nargs=2,
        metavar=('ZMIN', 'ZMAX'),
        help='range of zoom levels to render (default: 6 12)',
        default=(6, 12))
    apg_other = parser.add_argument_group('Settings')
    apg_other.add_argument(
        '-s',
        '--style',
        help='style file for mapnik (default: {0})'.format(mapfile),
        default=mapfile)
    apg_other.add_argument('-f',
                           '--format',
                           default='png256',
                           help='tile image format (default: png256)')
    apg_other.add_argument('--meta',
                           type=int,
                           default=8,
                           metavar='N',
                           help='metatile size NxN tiles (default: 8)')
    apg_other.add_argument(
        '--scale',
        type=float,
        default=1.0,
        help='scale factor for HiDpi tiles (affects tile size)')
    apg_other.add_argument('--threads',
                           type=int,
                           metavar='N',
                           help='number of threads (default: 2)',
                           default=2)
    apg_other.add_argument('--skip-existing',
                           action='store_true',
                           default=False,
                           help='do not overwrite existing files')
    apg_other.add_argument('--fonts',
                           help='directory with custom fonts for the style')
    apg_other.add_argument('--for-renderd',
                           action='store_true',
                           default=False,
                           help='produce only a single tile for metatiles')
    apg_other.add_argument('-q',
                           '--quiet',
                           dest='verbose',
                           action='store_false',
                           help='do not print any information',
                           default=True)
    if HAS_PSYCOPG:
        apg_db = parser.add_argument_group('Database (for poly/cities)')
        apg_db.add_argument('-d',
                            '--dbname',
                            metavar='DB',
                            help='database (default: gis)',
                            default='gis')
        apg_db.add_argument('--host', help='database host', default=None)
        apg_db.add_argument('--port',
                            type=int,
                            help='database port',
                            default='5432')
        apg_db.add_argument(
            '-u',
            '--user',
            help='user name for db (default: {0})'.format(default_user),
            default=default_user)
        apg_db.add_argument('-w',
                            '--password',
                            action='store_true',
                            help='ask for password',
                            default=False)
    options = parser.parse_args()

    # check for required argument
    if not options.bbox and not options.poly and (
            not HAS_PSYCOPG or
        (not options.cities and not options.area)) and not options.list:
        parser.print_help()
        sys.exit(1)

    if options.verbose:
        log_level = logging.INFO
    else:
        log_level = logging.WARNING
    logging.basicConfig(level=log_level,
                        format='%(asctime)s %(message)s',
                        datefmt='%H:%M:%S')

    # custom fonts
    if options.fonts:
        mapnik.register_fonts(options.fonts)

    # writer
    if options.tiledir:
        writer = FileWriter(options.tiledir,
                            format=options.format,
                            tms=options.tms,
                            overwrite=not options.skip_existing)
    elif HAS_SQLITE and options.mbtiles:
        writer = multi_MBTilesWriter(options.threads,
                                     options.mbtiles,
                                     options.name,
                                     overlay=options.overlay,
                                     format=options.format)
    elif options.export:
        writer = ListWriter(options.export)
    else:
        writer = FileWriter(os.getcwd() + '/tiles',
                            format=options.format,
                            tms=options.tms,
                            overwrite=not options.skip_existing)

    # input and process
    poly = None
    if options.bbox:
        b = options.bbox
        poly = box(b[0], b[1], b[2], b[3])
    if options.poly:
        tpoly = poly_parse(options.poly)
        poly = tpoly if not poly else poly.intersection(tpoly)
    if HAS_PSYCOPG and (options.area or options.cities):
        passwd = None
        if options.password:
            passwd = getpass.getpass("Please enter your password: "******"Error connecting to database: %s", e.pgerror or e)
            sys.exit(3)

    if options.list:
        generator = ListGenerator(options.list, metatile=options.meta)
    elif poly:
        generator = PolyGenerator(poly,
                                  list(
                                      range(options.zooms[0],
                                            options.zooms[1] + 1)),
                                  metatile=options.meta)
    else:
        logging.error("Please specify a region for rendering.")
        sys.exit(4)

    if options.threads > 1 and writer.multithreading():
        render_tiles_multithreaded(generator,
                                   options.style,
                                   writer,
                                   num_threads=options.threads,
                                   scale=options.scale,
                                   renderlist=options.for_renderd)
    else:
        render_tiles(generator,
                     options.style,
                     writer,
                     scale=options.scale,
                     renderlist=options.for_renderd)

    writer.close()
示例#20
0
文件: nik4.py 项目: Python3pkg/Nik4
def add_fonts(path):
    if os.path.exists(path):
        mapnik.register_fonts(path)
    else:
        raise Exception('The directory "{p}" does not exists'.format(p=path))
示例#21
0
        z = int(args.lonlat[0])
        lonx = float(args.lonlat[1])
        laty = float(args.lonlat[2])
        x, y = deg2num(lonx, laty, z)

    if args.zxy:
        z = int(args.zxy[0])
        x = int(args.zxy[1])
        y = int(args.zxy[2])

    if args.time:
        start = time.time()

    import mapnik
    custom_fonts_dir = '/etc/mapnik-osm-data/fonts/'
    mapnik.register_fonts(custom_fonts_dir)
    m = mapnik.Map(256, 256)
    mapnik.load_map(m, mapfile)
    bba = TileToBBox(x, y, z)
    bbox = mapnik.Box2d(bba[0], bba[1], bba[2], bba[3])
    m.zoom_to_box(bbox)
    im = mapnik.Image(256, 256)
    mapnik.render(m, im)
    if args.outputfile:
        ofile = args.outputfile
    else:
        ofile = args.prefix + '-' + str(z) + '-' + str(x) + '-' + str(
            y) + '.png'

    if ofile != '-':
        f = open(ofile, 'w')
示例#22
0
 def addCustomFonts(self, customFontsDir):
     '''
     Picks the font that the labels are written in.
     '''
     register_fonts(customFontsDir)
示例#23
0
import json
import cairo

from io import BytesIO
from mapnik import Map, Projection, ProjTransform, Box2d, load_map, \
                   load_map_from_string, render, register_fonts
from flask import current_app
from geojson import FeatureCollection, Feature, Point
from timeit import default_timer as timer
from app.utils import get_xml, strip


register_fonts('/usr/share/fonts')


class MapRenderer:
    """ Class for rendering maps through mapnik """
    def __init__(self, content):
        """ With MapRenderer you can render an aktionskarten map in different
            file formats like pdf, svg or png.

            Internally it uses mapnik and cairo to archieve this. A valid style
            has to be defined through `MAPNIK_OSM_XML`. Normally this a carto
            derived `style.xml`. In this file your datasource is specified. This
            can be for instance a postgres+postgis database with imported osm
            data.

            :param content: dict of map content
        """
        # Mapnik uses mercator as internal projection. Our data is encoded in
        # latlon. Therefor we need a transformer for coordindates from longlat
示例#24
0
    def __init__(self, config_files=None):
        """Instanciate a new configured OCitySMap instance.

        Args:
            config_file (string or list or None): path, or list of paths to
                the OCitySMap configuration file(s). If None, sensible defaults
                are tried.
        """

        if config_files is None:
            config_files = ['/etc/ocitysmap.conf', '~/.ocitysmap.conf']
        elif not isinstance(config_files, list):
            config_files = [config_files]

        config_files = set(map(os.path.expanduser, config_files))
        LOG.debug('Reading OCitySMap configuration from %s...' %
                  ', '.join(config_files))

        self._parser = configparser.ConfigParser()
        self._parser.optionxform = str  # make option names case sensitive

        if not self._parser.read(config_files, encoding='utf-8'):
            raise IOError('None of the configuration files could be read!')

        self._locale_path = os.path.join(os.path.dirname(__file__), '..',
                                         'locale')
        self.__dbs = {}

        # Read stylesheet configuration
        self.STYLESHEET_REGISTRY = Stylesheet.create_all_from_config(
            self._parser)
        if not self.STYLESHEET_REGISTRY:
            raise ValueError( \
                    'OCitySMap configuration does not contain any stylesheet!')
        LOG.debug('Found %d Mapnik stylesheets.' %
                  len(self.STYLESHEET_REGISTRY))

        self.OVERLAY_REGISTRY = Stylesheet.create_all_from_config(
            self._parser, "overlays")
        LOG.debug('Found %d Mapnik overlay styles.' %
                  len(self.OVERLAY_REGISTRY))

        # register additional font path directories if set
        try:
            font_path = self._parser.get('rendering', 'font_path')
            for font_dir in font_path.split(os.pathsep):
                mapnik.register_fonts(font_dir)
        except configparser.NoOptionError:
            pass

        r_paper = re.compile('^\s*(\d+)\s*x\s*(\d+)\s*$')

        if self._parser.has_section('paper_sizes'):
            self.PAPER_SIZES = []
            for key in self._parser['paper_sizes']:
                value = self._parser['paper_sizes'][key]
                try:
                    (w, h) = r_paper.match(value).groups()
                    self.PAPER_SIZES.append((key, int(w), int(h)))
                except:
                    LOG.warning(
                        "Ignoring invalid paper size '%s' for format '%s'" %
                        (key, value))
        else:
            # minimal fallback configuration
            self.PAPER_SIZES = [
                ('DinA4', 210, 297),
                ('US_letter', 216, 279),
            ]

        self.PAPER_SIZES.append(('Best fit', None, None))
        self.PAPER_SIZES.append(('Custom', None, None))

        if self._parser.has_section('multipage_paper_sizes'):
            self.MULTIPAGE_PAPER_SIZES = []
            for key in self._parser['multipage_paper_sizes']:
                value = self._parser['multipage_paper_sizes'][key]
                try:
                    (w, h) = r_paper.match(value).groups()
                    self.MULTIPAGE_PAPER_SIZES.append((key, int(w), int(h)))
                except Exception as e:
                    LOG.warning(
                        "Ignoring invalid paper size '%s' for multi page format '%s'"
                        % (key, value))
        else:
            # minimal fallback configuration
            self.MULTIPAGE_PAPER_SIZES = [
                ('DinA4', 210, 297),
                ('US_letter', 216, 279),
            ]
示例#25
0
文件: nik4.py 项目: jekhor/Nik4
def add_fonts(path):
	if os.path.exists(path):
		mapnik.register_fonts(path)
	else:
		raise Exception('The directory "{p}" does not exists'.format(p=path))
 def addCustomFonts(self, customFontsDir):
     '''
     Picks the font that the labels are written in.
     '''
     register_fonts(customFontsDir)