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 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 clip_raster_by_polygons(R, P): """Separate raster grid points by polygons Args: * R: Raster layer * P: Polygon layer Returns: * L: List of point vectors and their associated grid values. One item for each polygon """ res = clip_grid_by_polygons(R.get_data(), R.get_geotransform(), P.get_geometry(as_geometry_objects=True)) # Return return res
def clip_raster_by_polygons(R, P): """Separate raster grid points by polygons Args: * R: Raster layer * P: Polygon layer Returns: * L: List of point vectors and their associated grid values. One item for each polygon """ res = clip_grid_by_polygons(R.get_data(), R.get_geotransform(), P.get_geometry()) # Return return res