8 votos

¿Realizar la función a punto (sin licencia avanzada) utilizando ArcPy?

Tengo un conjunto de polígonos de los que he calculado los centroides, pero tengo problemas para encontrar la forma de enviar estos valores a un archivo shapefile de puntos. He probado con arcpy.MakeXYEvents_management pero sólo crea un archivo de capa temporal.

7 votos

Puedes exportar esa tabla de eventos XY a una nueva clase de característica.

0 votos

¡Wow! Un montón de soluciones. Me apunto. Este gis.stackexchange.com/questions/147790/ creará el centro del círculo inscrito más grande del polígono y transferirá todos los campos visibles a la clase de característica de punto de salida. Aunque es un poco lento...

0 votos

Tendré que recordarlo @FelixIP, ese código es bastante agradable y puedo ver situaciones en las que sería útil.

11voto

Flinkman Puntos 4821

Aquí hay una solución de arco:

import os, sys, arcpy

InFC = sys.argv[1]
OutFC = sys.argv[2]

#split the output into directory and name
Folder = os.path.dirname(OutFC)
Name   = os.path.basename(OutFC)

# Get the existins spatial reference as it's going to match
desc = arcpy.Describe(InFC)
SR   = desc.spatialReference

# create or append
if not arcpy.Exists(OutFC):
    arcpy.CreateFeatureclass_management(Folder,Name,"POINT",spatial_reference = SR)

# open up the 'writer'
with arcpy.da.InsertCursor(OutFC,"SHAPE@XY") as iCur:
    # open up the 'reader'
    with arcpy.da.SearchCursor(InFC,"SHAPE@") as sCur:
        # loop through each polygon in the InFC
        for sRow in sCur:
            cent = sRow[0].centroid          # get the centroid
            iCur.insertRow([(cent.X,cent.Y)])# write it to the new feature class

Esto crea una nueva clase de característica, abre un cursor de inserción, hace un bucle a través de cada geometría en el InFC y escribe la propiedad del centroide a la salida tenga en cuenta que las geometrías de varias partes no tendrán un centroide por parte, sino más bien un único centroide para toda la geometría no es mucho más difícil hacer un bucle a través de las partes - vamos a mantener este ejemplo bastante simple para mostrar lo básico.

0 votos

+1 por adelantarme con un bonito y conciso ejemplo.

8voto

steveax Puntos 316

Esto debería servir:

import arcpy
import os

def polysToPoints(in_polys, out_points):
    """converts polygons to centroids

    in_polys -- input polygons
    out_points -- output points
    """
    ws, name = os.path.split(out_points)
    sr = arcpy.Describe(in_polys).spatialReference
    arcpy.management.CreateFeatureclass(ws, name, 'POINT', template=in_polys, spatial_reference=sr)

    # populate records
    fields = ['SHAPE@'] + [f.name for f in arcpy.ListFields(out_points) if f.type not in ('OID', 'Geometry')]
    with arcpy.da.InsertCursor(out_points, fields) as irows:
        with arcpy.da.SearchCursor(in_polys, fields) as rows:
            for r in rows:
                irows.insertRow((arcpy.PointGeometry(r[0].centroid),) + r[1:])
    return out_points

if __name__ == '__main__':

    polys = r'C:\path_to_your\polys.shp'
    points = r'C:\path_to_your\points.shp'
    polysToPoints(polys, points)

0 votos

Haha wow, @Michael Miles-Stimson publicó algo muy similar justo antes que yo... La única cosa que el mío hace diferente es que añade todos los valores de campo con cada registro.

1 votos

Me gusta eso, es bueno tener todos los campos copiados... +1 de mi parte. ¿Qué tal los polígonos/polilíneas de varias partes? No son comunes, excepto para los agujeros, pero aparecen con la suficiente frecuencia como para causar problemas.

0 votos

Sí, mi ejemplo no tiene en cuenta eso. Sería bastante fácil, sin embargo, para iterar a través de cada parte (que devuelve una matriz) construir un objeto de polígono de esa matriz y generar un centroide de eso y añadir a una geometría para una clase de característica multipunto.

4voto

Steven Parkes Puntos 625

shapelib es ideal para esta tarea.
No hay depedencias, sólo un simple módulo para crear shapefiles:

import shapefile

coord_list = ((20,40), (0,0), )

w = shapefile.Writer(shapefile.POINT)
w.field('ID_FIELD','C','40')
for id,(x,y) in enumerate(coord_list):
    w.record(ID_FIELD=id)
    w.point(x,y)
w.save("file\to\save")

es muy sencillo, quizás quieras añadir el archivo de proyección después (manualmente).

Consulte el manual para obtener información adicional

0 votos

Wow muchas respuestas, voy a dar todas estas grandes sugerencias un tiro mañana y actualización en cuanto a lo que funcionó de manera óptima para este proyecto. ¡Gracias a todos!

1voto

sahin Puntos 166

Todavía soy un poco principiante en arcpy así que quizás esto no sea tan sofisticado, pero he creado una herramienta script para esto y me funciona. En tu caja de herramientas, añade una nueva herramienta script. Haga el python script debajo de la fuente. Establezca el primer parámetro de la herramienta como entrada de la capa de características y el segundo parámetro como salida de la capa de características (asegúrese de establecer un parámetro de salida). Tenga en cuenta que esta herramienta devolverá puntos dentro de la capa de entrada en lugar del verdadero centroide.

import arcpy
import os

inputFC = arcpy.GetParameterAsText(0)
outputPath = arcpy.GetParameterAsText(1)
scratchPath = arcpy.env.scratchGDB
inputFCSpatialReference = arcpy.Describe(inputFC).spatialReference

##copy to new fc in scratchGBD and make new layer
FCCopy = arcpy.CopyFeatures_management(inputFC,os.path.join(scratchPath,"FCCopy"))
FCLyr = arcpy.MakeFeatureLayer_management(FCCopy,"FCLyr")
arcpy.AddMessage("FC LAYER CREATED")

##add and calculate X and Y fields
arcpy.AddField_management(FCLyr,"Xcoor","DOUBLE")
arcpy.CalculateField_management(FCLyr,"Xcoor","!SHAPE!.centroid.X","PYTHON")
arcpy.AddField_management(FCLyr,"Ycoor","DOUBLE")
arcpy.CalculateField_management(FCLyr,"Ycoor","!SHAPE!.centroid.Y","PYTHON")
arcpy.AddMessage("X,Y FIELDS CREATED")

##create point layer from X Y fields
FCTable = arcpy.MakeTableView_management(FCLyr,"FCTable")
pointsLyr = arcpy.MakeXYEventLayer_management(FCTable,"Xcoor","Ycoor","pointsLyr",inputFCSpatialReference)
arcpy.AddMessage("TABLE LAYER CREATED")

##export points to feature class
arcpy.CopyFeatures_management(pointsLyr,outputPath)
arcpy.AddMessage("POINT LAYER CREATED")

##delete data from scratchGBD
arcpy.Delete_management(FCCopy)

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