Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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)