Example #1
0
def test_utf8grid_disk_to_mbtiles():
    os.mkdir('test/output')
    mbtiles_to_disk('test/data/utf8grid.mbtiles', 'test/output/original', callback=None)
    disk_to_mbtiles('test/output/original/', 'test/output/imported.mbtiles')
    mbtiles_to_disk('test/output/imported.mbtiles', 'test/output/imported', callback=None)
    assert os.path.exists('test/output/imported/0/0/0.grid.json')
    original = json.load(open('test/output/original/0/0/0.grid.json'))
    imported = json.load(open('test/output/imported/0/0/0.grid.json'))
    assert original['data']['77'] == imported['data']['77'] == {u'ISO_A2': u'FR'}
Example #2
0
def test_utf8grid_disk_to_mbtiles():
    os.mkdir('test/output')
    mbtiles_to_disk('test/data/utf8grid.mbtiles', 'test/output/original', callback=None)
    disk_to_mbtiles('test/output/original/', 'test/output/imported.mbtiles')
    mbtiles_to_disk('test/output/imported.mbtiles', 'test/output/imported', callback=None)
    assert os.path.exists('test/output/imported/0/0/0.grid.json')
    original = json.load(open('test/output/original/0/0/0.grid.json'))
    imported = json.load(open('test/output/imported/0/0/0.grid.json'))
    assert original['data']['77'] == imported['data']['77'] == {u'ISO_A2': u'FR'}
Example #3
0
def __create_chart_mb_tiles(region):
    region_charts_dir = os.path.join(config.unmerged_tile_dir, region + '.opt')
    for chart in os.listdir(region_charts_dir):
        print('archiving mbtiles for chart:', chart)
        chart_dir = os.path.join(region_charts_dir, chart)
        prefix = re.sub(r'\W+', '_', chart).lower()
        mbtiles_file = os.path.join(config.compiled_dir, prefix + '.mbtiles')
        if os.path.isfile(mbtiles_file):
            os.remove(mbtiles_file)
        mb.disk_to_mbtiles(chart_dir, mbtiles_file, format='png', scheme='xyz')
def test_disk_to_mbtiles_zyx():
    os.mkdir('test/output')
    disk_to_mbtiles('test/data/tiles/zyx',
                    'test/output/zyx.mbtiles',
                    scheme='zyx',
                    format='png')
    mbtiles_to_disk('test/output/zyx.mbtiles',
                    'test/output/tiles',
                    callback=None)
    assert os.path.exists('test/output/tiles/3/1/5.png')
Example #5
0
def _create_region_mb_tiles(checkpoint_store, profile, region):
    point = CheckPoint.CHECKPOINT_ARCHIVE
    if checkpoint_store.get_checkpoint(region, profile) < point:
        print('archiving mbtiles for region:', region)
        region_dir = os.path.join(config.merged_tile_dir, region + '.opt')
        mbtiles_file = os.path.join(config.compiled_dir, region + '.mbtiles')
        if os.path.isfile(mbtiles_file):
            os.remove(mbtiles_file)
        mb.disk_to_mbtiles(region_dir, mbtiles_file, format='png', scheme='xyz')

        checkpoint_store.clear_checkpoint(region, profile, point)
    else:
        print('skipping checkpoint', point)
Example #6
0
def test_mbtiles_to_disk_and_back():
    mbtiles_to_disk('test/data/one_tile.mbtiles', 'test/output')
    assert os.path.exists('test/output/0/0/0.png')
    disk_to_mbtiles('test/output/', 'test/output/one.mbtiles')
    assert os.path.exists('test/output/one.mbtiles')
