1 votos

Python ArcGIS 10.0 Expandir seleccionar capa por ubicación desde punto (selección a pie)

Tengo una vieja herramienta ArcView 3 que me han encargado convertir a Python. Lo estoy dividiendo en etapas, pero hay una "selección andante" que no puedo atrapar.

Para contextualizar la consulta, el usuario selecciona un lugar (datos puntuales): selección A. A continuación, se seleccionan todos los lugares situados en un radio de X kilómetros de la selección A (selección B), luego se seleccionan todos los lugares situados en un radio de X de kilómetros de la selección B, y así sucesivamente hasta que no se realizan nuevas selecciones.

He intentado utilizar un bucle While... con un Get Count en vano. El problema creo que es porque el Get Count siempre tendrá un valor, así que creo que tengo que hacer algo como Get Count <> Previous Get Count?

#Import ArcPy site package
import arcpy

# Overwrite files
arcpy.env.overwriteOutput = True

 try:
     # Make a feature layer with all the farms
     arcpy.MakeFeatureLayer_management(r"shapefile.shp", "Farms")

    # Make a feature layer containing only the farm of interest
     arcpy.MakeFeatureLayer_management(r"shapefile_select.shp","Farms_select")

    # Apply a selection to farms layer
    fcFarms = arcpy.SelectLayerByLocation_management ("Farms","WITHIN_A_DISTANCE","Farms_select", "2000 Meters")

    # Apply a further selection to farms layer
    fcFarms2 = arcpy.SelectLayerByLocation_management("Farms","WITHIN_A_DISTANCE",fcFarms, "2000 Meters", "ADD_TO_SELECTION")

    while getCount > 0:
        fcFarms3 = arcpy.SelectLayerByLocation_management("Farms","WITHIN_A_DISTANCE", fcFarms2, "2000 Meters", "ADD_TO_SELECTION")
        fcFarms4 = arcpy.SelectLayerByLocation_management("Farms","WITHIN_A_DISTANCE", fcFarms3, "2000 Meters", "NEW_SELECTION")
        getCount = int(arcpy.GetCount_management(fcFarms4))

except:
    print arcpy.GetMessages()

0voto

dchanson Puntos 29

Intenta algo como esto:

antes del bucle while:

initial_getCount = int(arcpy.GetCount_management(fcFarms2).getOutput(0))
getCount = initial_getCount + 1

entonces para ti bucle

while getCount > initial_getCount:
    if arcpy.Exists(fcFarms3):
        arcpy.Delete_management(fcFarms3)
    fcFarms3 = arcpy.SelectLayerByLocation_management("Farms", "WITHIN_A_DISTANCE", fcFarms2, "2000 Meters", "ADD_TO_SELECTION")
    initial_getCount = getCount
    getCount = int(arcpy.GetCount_management(fcFarms2).getOutput(0))

0voto

Chris Becke Puntos 19910

Según he entendido tu pregunta, he modificado tu script. Esto servirá a su requisito.

#Import ArcPy site package
import arcpy

# Overwrite files
arcpy.env.overwriteOutput = True

def select_by_location(in_fc, target_fc, distance, selection_count=0):
    """ takes farms layer, selected layer, distance for selection"""
    selected_farms = arcpy.SelectLayerByLocation_management (in_fc, "WITHIN_A_DISTANCE", target_fc, distance, "ADD_TO_SELECTION")
    # check the previous and current value should not same
    # if they are same that means no furthur selections has been made
    if arcpy.GetCount_management(selected_farms).getOutput(0) != selection_count:
        selection_count = arcpy.GetCount_management(selected_farms).getOutput(0)
        return select_by_location(in_fc, selected_farms, distance, selection_count)
    return selected_farms

def main():
    try:
        # Make a feature layer with all the farms
        farms = arcpy.MakeFeatureLayer_management(r"path_of_farms.shp", "farms")

        # Make a feature layer containing only the farm of interest
        farms_select = arcpy.MakeFeatureLayer_management(r"path_of_farm_interest.shp","farms_select")

        # Make selection on the farms_select layer
        farms_select = arcpy.SelectLayerByAttribute_management(farms_select, "NEW_SELECTION", "Id = 0")

        # all_selected_farms contain all the selected farms within the given distance
        all_selected_farms = select_by_location(farms, farms_select, "80 Kilometer")

        # Save the all_selected_farms feature class to workspace
        arcpy.FeatureClassToFeatureClass_conversion(all_selected_farms , r"path_to_workspace if workspace is not defined earlier", "name of feature class")
    except:
        print arcpy.GetMessages()

if __name__ == "__main__":
    main()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X