예제 #1
0
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")
예제 #2
0
 
 # 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')
예제 #4
0
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