예제 #1
0
def checkVScale(args):
    "Checks to see if the given vScale is valid for the given region."
    if (isinstance(args.vscale, list)):
        oldvscale = args.vscale[0]
    else:
        oldvscale = int(args.vscale)
    (elevmin, elevmax) = getDatasetElevs(args.region)
    if (args.doTrim):
        elevcheck = elevmax-elevmin
    else:
        elevcheck = elevmax
    vscale = min(oldvscale, elevcheck)
    vscale = max(vscale, ceil(elevcheck/mcarray.maxelev))
    if (vscale != oldvscale):
        print "Warning: vertical scale of %d for region %s is invalid (max elevation is %d, max allowed is %d) -- changed to %d" % (oldvscale, args.region, elevcheck, oldvscale*mcarray.maxelev, vscale)
    args.vscale = vscale
    return vscale
예제 #2
0
파일: tile.py 프로젝트: mackobun/TopoMC
def processTile(args, tileRowIndex, tileColIndex):
    "Actually process a tile."
    tileShape = args.tile
    mult = args.mult
    curtime = time()
    (lcds, elevds) = getDataset(args.region)
    (rows, cols) = getDatasetDims(args.region)
    (elevmin, elevmax) = getDatasetElevs(args.region)
    if (args.doTrim):
        trimElev = elevmin
    else:
        trimElev = 0
    maxRows = int(rows*mult)
    maxCols = int(cols*mult)
    baseOffset, baseSize = getTileOffsetSize(tileRowIndex, tileColIndex, tileShape, maxRows, maxCols)
    idtOffset, idtSize = getTileOffsetSize(tileRowIndex, tileColIndex, tileShape, maxRows, maxCols, idtPad=tileShape[0]+tileShape[1])
    tilelogger.info("Generating tile (%d, %d) with dimensions (%d, %d) and offset (%d, %d)..." % (tileRowIndex, tileColIndex, baseSize[0], baseSize[1], baseOffset[0], baseOffset[1]))

    baseShape = (baseSize[1], baseSize[0])
    baseArray = getLatLongArray(lcds, baseOffset, baseSize, mult)
    #idtShape = (idtSize[1], idtSize[0])
    #idtArray = getLatLongArray(lcds, idtOffset, idtSize, mult)

    # these points are scaled coordinates
    idtUL = getLatLong(lcds, int(idtOffset[0]/mult), int(idtOffset[1]/mult))
    idtLR = getLatLong(lcds, int((idtOffset[0]+idtSize[0])/mult), int((idtOffset[1]+idtSize[1])/mult))

    # nodata for landcover is equal to 11
    lcImageArray = getImageArray(lcds, (idtUL, idtLR), baseArray, nodata=11, majority=True)
    lcImageArray.resize(baseShape)

    # elevation array
    elevImageArray = getImageArray(elevds, (idtUL, idtLR), baseArray, args.vscale, trim=trimElev)
    elevImageArray.resize(baseShape)

    # TODO: go through the arrays for some special transmogrification
    # first idea: bathymetry
    depthOffset, depthSize = getTileOffsetSize(tileRowIndex, tileColIndex, tileShape, maxRows, maxCols, idtPad=args.maxdepth)
    depthShape = (depthSize[1], depthSize[0])
    depthArray = getLatLongArray(lcds, depthOffset, depthSize, mult)
    depthUL = getLatLong(lcds, int(depthOffset[0]/mult), int(depthOffset[1]/mult))
    depthLR = getLatLong(lcds, int((depthOffset[0]+depthSize[0])/mult), int((depthOffset[1]+depthSize[1])/mult))
    bigImageArray = getImageArray(lcds, (depthUL, depthLR), depthArray, majority=True)
    bigImageArray.resize(depthShape)
    bathyImageArray = getBathymetry(args, lcImageArray, bigImageArray, baseOffset, depthOffset)

    # second idea: crust
    crustImageArray = getCrust(bathyImageArray, baseArray)
    crustImageArray.resize(baseShape)

    # now we do what we do in processImage
    localmax = 0
    spawnx = 10
    spawnz = 10

    for tilex, tilez in product(xrange(baseSize[0]), xrange(baseSize[1])):
        lcval = int(lcImageArray[tilez,tilex])
        elevval = int(elevImageArray[tilez,tilex])
        bathyval = int(bathyImageArray[tilez,tilex])
        crustval = int(crustImageArray[tilez,tilex])
        real_x = baseOffset[0] + tilex
        real_z = baseOffset[1] + tilez
        if (elevval < 0):
            print "OMG elevval %d is less than zero" % (elevval)
        if (elevval > maxelev):
            tilelogger.warning('Elevation %d exceeds maximum elevation (%d)' % (elevval, maxelev))
            elevval = maxelev
        if (elevval > localmax):
            localmax = elevval
            spawnx = real_x
            spawnz = real_z
        processTerrain([(lcval, real_x, real_z, elevval, bathyval, crustval)])
    tilelogger.info('... done with (%d, %d) in %f seconds!' % (tileRowIndex, tileColIndex, (time()-curtime)))
    return (spawnx, spawnz, localmax)