Criando classe de recurso de polígono a partir das coordenadas X, Y usando o ArcPy?


8

Estou tentando escrever um script que cria uma nova classe de recurso de polígono que contém um único polígono (quadrado) com as seguintes coordenadas: (0, 0), (0, 1.000), (1.000, 0) e (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

coordatesEx8.txt se parece com isso abaixo

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

Desligando nesta linha:

for line in fileinput.FileInput(infile):

Mensagem de erro:

ValueError: too many values to unpack

alguma sugestão? Estou perplexo, pensei que fosse a configuração do meu arquivo .txt, mas continuo preso a esse erro, não importa o quê. Não sei como proceder, esta é a pergunta antes da minha pergunta de lição de casa real, que será muito mais difícil ... também originalmente o loop for era:

for line in fileinput.input(infile):

que deu um erro diferente ...

Respostas:


11

Para:

Escreva um script que crie uma nova classe de recurso de polígono contendo um único polígono (quadrado) com as seguintes coordenadas: (0, 0), (0, 1.000), (1.000, 0) e (1.000, 1.000).

Eu adotaria a seguinte abordagem, que é uma pequena adaptação do exemplo de documentação do Insert 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

2

Na sua pergunta, é difícil dizer onde o exercício que você está tentando concluir termina e a sua tentativa de código começa, mas desconfio que o código abaixo apresentará o mesmo erro:

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()

Nesse caso, você pode concluir que está enfrentando um problema de Python (IT), em vez de ArcPy (GIS), que deve ser pesquisado / solicitado no Stack Overflow e não aqui.


Sempre misturo os dois sites e o que deve ser postado onde, terei certeza de considerar isso no futuro antes de postar. Editando o código acima, um pedaço foi deixado e precisava ser excluído.
Staley

1
@ Staley Como regra geral, se ocorrer um erro ao mencionar o ArcPy, provavelmente pertencerá aqui; caso contrário, é provável que possa haver um erro de Python. Reconhecer onde o ArcPy termina e o Python começa é difícil inicialmente, mas acho que é uma habilidade importante a ser adquirida, pois permite que você se concentre na origem dos erros e, portanto, onde eles devem ser pesquisados ​​muito mais rapidamente.
PolyGeo

1
Eu não tinha pensado assim, muito inteligente, eu definitivamente vou usar e aplicar isso daqui para frente.
Staley

0

Este script funcionou para mim:

(inspirado nas respostas anteriores e nos exemplos aqui: https://pro.arcgis.com/en/pro-app/arcpy/get-started/writing-geometries.htm )

  1. Obter a extensão da varredura
  2. Salvar valores de extensão como pontos (coordenadas em [x,y])
  3. Crie uma nova classe de recurso para armazenar nova geometria
  4. Inserir cursorcomo geometria na nova classe de recurso

Roteiro:

# 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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.