def createS3BasedTileJSON(params): t0 = time.time() maxChunks = 50 baseUrls = getBaseUrls(params) tiles = Tiles(params.bounds, params.minZoom, params.maxScanZoom, t0, fullonly=params.fullonly, basePath=params.bucketBasePath, tFormat=params.format, gridOrigin=params.gridOrigin, tilesURLs=params.tilesURLs) pm = PoolManager(logger=logger, factor=1, store=True) tMeta = LayerMetadata(bounds=params.bounds, minzoom=params.minZoom, maxzoom=params.maxZoom, baseUrls=baseUrls, description=params.description, attribution=params.attribution, format=params.format, name=params.name) pm.process(tiles, tileNotExists, maxChunks) for xyz in pm.results: tMeta.removeTile(xyz[0], xyz[1], xyz[2]) return tMeta.toJSON()
def createModelBasedTileJSON(params): tilecount = 0 t0 = time.time() baseUrls = getBaseUrls(params) engine = getEngine(params) metadata = sqlalchemy.MetaData(bind=engine, schema=params.dbSchema) metadata.reflect() try: table = metadata.tables[params.dbSchema + '.' + params.tableName] except KeyError: raise ValueError( 'Table %s in schema %s could not be found' % ( params.tableName, params.dbSchema)) # We assume a pkey is defined by only one column for now. pkColumn = table.primary_key.columns.items()[0] pkColumnName = pkColumn[0].__str__() pkColumnType = pkColumn[1].type.__class__ model = getOrmModel(pkColumnName, pkColumnType, params) # Bounds generated from DB try: conn = engine.connect() bounds = conn.execute( tableExtentLiteral( params.dbSchema, params.tableName, params.sridFrom) ).fetchone() strBounds = tuple(['{:2f}'.format(i) for i in bounds]) # Tuple to list for json converison bounds = [b for b in bounds] logger.info('Bounds are %s, %s, %s, %s' % strBounds) except Exception as e: logger.error( 'An error occured while determining the bounds', exc_info=True) raise Exception(e) finally: conn.close() # pre-calculate the maximazed buffers in degrees if params.pxTolerance: geodetic = GlobalGeodetic(True) buffers = {} for z in range(params.minZoom, params.maxZoom): buffers[z] = degreesToMeters( geodetic.Resolution(z) * float(params.pxTolerance) ) try: session = scoped_session(sessionmaker(bind=engine)) # We usually don't scan the last levels tiles = Tiles( bounds, params.minZoom, params.maxScanZoom, t0 ) tMeta = LayerMetadata( bounds=bounds, minzoom=params.minZoom, maxzoom=params.maxZoom, baseUrls=baseUrls, description=params.description, attribution=params.attribution, name=params.name ) for tile in tiles: metaBuffer = 0. tilecount += 1 if params.pxTolerance: xyz = tile[1] metaBuffer = buffers[xyz[2]] noGeom = scanLayer( tile, session, model, params.sridFrom, params.sridTo, metaBuffer, tilecount ) if noGeom: tMeta.removeTile(noGeom[0], noGeom[1], noGeom[2]) finally: session.close() engine.dispose() return (tMeta.toJSON(), tilecount)