def tag_polygons_by_grid(polygons, grid, threshold=0, tag='affected'): """Tag polygons by raster values Args: * polygons: Polygon layer * grid: Raster layer * threshold: Threshold for grid value to tag polygon * tag: Name of new tag Returns: Polygon layer: Same as input polygon but with extra attribute tag set according to grid values """ verify(polygons.is_polygon_data) verify(grid.is_raster) polygon_attributes = polygons.get_data() polygon_geometry = polygons.get_geometry(as_geometry_objects=True) # Separate grid points by polygon res, _ = clip_grid_by_polygons( grid.get_data(), grid.get_geotransform(), polygon_geometry) # Create new polygon layer with tag set according to grid values # and threshold new_attributes = [] for i, (_, values) in enumerate(res): # For each polygon check if any grid value in it exceeds the threshold affected = False for val in values: # Check each grid value in this polygon if val > threshold: affected = True # Existing attributes for this polygon attr = polygon_attributes[i].copy() # Create tagged polygon feature if affected: attr[tag] = True else: attr[tag] = False new_attributes.append(attr) R = Vector(data=new_attributes, projection=polygons.get_projection(), geometry=polygon_geometry, name='%s_tagged_by_%s' % (polygons.name, grid.name)) return R
def interpolate_polygon_raster(source, target, layer_name=None, attribute_name=None): """Interpolate from polygon layer to raster data Args * source: Polygon data set * target: Raster data set * layer_name: Optional name of returned interpolated layer. If None the name of source is used for the returned layer. * attribute_name: Name for new attribute. If None (default) the name of layer target is used Output I: Vector data set; points located as target with values interpolated from source Note: Each point in the resulting dataset will have an attribute 'polygon_id' which refers to the polygon it belongs to. """ # Input checks verify(target.is_raster) verify(source.is_vector) verify(source.is_polygon_data) # Run underlying clipping algorithm polygon_geometry = source.get_geometry(as_geometry_objects=True) polygon_attributes = source.get_data() res = clip_grid_by_polygons(target.get_data(scaling=False), target.get_geotransform(), polygon_geometry) # Create one new point layer with interpolated attributes new_geometry = [] new_attributes = [] for i, (geometry, values) in enumerate(res): # For each polygon assign attributes to points that fall inside it for j, geom in enumerate(geometry): attr = polygon_attributes[i].copy() # Attributes for this polygon attr[attribute_name] = values[j] # Attribute value from grid cell attr['polygon_id'] = i # Store id for associated polygon new_attributes.append(attr) new_geometry.append(geom) R = Vector(data=new_attributes, projection=source.get_projection(), geometry=new_geometry, name=layer_name) return R
def tag_polygons_by_grid(polygons, grid, threshold=0, tag='affected'): """Tag polygons by raster values Args: * polygons: Polygon layer * grid: Raster layer * threshold: Threshold for grid value to tag polygon * tag: Name of new tag Returns: Polygon layer: Same as input polygon but with extra attribute tag set according to grid values """ verify(polygons.is_polygon_data) verify(grid.is_raster) polygon_attributes = polygons.get_data() polygon_geometry = polygons.get_geometry(as_geometry_objects=True) # Separate grid points by polygon res, _ = clip_grid_by_polygons(grid.get_data(), grid.get_geotransform(), polygon_geometry) # Create new polygon layer with tag set according to grid values # and threshold new_attributes = [] for i, (_, values) in enumerate(res): # For each polygon check if any grid value in it exceeds the threshold affected = False for val in values: # Check each grid value in this polygon if val > threshold: affected = True # Existing attributes for this polygon attr = polygon_attributes[i].copy() # Create tagged polygon feature if affected: attr[tag] = True else: attr[tag] = False new_attributes.append(attr) R = Vector(data=new_attributes, projection=polygons.get_projection(), geometry=polygon_geometry, name='%s_tagged_by_%s' % (polygons.name, grid.name)) return R
def interpolate_polygon_raster(source, target, layer_name=None, attribute_name=None): """Interpolate from polygon layer to raster data. .. note: Each point in the resulting dataset will have an attribute 'polygon_id' which refers to the polygon it belongs to and 'grid_point' which refers to the grid point of the target. :param source: Polygon data set. :type source: Vector :param target: Raster data set. :type target: Raster :param layer_name: Optional name of returned interpolated layer. If None the name of source is used for the returned layer. :type layer_name: basestring :param attribute_name: Name for new attribute. If None (default) the name of layer target is used :type attribute_name: basestring :returns: Tuple of Vector (points located as target with values interpolated from source) and Raster (raster data that are coincide with the source) :rtype: Vector """ # Input checks verify(source.is_polygon_data) verify(target.is_raster) # Run underlying clipping algorithm polygon_geometry = source.get_geometry(as_geometry_objects=True) polygon_attributes = source.get_data() covered_source, covered_target = clip_grid_by_polygons( target.get_data(scaling=False), target.get_geotransform(), polygon_geometry) # Create one new point layer with interpolated attributes new_geometry = [] new_attributes = [] for i, (geometry, values) in enumerate(covered_source): # For each polygon assign attributes to points that fall inside it for j, geom in enumerate(geometry): attr = polygon_attributes[i].copy() # Attributes for this polygon attr[attribute_name] = values[j] # Attribute value from grid cell attr['polygon_id'] = i # Store id for associated polygon attr['grid_point'] = geom # Store grid point for associated grid new_attributes.append(attr) new_geometry.append(geom) interpolated_layer = Vector(data=new_attributes, projection=source.get_projection(), geometry=new_geometry, name=layer_name) covered_target = Raster(data=covered_target, projection=target.get_projection(), geotransform=target.get_geotransform(), name=layer_name) return interpolated_layer, covered_target
def interpolate_polygon_raster( source, target, layer_name=None, attribute_name=None): """Interpolate from polygon layer to raster data. .. note: Each point in the resulting dataset will have an attribute 'polygon_id' which refers to the polygon it belongs to and 'grid_point' which refers to the grid point of the target. :param source: Polygon data set. :type source: Vector :param target: Raster data set. :type target: Raster :param layer_name: Optional name of returned interpolated layer. If None the name of source is used for the returned layer. :type layer_name: basestring :param attribute_name: Name for new attribute. If None (default) the name of layer target is used :type attribute_name: basestring :returns: Tuple of Vector (points located as target with values interpolated from source) and Raster (raster data that are coincide with the source) :rtype: Vector """ # Input checks verify(source.is_polygon_data) verify(target.is_raster) # Run underlying clipping algorithm polygon_geometry = source.get_geometry(as_geometry_objects=True) polygon_attributes = source.get_data() covered_source, covered_target = clip_grid_by_polygons( target.get_data(scaling=False), target.get_geotransform(), polygon_geometry ) # Create one new point layer with interpolated attributes new_geometry = [] new_attributes = [] for i, (geometry, values) in enumerate(covered_source): # For each polygon assign attributes to points that fall inside it for j, geom in enumerate(geometry): attr = polygon_attributes[i].copy() # Attributes for this polygon attr[attribute_name] = values[j] # Attribute value from grid cell attr['polygon_id'] = i # Store id for associated polygon attr['grid_point'] = geom # Store grid point for associated grid new_attributes.append(attr) new_geometry.append(geom) interpolated_layer = Vector( data=new_attributes, projection=source.get_projection(), geometry=new_geometry, name=layer_name) covered_target = Raster( data=covered_target, projection=target.get_projection(), geotransform=target.get_geotransform(), name=layer_name) return interpolated_layer, covered_target