¿Cómo dividir puntos por polígono usando ArcGIS Desktop?

8

Estoy buscando una manera de dividir puntos por una clase de entidad de polígono del condado. La imagen adjunta muestra dos clases de entidad: una compuesta por puntos y la otra una clase de entidad poligonal del condado. La herramienta de división sería ideal si permitiera puntos. Preferiría una salida limpia sin campos adicionales agregados a los atributos de punto. Además, me gustaría tener el nombre del condado de la clase de entidad poligonal que define las nuevas clases de entidad de puntos (por ejemplo, Kiowa, Clark, Comanche). Agradezco cualquier solución y consejo.

Para este ejemplo, el producto final debe ser una clase de entidad de tres puntos llamada "Kiowa", "Clark" y "Comanche" producida a partir de una clase de entidad de punto más grande. Una solución automatizada sería ideal, ya que tengo muchos, muchos puntos FC combinados en docenas de condados para trabajar (aproximadamente en el estado de KS).

ingrese la descripción de la imagen aquí

Aaron
fuente
3
Los usuarios del software ESRI conocen esta operación como una unión espacial . Consulte también gis.stackexchange.com/questions/11047 y gis.stackexchange.com/questions/23398 .
whuber
@whuber Imagino al menos 5 pasos con el enfoque de unión espacial: 1) unión espacial 2) seleccionar puntos basados ​​en el condado 3) crear nuevos FC basados ​​en la selección, 4) Cambiar el nombre de los FC basados ​​en el Condado 5) Eliminar nuevos campos (por ejemplo, "Join_count "). Necesito encontrar una manera de automatizar el proceso (uno de sus enlaces es prometedor). También esperaba pasar por alto un enfoque más simple similar a lo que logrará "dividir" para las clases de entidad poligonal. Me temo que tendré que seguir la ruta del cursor.
Aaron
Puis-je avoir le lien en langue française?
Aaron, tu comentario no coincide con tu pregunta. La pregunta no parece indicar que desea un FC de salida para cada condado. Los otros pasos son innecesarios: de una vez por todas, cree una copia del FC del condado cuyo único atributo sea el nombre del condado. La unión espacial a sus puntos termina el trabajo. Si primero ha fusionado todos los conjuntos de datos de puntos (que es un diseño de base de datos inteligente en general), todo su proyecto puede completarse en solo dos pasos: (1) unión espacial (2) dividir la salida por nombre de condado: consulte la respuesta de blah238.
whuber
@KhalilouWAGUE le lien de la jointure espacial en fr help.arcgis.com/fr/arcgisdesktop/10.0/help/index.html#//…
geogeek

Respuestas:

4

Después de usar Spatial Join o Intersect para obtener el atributo de nombre del condado en cada punto, intente usar la herramienta Split Layer by Attributes de Dan Patterson disponible en la Galería de herramientas de script y modelo de geoprocesamiento .

Alternativamente, podría usar ModelBuilder para automatizar esto usando un enfoque diferente que involucra Seleccionar capa por ubicación (haga clic en la miniatura para ver la imagen completa).

ingrese la descripción de la imagen aquí

Extraído de este hilo en los foros de ESRI: selección de lotes por ubicación y exportación de archivos de forma

blah238
fuente
3

Mucho más fácil de usar el comando de intersección.
Desactiva los campos no deseados.
1. Intersecar a una nueva salida.
2. Unir la salida con el oid original.
3. Calcule un nuevo campo con el nombre de cnty.

Consulte ettools para ver algunas versiones mejoradas de unión espacial y división por ubicación.

Brad Nesom
fuente
2

Por lo que leí, simplemente ejecutaría una superposición (Herramientas de análisis de ArcToolbox - Superposición - e Identidad, Intersección o Unión espacial) de sus puntos con un conjunto de datos de polígonos del condado. En ArcMap, podría limitar los campos que se muestran en la capa del condado al campo con el nombre del condado, y solo ese campo se agregaría al resultado. Si incluso ese campo agregado es demasiado, calcule sus valores en el campo correspondiente en la tabla de puntos y luego elimine el campo agregado.

johns
fuente
2

Usando Python puede hacer un bucle de "Seleccionar capa por ubicación" para tomar los puntos que se superponen a cada país y luego guardarlo como un Shapefile. Sería algo como esto:

import arcgisscripting
# starts geoprocessing
gp = arcgisscripting.create()
gp.OverWriteOutput = 1

# Variable iniciation
points = u"Path for your point shape"
counties = u"Path for counties shape"
outDir = u"path for output directory"

#Load points as a layer
gp.MakeFeatureLayer(points, "points")

# Go county by county
rows = gp.searchcursor(counties)
row = rows.next()

# loop County by county overlap
while row.countyName: #adapt to your countie table of attributes
    # Make a layer from the feature class
    gp.MakeFeatureLayer(counties, "counties lyr", "[countieName]='" + row.countieName + "'")
    # Select all points that intersect the current countie polygon
    gp.SelectLayerByLocation(points, "intersect", "counties_lyr", 0, "new_selection")
    outSHP = outDir + row.counties + u".shp"
    gp.CopyFeatures_management(points, outSHP)
    print(outSHP)
    row = rows.next()
 # End of loop

 del rows, row, gp

 #END

No lo he probado, probablemente tengas que adaptarlo a tu caso.

Editar: Se modificó Select_analysis por CopyFeatures_management siguiendo el consejo de @ blah238.

Alexandre Neto
fuente
1
Probablemente cambiaría Select_analysis a CopyFeatures_management o similar; ya está haciendo la selección, por lo que es redundante.
blah238
Tienes razón, aunque el resultado es el mismo, lo he editado para que quede más claro.
Alexandre Neto
Gracias por este guion. ¿Hay alguna manera de hacer esto fuera de la memoria local? El problema que encuentro con mis conjuntos de datos es que a 7,5 millones de puntos no les gusta agregarlos como una capa.
Aaron
Agregará como capa solo una parte de los puntos (de cada condado). Al ejecutar el script fuera de ArcMap, ni siquiera necesitará mostrarlos, por lo que podría funcionar de cualquier manera. Pero puedes probar otra cosa. Comience haciendo un espacio (o intersección) entre los puntos y los polígonos, esto creará un archivo temporal con la información del punto + el nombre del condado. Luego, recorre los condados y usa Select_analysis (SpatialJoint_temp, outSHP, "[countieName] = '" + row.countieName + "'"). Creo que eso también funcionará, pero no sé si es más o menos eficiente que la primera solución.
Alexandre Neto
0

Ahora hay un video tutorial de eLearning (no gratuito, pero relativamente barato) llamado Uso de cursores ArcPy para dividir por atributo y ubicación que incluye mostrar cómo:

Escriba un script de Python para dividir una clase de entidad usando una clase de entidad poligonal en una clase de entidad por entidades encontradas dentro de cada una de sus ubicaciones de polígono

Creo que aborda los requisitos de esta pregunta.

Descargo de responsabilidad : soy el autor y presentador de este video tutorial de eLearning

PolyGeo
fuente