¿Crear clase de entidad poligonal a partir de coordenadas X, Y usando ArcPy?

8

Estoy tratando de escribir un script que cree una nueva clase de entidad poligonal que contenga un único polígono (cuadrado) con las siguientes coordenadas: (0, 0), (0, 1,000), (1,000, 0) y (1,000, 1,000) .


import arcpy
import fileinput
import string
import os

from arcpy import env    
env.workspace = "D:/UW/Winter_2016/501/w5_more_arcpy8_9_10/ex8" 
env.overwriteOutput = True

infile = "D:/UW/Winter_2016/501/w5_more_arcpy8_9_10/ex8/coordinatesEx8.txt"

for line in fileinput.FileInput(infile):
    ID, X, Y = string.split(line, " ")
    array.add(arcpy.Point(X, Y))
cursor.insertRow([arcpy.Polygon(array)])
fileinput.close()

outpath = "D:/UW/Winter_2016/501/w5_more_arcpy8_9_10/ex8"
newfc = "newFeatureClassEx8.shp"
arcpy.CreateFeatureclass_management(outpath, newfc, "Polygon")

cursor = arcpy.da.InsertCursor(newfc, ["SHAPE@"])
array = arcpy.Array()

del cursor

coordenadasEx8.txt se ve así a continuación

1 0 1000 
2 1000 0 
3 1000 1000 
4 0 0

Colgando en esta línea:

for line in fileinput.FileInput(infile):

Mensaje de error:

ValueError: too many values to unpack

¿alguna sugerencia? Estoy perdido, pensé que era la configuración de mi archivo .txt, pero sigo colgando de ese error sin importar qué. No estoy seguro de cómo proceder, esta es la pregunta antes de mi pregunta de tarea real que será mucho más difícil ... también originalmente el ciclo for era:

for line in fileinput.input(infile):

que dio un error diferente ...

Staley
fuente

Respuestas:

11

A:

Escriba un script que cree una nueva clase de entidad de polígono que contenga un único polígono (cuadrado) con las siguientes coordenadas: (0, 0), (0, 1,000), (1,000, 0) y (1,000, 1,000).

Adoptaría el siguiente enfoque, que es una ligera adaptación del ejemplo de documentación Insertar cursor .

import arcpy

# Create a polygon geometry
array = arcpy.Array([arcpy.Point(0, 0),
                     arcpy.Point(0, 1000),
                     arcpy.Point(1000, 1000),
                     arcpy.Point(1000, 0)
                     ])
polygon = arcpy.Polygon(array)

# Open an InsertCursor and insert the new geometry
cursor = arcpy.da.InsertCursor(r'C:\path\to\your\geodatabase.gdb\polygon', ['SHAPE@'])
cursor.insertRow([polygon])

# Delete cursor object
del cursor
Aaron
fuente
2

En su pregunta, es difícil saber dónde termina el ejercicio que está tratando de completar y comienza su intento de código, pero sospecho que el siguiente código le dará el mismo error:

import fileinput
import string
import os

infile = "D:/UW/Winter_2016/501/w5_more_arcpy8_9_10/ex8/coordinatesEx8.txt"

for line in fileinput.FileInput(infile):
    ID, X, Y = string.split(line, " ")
fileinput.close()

Si es así, puede concluir que se encuentra con un problema de Python (IT), en lugar de ArcPy (GIS), que debería investigarse / preguntarse en Stack Overflow en lugar de aquí.

PolyGeo
fuente
Siempre tengo los dos sitios mezclados y lo que debería publicarse donde, me aseguraré de considerar eso en el futuro antes de publicar. Editando el código anterior, se dejó una pieza que necesitaba ser eliminada.
Staley
1
@Staley Como regla general, si arroja un error mencionando ArcPy, entonces probablemente pertenezca aquí, de lo contrario, es probable que sea un error de Python. Inicialmente, es difícil reconocer dónde termina ArcPy y dónde comienza Python, pero creo que es una habilidad importante para adquirir, ya que le permite concentrarse en dónde provienen los errores y, por lo tanto, dónde deben investigarse, mucho más rápido.
PolyGeo
1
No lo había pensado así, bastante inteligente, definitivamente usaré y aplicaré eso en el futuro.
Staley
0

Este script funcionó para mí:

(inspirado en respuestas anteriores y en ejemplos aquí: https://pro.arcgis.com/en/pro-app/arcpy/get-started/writing-geometries.htm )

  1. Obtener la extensión de la trama
  2. Guardar valores de extensión como puntos (coordenadas en [x,y])
  3. Crear nueva clase de entidad para almacenar nueva geometría
  4. Insertar cursorcomo geometría en una nueva clase de entidad

Guión:

# Create polygon from raster extent

import arcpy, os
from arcpy.sa import *   # import Spatial analysis extension

arcpy.CheckOutExtension("spatial")

# Define path to your data
inWD = "C:/Users/myData/rasterExtentToPoly"

# set working environment
arcpy.env.workspace = os.path.join(inWD)
arcpy.env.overwriteOutput = True

# Read input raster
raster = "eu_dem_v11_E40N20.TIF"

# Get raster extent
myRaster = Raster(raster)   # need to read raster as Raster object
myExtent = myRaster.extent

# Store extent coordinates 
xmax = myExtent.XMax
xmin = myExtent.XMin
ymax = myExtent.YMax
ymin = myExtent.YMin

# Store extent values as list of coordinates 
coordinates = [(xmin, ymin),
               (xmin, ymax),
               (xmax, ymax),
               (xmax, ymin)]

# Get coordinate system
sr = arcpy.Describe(raster).spatialReference


# Create new feature class and than insert the polygon geometry 
result = arcpy.management.CreateFeatureclass(inWD,
                                             "rasterExtent",
                                              "POLYGON",
                                              "",
                                              "",
                                              "",
                                              sr) # define projection

# Create feature class
outPolyExtent= result[0]

# Use Insert cursor to add new geometry to feature class Write feature to new feature class
with arcpy.da.InsertCursor(outPolyExtent, ['SHAPE@']) as cursor:
    cursor.insertRow([coordinates])

# Return the Spatial Analysis extension 
arcpy.CheckInExtension("Spatial")
maycca
fuente