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
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)