def gen_tile(inputfile, outputfile): print "Rendering %s to %s" % (inputfile, outputfile) tilesize, mydata = readhgt(inputfile) debug.write("Height min=%f, max=%f" % (mydata.min(), mydata.max())) data = mydata.astype(numpy.float64) # Flip to make sure North is up data = numpy.flipud(data) data = data * 255 / 2600.0 debug.write("AdjustedHeight min=%f, max=%f" % (data.min(), data.max())) make_jpg(data, outputfile)
def generate(latlon, distance, name, target_size, minimum_height, remove_base_ele, elevation_exaggaration, input, outfile): filename = latlon.filename(input) if filename is None: # Unable to find height data return tilesize, hgt_2darray = readhgt(filename) lat = int(latlon.lat_val(min_only=True) * tilesize) lon = int(latlon.lon_val(min_only=True) * tilesize) debug.write(" Height for loaded file: min=%f, max=%f" % (hgt_2darray.min(), hgt_2darray.max())) lon_length = calc_lon_len(latlon.get_lat()) lat_length = calc_lat_len(latlon.get_lon()) elements_to_use_x = distance / (lat_length / tilesize) elements_to_use_y = distance / (lon_length / tilesize) size_x = int(elements_to_use_x) size_y = int(elements_to_use_y) debug.write("Length of 1\" longitude=%f meter" % (lon_length)) debug.write("Length of 1\" lattitude=%f meter" % (lat_length)) debug.write("Using %dx%d array elements" % (size_x, size_y)) data = numpy.zeros(size_x * size_y, dtype=numpy.float64).reshape((size_x, size_y)) for y in xrange(size_y): for x in xrange(size_x): ylon = (lon - size_y / 2) + y xlat = (lat + size_x / 2) - x zzz = gethgt(hgt_2darray, xlat, ylon) data[x, y] = zzz zmin = data.min() zmax = data.max() debug.write(" Height for selected data: min=%f max=%f" % (zmin, zmax)) lowest_ele = 0 highest_ele = zmax if remove_base_ele: print "Removing base ele of %d meters" % (zmin) lowest_ele = zmin data = data - zmin # Scale data from 0.0 to 1.0 data = data / data.max() # Calculate model height based on scale target_height = target_size / distance * (highest_ele - lowest_ele) # Calculate model scale the_scale = distance / (target_size / 1000) print "Model scale data:" print " Model length=%.1f mm (Real life=%d meter)" % (target_size, distance) print " Model scale height=%.1f mm (Real life=%d-%d meter)" % (target_height, lowest_ele, highest_ele) print " Model elevation exaggeration factor=%.1f" % (elevation_exaggaration) print " Model exaggerated height=%.1f mm" % (target_height * elevation_exaggaration) print " Model scale=1:%d" % (the_scale) description = describe_model(name, the_scale, lowest_ele, highest_ele, elevation_exaggaration) make_jpg(data * 255, outfile + ".jpg") # Scale data to target height data = data * target_height * elevation_exaggaration if data.min() < minimum_height: print " Adding minimum height of %.1f mm" % (minimum_height) data = data + minimum_height debug.write(" Height output data: min=%f max=%f" % (data.min(), data.max())) xscale = target_size / size_x sx = xscale sy = xscale * (size_x / size_y) sz = 1 debug.write(" Scale x=%f y=%f z=%f" % (sx, sy, sz)) make_scad(data, outfile + ".scad", sx, sy, sz, description)