Créer une classe d'entités surfaciques à partir des coordonnées X, Y à l'aide d'ArcPy?

8

J'essaie d'écrire un script qui crée une nouvelle classe d'entités surfaciques contenant un seul polygone (carré) avec les coordonnées suivantes: (0, 0), (0, 1 000), (1 000, 0) et (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

coordonnéesEx8.txt ressemble à ceci ci-dessous

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

Raccrocher sur cette ligne:

for line in fileinput.FileInput(infile):

Message d'erreur:

ValueError: too many values to unpack

Aucune suggestion? Je suis à perte, je pensais que c'était la configuration de mon fichier .txt mais continue de m'attendre à cette erreur quoi qu'il arrive. Je ne sais pas comment procéder, c'est la question avant ma vraie question de devoirs qui sera beaucoup plus difficile ... aussi à l'origine la boucle for était:

for line in fileinput.input(infile):

ce qui a donné une erreur différente ...

Staley
la source

Réponses:

11

À:

Écrivez un script qui crée une nouvelle classe d'entités surfaciques contenant un seul polygone (carré) avec les coordonnées suivantes: (0, 0), (0, 1 000), (1 000, 0) et (1 000, 1 000).

Je prendrais l'approche suivante, qui est une légère adaptation de l' exemple de documentation Insérer un curseur .

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
la source
2

Dans votre question, il est difficile de dire où se termine l'exercice que vous essayez de terminer et où commence votre tentative de code, mais je pense que le code ci-dessous vous donnera la même erreur:

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 c'est le cas, vous pouvez conclure que vous rencontrez un problème Python (IT), plutôt qu'un problème ArcPy (GIS), qui devrait être recherché / demandé à Stack Overflow plutôt qu'ici.

PolyGeo
la source
Je mélange toujours les deux sites et ce qui devrait être affiché où, je m'assurerai d'en tenir compte à l'avenir avant de poster. En modifiant le code ci-dessus, un morceau a été laissé dans celui qui devait être supprimé.
Staley
1
@Staley En règle générale, s'il génère une erreur mentionnant ArcPy, il appartient probablement ici, sinon il est probable que ce soit une erreur Python à la place. Reconnaître où se termine ArcPy et où commence Python est difficile au départ, mais je pense que c'est une compétence importante à acquérir, car elle vous permet de vous concentrer sur la provenance des erreurs, et donc sur la recherche à effectuer, beaucoup plus rapidement.
PolyGeo
1
Je n'y avais pas pensé comme ça, assez intelligent, je vais certainement l'utiliser et l'appliquer à l'avenir.
Staley
0

Ce script a fonctionné pour moi:

(inspiré des réponses précédentes et des exemples ici: https://pro.arcgis.com/en/pro-app/arcpy/get-started/writing-geometries.htm )

  1. Obtenez l'étendue du raster
  2. Enregistrer les valeurs de mesure en tant que points (coordonnées en [x,y])
  3. Créer une nouvelle classe d'entités pour stocker une nouvelle géométrie
  4. Insérer en cursortant que géométrie dans une nouvelle classe d'entités

Scénario:

# 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
la source