コード例 #1
0
ファイル: views.py プロジェクト: pjdufour/tilejet-server
def stats_tms(request, t=None, stat=None, z=None, x=None, y=None, u=None, ext=None):

    #==#
    verbose = True
    ix = None
    iy = None
    iyf = None
    iz = None


    if u:
        iz, ix, iy = quadkey_to_tms(u)

    elif x and y and z:
        ix = int(x)
        iy = int(y)
        iz = int(z)

    if t == "regular":
        ify = flip_y(ix,iy,iz,256,webmercator_bbox)
    else:
        ify = iy
        iy = flip_y(ix,ify,iz,256,webmercator_bbox)


    #stats = stats_tilerequest()
    cache, stats = get_from_cache('default','stats_tilerequests')

    key = z+"/"+x+"/"+y

    if not stats:
        return None

    if not stat:
        return None

    image = None
    if key in stats['global'][stat]:
        blue =  (256.0 * stats['global'][stat][key]) / stats['tile']['max']
        image = solidTile(width=256, height=256, b=int(blue), a=128)
    else:
        image = blankTile(width=256, height=256)

    if image:
        response = HttpResponse(content_type="image/png")
        image.save(response, "PNG")
        return response
    else:
        return None
コード例 #2
0
ファイル: views.py プロジェクト: pjdufour/tilejet-server
def _requestTile(request, tileservice=None, tilesource=None, tileorigin=None, z=None, x=None, y=None, u=None, ext=None):

    print "_requestTile"
    now = datetime.datetime.now()
    ip = getIPAddress(request)
    #==#
    if not tileorigin:
        tileorigin = tilesource['origin']
    #==#
    verbose = True
    ix = None
    iy = None
    iyf = None
    iz = None
    indirectTiles = None
    nearbyTiles = None
    parentTiles = None
    childrenTiles = None
    gw_client, gw_logs, gw_requests = None, None, None
    if settings.GEOWATCH_ENABLED:
        gw_client, gw_logs, gw_requests = provision_client_logs_requests()

    if u:
        iz, ix, iy = quadkey_to_tms(u)

    elif x and y and z:
        ix = int(x)
        iy = int(y)
        iz = int(z)

        if tilesource['type'] == TYPE_BING:
            u = tms_to_quadkey(ix, iy, iz)

    iy, iyf = getYValues(tileservice,tilesource,ix,iy,iz)

    tile_bbox = tms_to_bbox(ix,iy,iz)

    if tilesource['cacheable']:

        indirectTiles = []

        if settings.TILEJET['heuristic']['nearby']['enabled']:
            ir = settings.TILEJET['heuristic']['nearby']['radius']
            nearbyTiles = getNearbyTiles(ix, iy, iz, ir)
            indirectTiles.extend(nearbyTiles)
            #print "Nearby Tiles", nearbyTiles
            #print "Indirect Tiles", indirectTiles

        if settings.TILEJET['heuristic']['up']['enabled']:
            iDepth = getValue(settings.TILEJET['heuristic']['up'],'depth')
            if iDepth:
                parentTiles = getParentTiles(ix, iy, iz, depth=iDepth)
            else:
                parentTiles = getParentTiles(ix, iy, iz)
            indirectTiles.extend(parentTiles)
            #print "Parent Tiles"
            #print parentTiles

        heuristic_down = settings.TILEJET['heuristic']['down']
        if heuristic_down['enabled']:
            depth = heuristic_down['depth']
            minZoom = heuristic_down['minZoom']
            maxZoom = heuristic_down['maxZoom']
            childrenTiles = getChildrenTiles(ix, iy, iz, depth, minZoom, maxZoom)
            indirectTiles.extend(childrenTiles)
            #print "Children Tiles: "+str(len(childrenTiles))
            #print childrenTiles

        #print "indirectTiles: ", indirectTiles
        if gw_requests and indirectTiles:
            start = time.time()
            gw_requests.send_tile_requests(
                str(tilesource['id']),
                indirectTiles,
                extension=ext,
                now=now)
            print "Duration Q: ", (time.time() - start)

    #Check if requested tile is within source's extents
    returnBlankTile = False
    returnErrorTile = False
    intersects = True
    if tilesource['extents']:
        intersects = bbox_intersects_source(tilesource,ix,iyf,iz)
        if not intersects:
           returnBlankTile = True

    validZoom = 0
    #Check if inside source zoom levels
    if tilesource['minZoom'] or tilesource['maxZoom']:
        if (tilesource['minZoom'] and iz < tilesource['minZoom']):
            validZoom = -1
        elif (tilesource['maxZoom'] and iz > tilesource['maxZoom']):
           validZoom = 1

        if validZoom != 0:
            #returnBlank = True
            returnErrorTile = True 

    if returnBlankTile:
        print "responding with blank image"
        image = blankTile(width=256, height=256)
        response = HttpResponse(content_type="image/png")
        image.save(response, "PNG")
        return response

    if returnErrorTile:
        print "responding with a red image"
        image = redTile(width=256, height=256)
        response = HttpResponse(content_type="image/png")
        image.save(response, "PNG")
        return response

    tile = None
    if tilesource['cacheable'] and iz >= settings.TILEJET['cache']['memory']['minZoom'] and iz <= settings.TILEJET['cache']['memory']['maxZoom']:
        #key = "{layer},{z},{x},{y},{ext}".format(layer=tilesource.name,x=ix,y=iy,z=iz,ext=ext)
        key = ",".join([tilesource['name'],str(iz),str(ix),str(iy),ext])
        tilecache, tile = getTileFromCache(
            settings.CACHES['tiles']['LOCATION'],
            settings.CACHES['tiles'],
            'tiles',
            key,
            True,
            GEVENT_MONKEY_PATCH=True)

        if not tilecache:
            print "Error: Could not connect to cache (tiles)."
            line = "Error: Could not connect to cache (tiles)."
            logTileRequestError(line, now)

        if tile:
            if verbose:
                print "cache hit for "+key
            logTileRequest(tileorigin, tilesource['name'], x, y, z, ext, 'hit', now, ip, gw_logs=gw_logs)
        else:
            if tilecache and verbose:
                print "cache miss for "+key
            logTileRequest(tileorigin, tilesource['name'], x, y, z, ext, 'miss', now, ip, gw_logs=gw_logs)

            if tilesource['type'] == TYPE_TMS:
                tile = requestTileFromSource(tilesource=tilesource,x=ix,y=iy,z=iz,ext=ext,verbose=True)
            elif tilesource['type'] == TYPE_TMS_FLIPPED:
                tile = requestTileFromSource(tilesource=tilesource,x=ix,y=iyf,z=iz,ext=ext,verbose=True)
            elif tilesource['type'] == TYPE_BING:
                tile = requestTileFromSource(tilesource=tilesource,u=u,ext=ext,verbose=True)

            if settings.ASYNC_WRITEBACK:
                from base64 import b64encode
                try:
                    taskWriteBackTile.apply_async(
                        args=[key, json.dumps(tile['headers']), b64encode(tile['data'])],
                        kwargs=None,
                        queue="writeback")
                except:
                    print "Error: Could not connect to writeback queue."
                    line = "Error: Could not connect to writeback queue."
                    logTileRequestError(line, now)
            else:
                try:
                    tilecache.set(key, tile)
                except:
                    print "Error: Could not write back tile synchronously."
                    line = "Error: Could not write back tile synchronously."
                    logTileRequestError(line, now)

    else:
        if verbose:
            print "cache bypass for "+tilesource['name']+"/"+str(iz)+"/"+str(ix)+"/"+str(iy)
        logTileRequest(tileorigin, tilesource['name'], x, y, z, ext, 'bypass', now, ip, gw_logs=gw_logs)

        if tilesource['type'] == TYPE_TMS:
            tile = requestTileFromSource(tilesource=tilesource,x=ix,y=iy,z=iz,ext=ext,verbose=True)
        elif tilesource['type'] == TYPE_TMS_FLIPPED:
            tile = requestTileFromSource(tilesource=tilesource,x=ix,y=iyf,z=iz,ext=ext,verbose=True)
        elif tilesource['type'] == TYPE_BING:
            tile = requestTileFromSource(tilesource=tilesource,u=u,ext=ext,verbose=True)



    if not tile:
        print "responding with a red image"
        image = redTile(width=256, height=256)
        response = HttpResponse(content_type="image/png")
        image.save(response, "PNG")
        return response

    #print "Headers:"
    #print tile['headers']
    image = Image.open(StringIO.StringIO(tile['data']))
    #Is Tile blank.  then band.getextrema should return 0,0 for band 4
    #Tile Cache watermarking is messing up bands
    #bands = image.split()
    #for band in bands:
    #    print band.getextrema()
    response = HttpResponse(content_type="image/png")
    image.save(response, "PNG")
    return response