Beispiel #1
0
    def copy(self, target_mbtiles, reset, auto_minmax):
        with sqlite3.connect(self.mbtiles) as conn:
            metadata = {k: v for k, v in
                        query(conn, "SELECT name, value FROM metadata", [])}

        def update_from_env(param, env_var):
            val = os.environ.get(env_var)
            if val is not None:
                metadata[param] = val

        update_from_env('name', 'METADATA_NAME')
        update_from_env('minzoom', 'MIN_ZOOM')
        update_from_env('maxzoom', 'MAX_ZOOM')
        update_from_env('attribution', 'METADATA_ATTRIBUTION')
        update_from_env('description', 'METADATA_DESCRIPTION')
        update_from_env('version', 'METADATA_VERSION')

        metadata['filesize'] = os.path.getsize(target_mbtiles)

        bbox_str = os.environ.get('BBOX')
        if bbox_str:
            bbox = Bbox(bbox=bbox_str,
                        center_zoom=os.environ.get('CENTER_ZOOM'))
            metadata["bounds"] = bbox.bounds_str()
            metadata["center"] = bbox.center_str()

        with sqlite3.connect(target_mbtiles) as conn:
            cursor = conn.cursor()
            if auto_minmax:
                metadata["minzoom"], metadata["maxzoom"] = get_minmax(cursor)
            update_metadata(cursor, metadata, reset)
        print("The metadata now contains these values:")
        self.print_all()
Beispiel #2
0
    async def generate(self, tileset, reset, auto_minmax,
                       pghost, pgport, dbname, user, password):
        ts = Tileset.parse(tileset)
        print(
            f'Connecting to PostgreSQL at {pghost}:{pgport}, db={dbname}, user={user}...')
        try:
            async with asyncpg.create_pool(
                database=dbname, host=pghost, port=pgport, user=user,
                password=password, min_size=1, max_size=1,
            ) as pool:
                async with pool.acquire() as conn:
                    mvt = MvtGenerator(
                        ts,
                        postgis_ver=await get_postgis_version(conn),
                        zoom='$1', x='$2', y='$3',
                    )
                    json_data = dict(vector_layers=await get_vector_layers(conn, mvt))
        except ConnectionError as err:
            print(f"Unable to connect to Postgres database: {err}")
            raise err

        # Convert tileset to the metadata object according to mbtiles 1.3 spec
        # https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md#content
        metadata = dict(
            # MUST
            name=os.environ.get('METADATA_NAME', ts.name),
            format="pbf",
            json=json.dumps(json_data, ensure_ascii=False, separators=(',', ':')),
            # SHOULD
            bounds=",".join((str(v) for v in ts.bounds)),
            center=",".join((str(v) for v in ts.center)),
            minzoom=os.environ.get('MIN_ZOOM', str(ts.minzoom)),
            maxzoom=os.environ.get('MAX_ZOOM', str(ts.maxzoom)),
            # MAY
            attribution=os.environ.get('METADATA_ATTRIBUTION', ts.attribution),
            description=os.environ.get('METADATA_DESCRIPTION', ts.description),
            version=os.environ.get('METADATA_VERSION', ts.version),
            # EXTRAS
            filesize=os.path.getsize(self.mbtiles),
        )

        bbox_str = os.environ.get('BBOX')
        if bbox_str:
            bbox = Bbox(bbox=bbox_str,
                        center_zoom=os.environ.get('CENTER_ZOOM', ts.center[2]))
            metadata["bounds"] = bbox.bounds_str()
            metadata["center"] = bbox.center_str()

        with sqlite3.connect(self.mbtiles) as conn:
            cursor = conn.cursor()
            if auto_minmax:
                metadata["minzoom"], metadata["maxzoom"] = get_minmax(cursor)
            update_metadata(cursor, metadata, reset)

        print("The metadata now contains these values:")
        self.print_all()
    def _update_metadata(self,
                         metadata,
                         auto_minmax,
                         reset,
                         file,
                         center_zoom=None):
        def update_from_env(param, env_var):
            val = os.environ.get(env_var)
            if val is not None:
                metadata[param] = val

        update_from_env('name', 'METADATA_NAME')
        update_from_env('minzoom', 'MIN_ZOOM')
        update_from_env('maxzoom', 'MAX_ZOOM')
        update_from_env('attribution', 'METADATA_ATTRIBUTION')
        update_from_env('description', 'METADATA_DESCRIPTION')
        update_from_env('version', 'METADATA_VERSION')

        metadata['filesize'] = os.path.getsize(file)

        bbox_str = os.environ.get('BBOX')
        if bbox_str:
            bbox = Bbox(bbox=bbox_str,
                        center_zoom=os.environ.get('CENTER_ZOOM', center_zoom))
            metadata["bounds"] = bbox.bounds_str()
            metadata["center"] = bbox.center_str()

        with sqlite3.connect(file) as conn:
            cursor = conn.cursor()
            if auto_minmax:
                cursor.execute(
                    "SELECT MIN(zoom_level), MAX(zoom_level) FROM map")
                min_z, max_z = cursor.fetchone()
                if min_z is None:
                    raise ValueError(
                        "Unable to get min/max zoom - tile data is empty")
                metadata["minzoom"] = min_z
                metadata["maxzoom"] = max_z
            self._update_metadata_db(cursor, metadata, reset)
            conn.commit()

        print(f"New metadata values in {file}")
        self.print_all(file=file)
    def _update_metadata(self,
                         metadata,
                         auto_minmax,
                         reset,
                         file,
                         center_zoom=None):
        def update_from_env(param, env_var):
            val = getenv(env_var)
            if val is not None:
                metadata[param] = val

        update_from_env('name', 'METADATA_NAME')
        update_from_env('minzoom', 'MIN_ZOOM')
        update_from_env('maxzoom', 'MAX_ZOOM')
        update_from_env('attribution', 'METADATA_ATTRIBUTION')
        update_from_env('description', 'METADATA_DESCRIPTION')
        update_from_env('version', 'METADATA_VERSION')

        metadata['filesize'] = os.path.getsize(file)

        bbox_str = getenv('BBOX')
        if bbox_str:
            bbox = Bbox(bbox=bbox_str,
                        center_zoom=getenv('CENTER_ZOOM', center_zoom))
            metadata['bounds'] = bbox.bounds_str()
            metadata['center'] = bbox.center_str()

        with sqlite3.connect(file) as conn:
            cursor = conn.cursor()
            if auto_minmax:
                min_z, max_z = self.find_min_max_zoom(cursor)
                if min_z is None:
                    raise ValueError(
                        'Unable to get min/max zoom - tile data is empty')
                metadata['minzoom'] = min_z
                metadata['maxzoom'] = max_z
            self._update_metadata_db(cursor, metadata, reset)
            conn.commit()

        print(f'New metadata values in {file}')
        self.print_all(file=file)