Example #7
0
    def run(self, force=False):
        """
        Build a MBTile file.

        force -- overwrite if MBTiles file already exists.
        """
        if os.path.exists(self.filepath):
            if force:
                logger.warn(_("%s already exists. Overwrite.") % self.filepath)
                os.remove(self.filepath)
            else:
                # Already built, do not do anything.
                logger.info(_("%s already exists. Nothing to do.") % self.filepath)
                return

        # Clean previous runs
        self._clean_gather()

        # If no coverage added, use bottom layer metadata
        if len(self._bboxes) == 0 and len(self._layers) > 0:
            bottomlayer = self._layers[0]
            metadata = bottomlayer.reader.metadata()
            if 'bounds' in metadata:
                logger.debug(_("Use bounds of bottom layer %s") % bottomlayer)
                bbox = map(float, metadata.get('bounds', '').split(','))
                zoomlevels = range(int(metadata.get('minzoom', 0)), int(metadata.get('maxzoom', 0)))
                self.add_coverage(bbox=bbox, zoomlevels=zoomlevels)

        # Compute list of tiles
        tileslist = set()
        for bbox, levels in self._bboxes:
            logger.debug(_("Compute list of tiles for bbox %s on zooms %s.") % (bbox, levels))
            bboxlist = self.tileslist(bbox, levels)
            logger.debug(_("Add %s tiles.") % len(bboxlist))
            tileslist = tileslist.union(bboxlist)
            logger.debug(_("%s tiles in total.") % len(tileslist))
        self.nbtiles = len(tileslist)
        if not self.nbtiles:
            raise EmptyCoverageError(_("No tiles are covered by bounding boxes : %s") % self._bboxes)
        logger.debug(_("%s tiles to be packaged.") % self.nbtiles)

        # Go through whole list of tiles and gather them in tmp_dir
        self.rendered = 0
        for (z, x, y) in tileslist:
            try:
                self._gather((z, x, y))
            except Exception as e:
                logger.warn(e)
                if not self.ignore_errors:
                    raise

        logger.debug(_("%s tiles were missing.") % self.rendered)

        # Some metadata
        middlezoom = self.zoomlevels[len(self.zoomlevels)/2]
        lat = self.bounds[1] + (self.bounds[3] - self.bounds[1])/2
        lon = self.bounds[0] + (self.bounds[2] - self.bounds[0])/2
        metadata = {}
        metadata['name'] = str(uuid.uuid4())
        metadata['format'] = self._tile_extension[1:]
        metadata['minzoom'] = self.zoomlevels[0]
        metadata['maxzoom'] = self.zoomlevels[-1]
        metadata['bounds'] = '%s,%s,%s,%s' % tuple(self.bounds)
        metadata['center'] = '%s,%s,%s' % (lon, lat, middlezoom)
        #display informations from the grids on hover
        content_to_display = ''
        for field_name in self.grid_fields:
            content_to_display += "{{{ %s }}}<br>" % field_name
        metadata['template'] = '{{#__location__}}{{/__location__}} {{#__teaser__}} \
        %s {{/__teaser__}}{{#__full__}}{{/__full__}}' % content_to_display
        metadatafile = os.path.join(self.tmp_dir, 'metadata.json')
        with open(metadatafile, 'w') as output:
            json.dump(metadata, output)

        # TODO: add UTF-Grid of last layer, if any

        # Package it!
        logger.info(_("Build MBTiles file '%s'.") % self.filepath)
        extension = self.tile_format.split("image/")[-1]
        disk_to_mbtiles(
            self.tmp_dir,
            self.filepath,
            format=extension,
            scheme=self.cache.scheme
        )

        try:
            os.remove("%s-journal" % self.filepath)  # created by mbutil
        except OSError, e:
            pass
