def euclidean_distance_fields(prefix, region, overwrite=False): """ Generate euclidean distance fields from map corner and centre coordinates Parameters ---------- prefix : str Name to use as prefix to save distance maps region : grass.pygrass.gis.region.Region Region overwrite : bool Whether to overwrite existing maps """ point_topleft = Point(region.west + region.ewres / 2, region.north - region.nsres / 2) point_topright = Point(region.east - region.ewres / 2, region.north - region.nsres / 2) point_lowerleft = Point(region.west + region.ewres / 2, region.south + region.nsres / 2) point_lowerright = Point(region.east - region.ewres / 2, region.south + region.nsres / 2) point_centre = Point( region.west + (region.east - region.west) / 2, region.south + (region.north - region.south) / 2, ) points = { "topleft": point_topleft, "topright": point_topright, "lowerleft": point_lowerleft, "lowerright": point_lowerright, "centre": point_centre, } for name, p in points.items(): point_name = "_".join([prefix, name]) vect = VectorTopo(name=point_name) vect.open( mode="w", tab_name=point_name, tab_cols=[("cat", "INTEGER PRIMARY KEY"), ("name", "TEXT")], ) vect.write(p, ("point", )) vect.table.conn.commit() vect.close() gvect.to_rast( input=point_name, type="point", use="val", output=point_name, overwrite=overwrite, ) grast.grow_distance(point_name, distance="distance_to_" + point_name, overwrite=overwrite) g.remove(name=point_name, type="raster", flags="f") g.remove(name=point_name, type="raster", flags="f")
# Define region grass.run_command('g.region', vect = i, res = '00:00:00.9', align = map_for_define_region, flags = 'p') # Use vector as a mask grass.run_command('r.mask', vector = i, cat = 2, overwrite = True) # Mask for the buffer for individual i # Cut maps for mm in maps: expr = i+'_'+mm+' = '+mm+'@PERMANENT' print expr r.mapcalc(expr, overwrite = True) # distance from roads r.grow_distance(input = i+'_'+'gROADS_v1_americas_rast', distance = i+'_'+'gROADS_v1_dist_from_roads_meters_exp', metric = 'geodesic', flags = 'm', overwrite = True) # road density size = 9990/30 # 10 km = 333 pixels r.neighbors(input = i+'_'+'gROADS_v1_americas_rast', output = i+'_'+'gROADS_v1_road_density_pixels_per_100km2', method = 'sum', size = size, overwrite = True) r.mapcalc(i+'_'+'gROADS_v1_road_density_km_per_100km2_exp = '+i+'_'+'gROADS_v1_road_density_pixels_per_100km2 * 30 / 1000', overwrite = True) # Hansen bin r.mapcalc(i+'_Neotropic_Hansen_percenttreecoverd_2000_wgs84_gt0_binary = if(Neotropic_Hansen_percenttreecoverd_2000_wgs84 > 0, 1, 0)', overwrite = True) # Hansen correspondent year expr = i+'_Neotropic_Hansen_percenttreecoverd_2000_wgs84_gt0_binary_year_exp = if('+i+'_Neotropical_Hansen_treecoverlossperyear_wgs84_2017 > 0 && '+ \ i+'_Neotropical_Hansen_treecoverlossperyear_wgs84_2017 < '+str(yy)+', 0, '+i+'_Neotropic_Hansen_percenttreecoverd_2000_wgs84_gt0_binary)'
export=False, dirout='') maps_forest[56] # patch size patch_size(input_maps=maps_forest, remove_trash=True, export=False) # distance to roads road_maps = grass.list_grouped(type='raster', pattern='*roads*')['PERMANENT'] road_maps = [i for i in road_maps if 'dist' not in i] for i in road_maps: g.region(raster=i, flags='p') r.grow_distance(input=i, distance=i + '_road_dist_m', overwrite=True) # distance to water water_maps1 = grass.list_grouped(type='raster', pattern='*Drainage*')['PERMANENT'] water_maps2 = grass.list_grouped(type='raster', pattern='*Water_presence*')['PERMANENT'] water_maps = water_maps1 + water_maps2 water_maps = [i for i in water_maps if 'dist' not in i] for i in water_maps: print i g.region(raster=i, flags='p')
def compute_attractiveness(raster, metric, constant, kappa, alpha, mask=None, output_name=None): """ Compute a raster map whose values follow an (euclidean) distance function ( {constant} + {kappa} ) / ( {kappa} + exp({alpha} * {distance}) ), where: Source: http://publications.jrc.ec.europa.eu/repository/bitstream/JRC87585/lb-na-26474-en-n.pd Parameters ---------- constant : 1 kappa : A constant named 'K' alpha : A constant named 'a' distance : A distance map based on the input raster score : A score term to multiply the distance function mask : Optional raster MASK which is inverted to selectively exclude non-NULL cells from distance related computations. output_name : Name to pass to temporary_filename() to create a temporary map name Returns ------- tmp_output : A temporary proximity to features raster map. Examples -------- ... """ distance_terms = [ str(raster), str(metric), "distance", str(constant), str(kappa), str(alpha), ] if score: grass.debug(_( "Score for attractiveness equation: {s}".format(s=score))) distance_terms += str(score) # tmp_distance = temporary_filename('_'.join(distance_terms)) tmp_distance = temporary_filename(filename="_".join([raster, metric])) r.grow_distance(input=raster, distance=tmp_distance, metric=metric, quiet=True, overwrite=True) if mask: msg = "Inverted masking to exclude non-NULL cells " msg += "from distance related computations based on '{mask}'" msg = msg.format(mask=mask) grass.verbose(_(msg)) r.mask(raster=mask, flags="i", overwrite=True, quiet=True) # FIXME: use a parameters dictionary, avoid conditionals if score: distance_function = build_distance_function( constant=constant, kappa=kappa, alpha=alpha, variable=tmp_distance, score=score, ) # FIXME: use a parameters dictionary, avoid conditionals if not score: distance_function = build_distance_function(constant=constant, kappa=kappa, alpha=alpha, variable=tmp_distance) # temporary maps will be removed if output_name: tmp_distance_map = temporary_filename(filename=output_name) else: basename = "_".join([raster, "attractiveness"]) tmp_distance_map = temporary_filename(filename=basename) distance_function = EQUATION.format(result=tmp_distance_map, expression=distance_function) msg = "* Distance function: {f}".format(f=distance_function) grass.verbose(_(msg)) grass.mapcalc(distance_function, overwrite=True) r.null(map=tmp_distance_map, null=0) # Set NULLs to 0 compress_status = grass.read_command("r.compress", flags="g", map=tmp_distance_map) grass.verbose(_( "* Compress status: {s}".format(s=compress_status))) # REMOVEME return tmp_distance_map