def test_bbox(self): bbox = Bbox() self.assertEqual(bbox.bounds_str(), '-180.0,-85.0511,180.0,85.0511') self.assertEqual(bbox.to_tiles(0), (0, 0, 0, 0)) self.assertEqual(bbox.to_tiles(10), (0, 0, 1023, 1023)) bbox = Bbox('40.463151,-74.088020,40.755840,-73.426377') self.assertEqual(bbox.bounds_str(), '40.463151,-74.08802,40.75584,-73.426377') self.assertEqual(bbox.to_tiles(0), (0, 0, 0, 0)) self.assertEqual(bbox.to_tiles(10), (627, 825, 627, 832))
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()
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)