Example #8
0
    def run(self, force=False, metadata={}):
        """
        Build a MBTile file.

        force -- overwrite if MBTiles file already exists.
        metadata -- a dictionary object containing metadata key/values to set
                    on metadata table
        """
        if os.path.exists(self.filepath):
            if force:
                logger.warn(_("%s already exists. Overwrite.") % self.filepath)
                os.remove(self.filepath)
            else:
                # Already built, do not do anything.
                logger.info(_("%s already exists. Nothing to do.") % self.filepath)
                return

        # Clean previous runs
        self._clean_gather()

        # If no coverage added, use bottom layer metadata
        if len(self._bboxes) == 0 and len(self._layers) > 0:
            bottomlayer = self._layers[0]
            base_metadata = bottomlayer.reader.metadata()
            if 'bounds' in base_metadata:
                logger.debug(_("Use bounds of bottom layer %s") % bottomlayer)
                bbox = map(float, base_metadata.get('bounds', '').split(','))
                zoomlevels = range(int(base_metadata.get('minzoom', 0)), int(base_metadata.get('maxzoom', 0)))
                self.add_coverage(bbox=bbox, zoomlevels=zoomlevels)

        # Compute list of tiles
        tileslist = set()
        for bbox, levels in self._bboxes:
            logger.debug(_("Compute list of tiles for bbox %s on zooms %s.") % (bbox, levels))
            bboxlist = self.tileslist(bbox, levels)
            logger.debug(_("Add %s tiles.") % len(bboxlist))
            tileslist = tileslist.union(bboxlist)
            logger.debug(_("%s tiles in total.") % len(tileslist))
        self.nbtiles = len(tileslist)
        if not self.nbtiles:
            raise EmptyCoverageError(_("No tiles are covered by bounding boxes : %s") % self._bboxes)
        logger.debug(_("%s tiles to be packaged.") % self.nbtiles)

        # Go through whole list of tiles and gather them in tmp_dir
        self.rendered = 0
        for (z, x, y) in tileslist:
            try:
                self._gather((z, x, y))
            except Exception as e:
                logger.warn(e)
                if not self.ignore_errors:
                    raise

        logger.debug(_("%s tiles were missing.") % self.rendered)

        # Some metadata
        middlezoom = self.zoomlevels[len(self.zoomlevels)/2]
        lat = self.bounds[1] + (self.bounds[3] - self.bounds[1])/2
        lon = self.bounds[0] + (self.bounds[2] - self.bounds[0])/2
        out_metadata = {}
        out_metadata['version'] = metadata.get("version", "1.1")
        out_metadata['type'] = metadata.get("type", "baselayer")
        out_metadata['description'] = metadata.get("description", "created by landez")
        out_metadata['name'] = metadata.get("name", str(uuid.uuid4()))
        out_metadata['format'] = self._tile_extension[1:]
        out_metadata['minzoom'] = self.zoomlevels[0]
        out_metadata['maxzoom'] = self.zoomlevels[-1]
        out_metadata['bounds'] = '%s,%s,%s,%s' % tuple(self.bounds)
        out_metadata['center'] = '%s,%s,%s' % (lon, lat, middlezoom)
        #display informations from the grids on hover
        content_to_display = ''
        for field_name in self.grid_fields:
            content_to_display += "{{{ %s }}}<br>" % field_name
        out_metadata['template'] = '{{#__location__}}{{/__location__}} {{#__teaser__}} \
        %s {{/__teaser__}}{{#__full__}}{{/__full__}}' % content_to_display
        metadatafile = os.path.join(self.tmp_dir, 'metadata.json')
        with open(metadatafile, 'w') as output:
            json.dump(out_metadata, output)

        # TODO: add UTF-Grid of last layer, if any

        # Package it!
        logger.info(_("Build MBTiles file '%s'.") % self.filepath)
        extension = self.tile_format.split("image/")[-1]
        disk_to_mbtiles(
            self.tmp_dir,
            self.filepath,
            format=extension,
            scheme=self.cache.scheme
        )

        try:
            os.remove("%s-journal" % self.filepath)  # created by mbutil
        except OSError, e:
            pass
Example #9
0
        tiles_dir,
        tiles_ext,
    )

    # Import `tiles` directory into a `MBTiles` file
    if mbtiles_path:
        if os.path.isfile(mbtiles_path):
            # `MBTiles` file must not already exist
            sys.stderr.write("Importing tiles into already-existing MBTiles is not yet supported\n")
            sys.exit(1)

        metadata = {
            "name": os.path.splitext(os.path.basename(mbtiles_path))[0],
            "format": tiles_ext,
            "bounds": f"{str(args.bbox[0])}, {str(args.bbox[1])}, {str(args.bbox[2])}, {str(args.bbox[3])}",
            "minzoom": str(args.min),
            "maxzoom": str(args.max),
            "attribution": "",
            "description": "",
            "type": "",
            "version": "",
        }

        metadata = {k: v for k, v in metadata.items() if v != ""}

        with open(os.path.join(tiles_dir, "metadata.json"), "w") as outfile:
            json.dump(metadata, outfile, sort_keys=True, indent=4, separators=(",", ": "))

        args.format = tiles_ext
        disk_to_mbtiles(tiles_dir, mbtiles_path, **args.__dict__)
