def clip_each_feature(rst, shp, feature_id, work, out_basename): """ Clip a raster dataset for each feature in a feature class """ import arcpy import os from glass.cpu.arcg.lyr import feat_lyr from glass.cpu.arcg.lyr import rst_lyr from glass.cpu.arcg.anls.exct import select_by_attr from glass.oss.ops import create_folder # ########### # # Environment # # ########### # arcpy.env.overwriteOutput = True arcpy.env.workspace = work # ###### # # Do it! # # ###### # # Open feature class lyr_shp = feat_lyr(shp) lyr_rst = rst_lyr(rst) # Create folder for some temporary files wTmp = create_folder(os.path.join(work, 'tmp')) # Get id's field type fields = arcpy.ListFields(lyr_shp) for f in fields: if str(f.name) == str(feature_id): fld_type = f.type break expression = '{fld}=\'{_id}\'' if str(fld_type) == 'String' else \ '{fld}={_id}' del fields, f # Run the clip tool for each feature in the shp input c = arcpy.SearchCursor(lyr_shp) l = c.next() while l: fid = str(l.getValue(feature_id)) selection = select_by_attr( lyr_shp, expression.format(fld=feature_id, _id=fid), os.path.join(wTmp, 'each_{}.shp'.format(fid))) clip_rst = clip_raster(lyr_rst, selection, '{b}_{_id}.tif'.format(b=out_basename, _id=fid)) l = c.next()
def mean_rst_by_polygon(polygons, raster, work, resultShp): """ Mean of all cells intersect with the input polygon features """ import arcpy import os from glass.cpu.arcg.lyr import feat_lyr, rst_lyr from glass.prop.rst import rst_stats from glass.cpu.arcg.mng.fld import add_field from glass.mng.gen import copy_feat from glass.cpu.arcg.anls.exct import select_by_attr from glass.cpu.arcg.mng.rst.proc import clip_raster # ########### # # Environment # # ########### # arcpy.env.overwriteOutput = True arcpy.env.workspace = work # ###### # # Do it! # # ###### # # Copy the Input poly_copy = copy_feat(polygons, resultShp, gisApi='arcpy') # Create Layers lyrShp = feat_lyr(poly_copy) lyrRst = rst_lyr(raster) # Create field for register calculated statistics if len(os.path.basename(raster)) <= 10: fld_name = os.path.basename(raster) else: fld_name = os.path.basename(raster)[:10] add_field(lyrShp, fld_name, "DOUBLE", "20", "3") # Calculate mean c = arcpy.UpdateCursor(lyrShp) l = c.next() while l: fid = str(l.getValue("FID")) selection = select_by_attr(lyrShp, "FID={c}".format(c=fid), "poly_{c}.shp".format(c=fid)) sel_rst = clip_raster(lyrRst, selection, "clip_rst_{c}.img".format(c=fid)) mean = rst_stats(sel_rst, api='arcpy')["MEAN"] l.setValue(fld_name, mean) c.updateRow(l) l = c.next()
def mean_time_in_povoated_areas(network, rdv_name, stat_units, popFld, destinations, output, workspace, ONEWAY=True, GRID_REF_CELLSIZE=10): """ Receive statistical units and some destinations. Estimates the mean distance to that destinations for each statistical unit. The mean for each statistical will be calculated using a point grid: -> Statistical unit to grid point; -> Distance from grid point to destination; -> Mean of these distances. This method will only do the math for areas (statistic units) with population. """ import os import arcpy from glass.cpu.arcg.lyr import feat_lyr from glass.cpu.arcg.anls.exct import select_by_attr from glass.cpu.arcg.mng.fld import field_statistics from glass.cpu.arcg.mng.fld import add_field from glass.cpu.arcg.mng.gen import merge from glass.mng.gen import copy_feat from glass.mob.arctbx.closest import closest_facility from glass.to.shp.arcg import rst_to_pnt from glass.to.rst import shp_to_raster if arcpy.CheckExtension("Network") == "Available": arcpy.CheckOutExtension("Network") else: raise ValueError('Network analyst extension is not avaiable') arcpy.env.overwriteOutput = True WORK = workspace # Add field stat_units = copy_feat(stat_units, os.path.join(WORK, os.path.basename(stat_units)), gisApi='arcpy') add_field(stat_units, "TIME", "DOUBLE", "10", precision="3") # Split stat_units into two layers # One with population # One with no population withPop = select_by_attr(stat_units, '{}>0'.format(popFld), os.path.join(WORK, 'with_pop.shp')) noPop = select_by_attr(stat_units, '{}=0'.format(popFld), os.path.join(WORK, 'no_pop.shp')) # For each statistic unit with population withLyr = feat_lyr(withPop) cursor = arcpy.UpdateCursor(withLyr) FID = 0 for feature in cursor: # Create a new file unity = select_by_attr( withLyr, 'FID = {}'.format(str(FID)), os.path.join(WORK, 'unit_{}.shp'.format(str(FID)))) # Convert to raster rst_unity = shp_to_raster(unity, "FID", GRID_REF_CELLSIZE, None, os.path.join(WORK, 'unit_{}.tif'.format(str(FID))), api='arcpy') # Convert to point pnt_unity = rst_to_pnt( rst_unity, os.path.join(WORK, 'pnt_un_{}.shp'.format(str(FID)))) # Execute closest facilitie CLOSEST_TABLE = os.path.join(WORK, 'cls_fac_{}.dbf'.format(str(FID))) closest_facility(network, rdv_name, destinations, pnt_unity, CLOSEST_TABLE, oneway_restriction=ONEWAY) # Get Mean MEAN_TIME = field_statistics(CLOSEST_TABLE, 'Total_Minu', 'MEAN')[0] # Record Mean feature.setValue("TIME", MEAN_TIME) cursor.updateRow(feature) FID += 1 merge([withPop, noPop], output) return output
def mean_time_by_influence_area(netDt, rdv, infraestruturas, fld_infraestruturas, unidades, id_unidade, conjuntos, popf, influence_areas_unities, w, output, oneway=True): """ Tempo medio ponderado pela populacao residente a infra-estrutura mais proxima (min), por area de influencia * netDt - Path to Network Dataset * infraestruturas - Points of destiny * fld_infraestruturas - Field on destiny points to relate with influence area * unidades - BGRI; Freg; Concelhos * conjuntos - Freg; Concelhos; NUT - field * popf - Field with the population of the statistic unity * influence_areas_unities - Field on statistic unities layer to relate with influence area * w = Workspace * output = Path to store the final output * rdv - Name of feature class with the streets network * junctions - Name of feature class with the junctions """ import arcpy import os from glass.cpu.arcg.lyr import feat_lyr from glass.cpu.arcg.mng.feat import feat_to_pnt from glass.cpu.arcg.mng.gen import merge from glass.mng.gen import copy_feat from glass.mng.genze import dissolve from glass.cpu.arcg.mng.fld import add_field from glass.cpu.arcg.mng.fld import calc_fld from glass.cpu.arcg.mng.fld import field_statistics from glass.cpu.arcg.mng.fld import type_fields from glass.cpu.arcg.mng.joins import join_table from glass.cpu.arcg.anls.exct import select_by_attr from glass.cpu.arcg.netanlst.closest import closest_facility """if arcpy.CheckExtension("Network") == "Available": arcpy.CheckOutExtension("Network") else: raise ValueError('Network analyst extension is not avaiable')""" def ListGroupArea(lyr, fld_ia, fld_grp): d = {} cs = arcpy.SearchCursor(lyr) for lnh in cs: id_group = lnh.getValue(fld_grp) id_ia = lnh.getValue(fld_ia) if id_group not in d.keys(): d[id_group] = [id_ia] else: if id_ia not in d[id_group]: d[id_group].append(id_ia) return d arcpy.env.overwriteOutput = True arcpy.env.workspace = w # Procedure # copy_unities = copy_feat(unidades, os.path.join(w, os.path.basename(unidades)), gisApi='arcpy') # Generate centroids of the statistic unities - unidades lyr_unidades = feat_lyr(copy_unities) pnt_unidades = feat_to_pnt(lyr_unidades, 'pnt_unidades.shp', pnt_position="INSIDE") # List all groups of unities (conjuntos) group_areas = ListGroupArea(lyr_unidades, influence_areas_unities, conjuntos) # Create Layers lyr_pnt_unidades = feat_lyr(pnt_unidades) lyr_pnt_facilities = feat_lyr(infraestruturas) result_list = [] fld_type_unities = type_fields(lyr_pnt_unidades, field=conjuntos) SELECT_UNITIES = '{fld}=\'{c}\'' if str(fld_type_unities) == 'String' \ else '{fld}={c}' fld_type_facilities = type_fields(lyr_pnt_facilities, field=fld_infraestruturas) SELECT_FACILITIES = '{fld}=\'{obj}\'' if str(fld_type_facilities) == 'String' \ else '{fld}={obj}' for group in group_areas.keys(): # Select centroids of interest interest_centroids = select_by_attr( lyr_pnt_unidades, SELECT_UNITIES.format(c=str(group), fld=conjuntos), 'pnt_{c}.shp'.format(c=str(group))) # Select facilities of interest expression = ' OR '.join([ SELECT_FACILITIES.format(fld=fld_infraestruturas, obj=str(group_areas[group][i])) for i in range(len(group_areas[group])) ]) interest_facilities = select_by_attr( lyr_pnt_facilities, expression, 'facilities_{c}.shp'.format(c=str(group))) # Run closest facilitie - Distance between selected CENTROID and selected facilities cls_fac_table = os.path.join(w, "clsf_{c}.dbf".format(c=str(group))) closest_facility(netDt, rdv, interest_facilities, interest_centroids, cls_fac_table, oneway_restriction=oneway) add_field(cls_fac_table, 'j', "SHORT", "6") calc_fld(cls_fac_table, 'j', "[IncidentID]-1") join_table(interest_centroids, "FID", cls_fac_table, "j", "Total_Minu") # Calculate sum of time x population add_field(interest_centroids, 'sum', "DOUBLE", "10", "3") calc_fld(interest_centroids, 'sum', "[{pop}]*[Total_Minu]".format(pop=popf)) denominador = field_statistics(interest_centroids, 'sum', 'SUM') add_field(interest_centroids, 'tm', "DOUBLE", "10", "3") calc_fld( interest_centroids, 'tm', "([sum]/{sumatorio})*[Total_Minu]".format( sumatorio=str(denominador))) result_list.append(interest_centroids) merge_shp = merge(result_list, "merge_centroids.shp") join_table(lyr_unidades, id_unidade, "merge_centroids.shp", id_unidade, "tm") return dissolve(lyr_unidades, output, conjuntos, statistics="tm SUM", api='arcpy')
def clip_several_each_feature(rst_folder, shp, feature_id, work, template=None, rst_file_format='.tif'): """ Clip a folder of rasters by each feature in a feature class The rasters clipped for a feature will be in an individual folder """ import arcpy import os from glass.cpu.arcg.lyr import feat_lyr from glass.cpu.arcg.lyr import rst_lyr from glass.cpu.arcg.anls.exct import select_by_attr from glass.cpu.arcg.mng.fld import type_fields from glass.oss.ops import create_folder from glass.pys.oss import lst_ff # ########### # # Environment # # ########### # arcpy.env.overwriteOutput = True arcpy.env.workspace = work # ###### # # Do it! # # ###### # # Open feature class lyr_shp = feat_lyr(shp) # Create folder for some temporary files wTmp = create_folder(os.path.join(work, 'tmp')) # Split feature class in parts c = arcpy.SearchCursor(lyr_shp) l = c.next() features = {} # Get id's field type fld_type = type_fields(lyr_shp, field=feature_id) expression = '{fld}=\'{_id}\'' if str(fld_type) == 'String' else \ '{fld}={_id}' del fields, f while l: fid = str(l.getValue(feature_id)) selection = select_by_attr( lyr_shp, expression.format(fld=feature_id, _id=fid), os.path.join(wTmp, 'each_{}.shp'.format(fid))) f_lyr = feat_lyr(selection) features[fid] = f_lyr l = c.next() rasters = lst_ff(rst_folder, file_format='.tif') for raster in rasters: r_lyr = rst_lyr(raster) for feat in features: clip_rst = clip_raster( r_lyr, features[feat], os.path.join(work, os.path.splitext(os.path.basename(feat))[0], os.path.basename(raster)), template)