Example #10
0
                        v2 = kap_px_at(kap_px0[0],   kap_px0[1]+1)
                        v3 = kap_px_at(kap_px0[0]+1, kap_px0[1]+1)

                        def interp(d, v0, v1):
                            return map(lambda v0, v1: v0*(1-d) + v1*d, v0, v1)

                        v01 = interp(d[0], v0, v1)
                        v23 = interp(d[0], v2, v3)

                        v = interp(d[1], v01, v23)
                    else:
                        v = kap_px_at(int(round(kap_px0[0])),
                                      int(round(kap_px0[1])))

                    v = map(lambda x : min(max(int(x), 0), 255), v)

                    ind = 4*x
                    tile_pixels[y][ind+0] = v[0]
                    tile_pixels[y][ind+1] = v[1]
                    tile_pixels[y][ind+2] = v[2]
                    tile_pixels[y][ind+3] = 255

        png.from_array(tile_pixels, 'RGBA').save(tile_path)

# write mbtiles to disk
disk_to_mbtiles(tiles_dir, sys.argv[2])

# cleanup
import shutil
shutil.rmtree(tiles_dir, ignore_errors=True)
Example #11
0
 def run(self):
     logging.basicConfig(level=logging.DEBUG)
     mbutil.disk_to_mbtiles(self.args[0],self.args[1],**self.args[2])
     print "\nDone"
Example #12
0
File: tiles.py Project: 3Geo/landez
    def run(self, force=False):
        """
        Build a MBTile file, only if it does not exist.
        """
        if os.path.exists(self.filepath):
            if force:
                logger.warn(_("%s already exists. Overwrite.") % self.filepath)
            else:
                # Already built, do not do anything.
                logger.info(_("%s already exists. Nothing to do.") % self.filepath)
                return
        
        # Clean previous runs
        self.clean(full=force)

        # If no coverage added, use bottom layer metadata
        if len(self._bboxes) == 0 and len(self._layers) > 0:
            bottomlayer = self._layers[0]
            metadata = bottomlayer.reader.metadata()
            bbox = map(float, metadata.get('bounds', '').split(','))
            zoomlevels = range(int(metadata.get('minzoom', 0)), int(metadata.get('maxzoom', 0)))
            self.add_coverage(bbox=bbox, zoomlevels=zoomlevels)

        # Compute list of tiles
        tileslist = set()
        for bbox, levels in self._bboxes:
            logger.debug(_("Compute list of tiles for bbox %s on zooms %s.") % (bbox, levels))
            bboxlist = self.tileslist(bbox, levels)
            logger.debug(_("Add %s tiles.") % len(bboxlist))
            tileslist = tileslist.union(bboxlist)
            logger.debug(_("%s tiles in total.") % len(tileslist))
        self.nbtiles = len(tileslist)
        if not self.nbtiles:
            raise EmptyCoverageError(_("No tiles are covered by bounding boxes : %s") % self._bboxes)
        logger.debug(_("%s tiles to be packaged.") % self.nbtiles)

        # Go through whole list of tiles and gather them in tmp_dir
        self.rendered = 0
        for (z, x, y) in tileslist:
            self.prepare_tile((z, x, y))
        logger.debug(_("%s tiles were missing.") % self.rendered)

        # Some metadata
        middlezoom = self.zoomlevels[len(self.zoomlevels)/2]
        lat = self.bounds[1] + (self.bounds[3] - self.bounds[1])/2
        lon = self.bounds[0] + (self.bounds[2] - self.bounds[0])/2
        metadata = {}
        metadata['minzoom'] = self.zoomlevels[0]
        metadata['maxzoom'] = self.zoomlevels[-1]
        metadata['bounds'] = '%s,%s,%s,%s' % tuple(self.bounds)
        metadata['center'] = '%s,%s,%s' % (lon, lat, middlezoom)
        metadatafile = os.path.join(self.tmp_dir, 'metadata.json')
        with open(metadatafile, 'w') as output:
            json.dump(metadata, output)

        # TODO: add UTF-Grid of last layer, if any

        # Package it! 
        logger.info(_("Build MBTiles file '%s'.") % self.filepath)
        disk_to_mbtiles(self.tmp_dir, self.filepath)
        self.clean()
Example #13
0
    def run(self, force=False):
        """
        Build a MBTile file.

        force -- overwrite if MBTiles file already exists.
        """
        if os.path.exists(self.filepath):
            if force:
                logger.warn(_("%s already exists. Overwrite.") % self.filepath)
                os.remove(self.filepath)
            else:
                # Already built, do not do anything.
                logger.info(
                    _("%s already exists. Nothing to do.") % self.filepath)
                return

        # Clean previous runs
        self._clean_gather()

        # If no coverage added, use bottom layer metadata
        if len(self._bboxes) == 0 and len(self._layers) > 0:
            bottomlayer = self._layers[0]
            metadata = bottomlayer.reader.metadata()
            if 'bounds' in metadata:
                logger.debug(_("Use bounds of bottom layer %s") % bottomlayer)
                bbox = map(float, metadata.get('bounds', '').split(','))
                zoomlevels = range(int(metadata.get('minzoom', 0)),
                                   int(metadata.get('maxzoom', 0)))
                self.add_coverage(bbox=bbox, zoomlevels=zoomlevels)

        # Compute list of tiles
        tileslist = set()
        for bbox, levels in self._bboxes:
            logger.debug(
                _("Compute list of tiles for bbox %s on zooms %s.") %
                (bbox, levels))
            bboxlist = self.tileslist(bbox, levels)
            logger.debug(_("Add %s tiles.") % len(bboxlist))
            tileslist = tileslist.union(bboxlist)
            logger.debug(_("%s tiles in total.") % len(tileslist))
        self.nbtiles = len(tileslist)
        if not self.nbtiles:
            raise EmptyCoverageError(
                _("No tiles are covered by bounding boxes : %s") %
                self._bboxes)
        logger.debug(_("%s tiles to be packaged.") % self.nbtiles)

        # Go through whole list of tiles and gather them in tmp_dir
        self.rendered = 0
        for (z, x, y) in tileslist:
            self._gather((z, x, y))

        logger.debug(_("%s tiles were missing.") % self.rendered)

        # Some metadata
        middlezoom = self.zoomlevels[len(self.zoomlevels) / 2]
        lat = self.bounds[1] + (self.bounds[3] - self.bounds[1]) / 2
        lon = self.bounds[0] + (self.bounds[2] - self.bounds[0]) / 2
        metadata = {}
        metadata['format'] = self._tile_extension[1:]
        metadata['minzoom'] = self.zoomlevels[0]
        metadata['maxzoom'] = self.zoomlevels[-1]
        metadata['bounds'] = '%s,%s,%s,%s' % tuple(self.bounds)
        metadata['center'] = '%s,%s,%s' % (lon, lat, middlezoom)
        metadatafile = os.path.join(self.tmp_dir, 'metadata.json')
        with open(metadatafile, 'w') as output:
            json.dump(metadata, output)

        # TODO: add UTF-Grid of last layer, if any

        # Package it!
        logger.info(_("Build MBTiles file '%s'.") % self.filepath)
        disk_to_mbtiles(self.tmp_dir, self.filepath)
        try:
            os.remove("%s-journal" % self.filepath)  # created by mbutil
        except OSError, e:
            logger.debug(e)
Example #14
0

if __name__ == '__main__':

    logging.basicConfig(level=logging.DEBUG)

    parser = OptionParser(usage="usage: %prog [options] input output")
    parser.add_option('-w', '--window', dest='window',
        help='compression window size. larger values faster, dangerouser',
        type='int',
        default=2000)

    (options, args) = parser.parse_args()

    # Transfer operations
    if len(args) == 2:
        if os.path.isfile(args[0]) and os.path.exists(args[1]):
            sys.stderr.write('To export MBTiles to disk, specify a directory that does not yet exist\n')
            sys.exit(1)
        if os.path.isfile(args[0]) and not os.path.exists(args[1]):
            mbtiles_file, directory_path = args
            mbtiles_to_disk(mbtiles_file, directory_path)
        if os.path.isdir(args[0]) and os.path.isfile(args[1]):
            sys.stderr.write('Importing tiles into already-existing MBTiles is not yet supported\n')
            sys.exit(1)
        if os.path.isdir(args[0]) and not os.path.isfile(args[0]):
            directory_path, mbtiles_file = args
            disk_to_mbtiles(directory_path, mbtiles_file)
    else:
        parser.print_help()
Example #15
0
    def run(self, force=False):
        """
        Build a MBTile file.
        
        force -- overwrite if MBTiles file already exists.
        """
        if os.path.exists(self.filepath):
            if force:
                logger.warn(_("%s already exists. Overwrite.") % self.filepath)
                os.remove(self.filepath)
            else:
                # Already built, do not do anything.
                logger.info(_("%s already exists. Nothing to do.") % self.filepath)
                return
        
        # Clean previous runs
        self._clean_gather()

        # If no coverage added, use bottom layer metadata
        if len(self._bboxes) == 0 and len(self._layers) > 0:
            bottomlayer = self._layers[0]
            metadata = bottomlayer.reader.metadata()
            if 'bounds' in metadata:
                logger.debug(_("Use bounds of bottom layer %s") % bottomlayer)
                bbox = map(float, metadata.get('bounds', '').split(','))
                zoomlevels = range(int(metadata.get('minzoom', 0)), int(metadata.get('maxzoom', 0)))
                self.add_coverage(bbox=bbox, zoomlevels=zoomlevels)

        # Compute list of tiles
        tileslist = set()
        for bbox, levels in self._bboxes:
            logger.debug(_("Compute list of tiles for bbox %s on zooms %s.") % (bbox, levels))
            bboxlist = self.tileslist(bbox, levels)
            logger.debug(_("Add %s tiles.") % len(bboxlist))
            tileslist = tileslist.union(bboxlist)
            logger.debug(_("%s tiles in total.") % len(tileslist))
        self.nbtiles = len(tileslist)
        if not self.nbtiles:
            raise EmptyCoverageError(_("No tiles are covered by bounding boxes : %s") % self._bboxes)
        logger.debug(_("%s tiles to be packaged.") % self.nbtiles)

        # Go through whole list of tiles and gather them in tmp_dir
        self.rendered = 0
        for (z, x, y) in tileslist:
            self._gather((z, x, y))

        logger.debug(_("%s tiles were missing.") % self.rendered)

        # Some metadata
        middlezoom = self.zoomlevels[len(self.zoomlevels)/2]
        lat = self.bounds[1] + (self.bounds[3] - self.bounds[1])/2
        lon = self.bounds[0] + (self.bounds[2] - self.bounds[0])/2
        metadata = {}
        metadata['format'] = self._tile_extension[1:]
        metadata['minzoom'] = self.zoomlevels[0]
        metadata['maxzoom'] = self.zoomlevels[-1]
        metadata['bounds'] = '%s,%s,%s,%s' % tuple(self.bounds)
        metadata['center'] = '%s,%s,%s' % (lon, lat, middlezoom)
        metadata['version'] = '1.0.0'
        metadatafile = os.path.join(self.tmp_dir, 'metadata.json')
        with open(metadatafile, 'w') as output:
            json.dump(metadata, output)

        # TODO: add UTF-Grid of last layer, if any
	logger.info(_("Optimise PNG images"))
	if find_executable('optipng'):
	   png_optimize(self.tmp_dir)
        # Package it! 
        logger.info(_("Build MBTiles file '%s'.") % self.filepath)
        disk_to_mbtiles(self.tmp_dir, self.filepath)
        try:
            os.remove("%s-journal" % self.filepath)  # created by mbutil
        except OSError, e:
            logger.debug(e)
Example #16
0
def test_disk_to_mbtiles_zyx():
    os.mkdir('test/output')
    disk_to_mbtiles('test/data/tiles/zyx', 'test/output/zyx.mbtiles', scheme='zyx', format='png')
    mbtiles_to_disk('test/output/zyx.mbtiles', 'test/output/tiles', callback=None)
    assert os.path.exists('test/output/tiles/3/1/5.png')