Отримання міри кожного многокутника у формі файла за допомогою ArcPy?


20

У ArcGIS 10 та Python я хочу отримати інформацію про ступінь (xmax, ymax, xmin, ymin) кожного полігону у файлі форм.

Я можу отримати масштаби всього файлу форм, використовуючи

file=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
desc=arcpy.Describe(file)
print desc.extent.Xmax

394551.52085039532

Але я не можу зрозуміти, як отримати ту саму інформацію для кожного рядка набору даних.

rows = arcpy.SearchCursor("100k_trc_tiles_TVM")
for row in rows:
 print row

друкує 31 рядок у наборі даних, але

for row in rows:
 desc=arcpy.Describe(row)
 print desc.extent.Xmax

дає помилку.

Помилка виконання: Об'єкт: Описати вхідне значення недійсний тип

Я думав додати значення масштабу до таблиці за допомогою "обчислити геометрію", але це дає лише центроїд. Тоді я думаю, що ми можемо використовувати щось на зразок row.GetValue ("xmax").

Зважаючи на це, я знаю, що ми можемо створити X / Y, max / min за допомогою функції з http://www.ian-ko.com/free/free_arcgis.htm, але було б найкраще, якщо ми не зможемо додавати поля, особливо якщо ArcPy може отримати ці значення.

В основному мені потрібно отримати розрізи для подачі в інструмент кліпу, щоб вирізати 30 областей даних (відповідно до аркушів карт 1: 100 000) для геообробки, оскільки інструмент "Спліт" виходить з ладу через великий розмір набору даних (див. Чому Intersect дає ПОМИЛКА 999999: Помилка виконання функції Недійсна топологія [Занадто багато кінцевих точок рядка]? ). Я хочу автоматизувати це, оскільки це повторюється на ряді наборів даних.

=== робочий сценарій ===

# Emulates Arc Info SPLIT tool by using Clip but
# Requires a FC from which each row is used as the input clip feature.
# Each row must be rectangular.
# Used on 12GB FGDB with 100 million records.


#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com
import arcpy, string

#inFrame=arcpy.GetParameterAsText(0) # Input dataframe FC
#inFile=arcpy.GetParameterAsText(1) # Input FC for splitting
#outDir=arcpy.GetParameterAsText(2) # Output FGDB

inFrame=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
inFile=r"c:\junk\106\data\7_Merge.gdb\FullRez_m2b"
outDir=r"D:\SCRATCH\Projects\206\datasplit\test_slaasp.gdb"
#NameField="Name_1"

#arcpy.env.workspace = r"C:/Workspace"
arcpy.env.overwriteOutput = True

rows = arcpy.SearchCursor(inFrame)
shapeName = arcpy.Describe(inFrame).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    Name = row.Name_1
    print "Executing clip on: "+str(Name)
    extent = feat.extent
    #print extent.XMin,extent.YMin,extent.XMax,extent.YMax
# Create an in_memory polygon
    XMAX = extent.XMax
    XMIN = extent.XMin
    YMAX = extent.YMax
    YMIN = extent.YMin
    pnt1 = arcpy.Point(XMIN, YMIN)
    pnt2 = arcpy.Point(XMIN, YMAX)
    pnt3 = arcpy.Point(XMAX, YMAX)
    pnt4 = arcpy.Point(XMAX, YMIN)
    array = arcpy.Array()
    array.add(pnt1)
    array.add(pnt2)
    array.add(pnt3)
    array.add(pnt4)
    array.add(pnt1)
    polygon = arcpy.Polygon(array)
    ShapeFile = outDir+"\\temp_poly"
    arcpy.CopyFeatures_management(polygon, ShapeFile)

    #print Name
### Set local variables
    in_features = inFile
    clip_features = ShapeFile
    out_feature_class = outDir+"\\"+Name
    xy_tolerance = "0.22"

    # Execute Clip

    try:
        arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
        print "Completed: "+str(Name)
    except:
        error = arcpy.GetMessages()
        print "Failed on: "+str(Name)+" due to "+str(error)

2
Вам не потрібно записувати функцію кліпу на диск, просто використовуйте полігон пам'яті, наприклад: polygon = arcpy.Polygon (масив) arcpy.Clip_analysis (in_features, polygon, out_feature_class, xy_tolerance)
user2856

tks. Будь-яка ідея, як я можу експортувати рядок у новий файл форми, щоб він використовувався, а не просто обсяг рядка? Це так, що він також може обробляти не прямокутні затискачі.
GeorgeC

1
Добре, якщо ви просто хочете зробити кліп за цією функцією, у цьому ж сценарії просто використовуйте об’єкт функції. Знову ж, не потрібно експортувати у файл форми, наприклад: arcpy.Clip_analysis (in_features, feat, out_feature_class, xy_tolerance)
user2856

Для файлу форми або для кожного багатокутника у формі форми? Схоже, ви тут говорите про дві окремі речі.
Рейнер

чи є лише один об’єкт багатокутника у вашому файлі форм? якщо ні, використовуйте для циклу для об'єктів розмір.
Арагон

Відповіді:


26

Отримайте об’єкт фігури у курсорі та отримайте доступ до його властивості. Див. Довідку ArcGIS Робота з геометрією в Python :

shapeName = arcpy.Describe(inFeatures).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    extent = feat.extent
    print extent.XMin,extent.YMin,extent.XMax,extent.YMax

1
Спасибі Люку. Це спрацювало чудово. Я відредагую своє питання, щоб мати новий робочий код, якщо хтось хоче використати інструмент, який - Ітераційно використовує набір інструментів Clip для вирізання прямокутних областей великого класу функцій. Емулює функціональність інструменту розділення інформації про дугу без збоїв з наборами даних розміром 10 Гб FGDB та 100 мільйонів записів.
GeorgeC

Одне - мені довелося жорстко зашифрувати назву стовпця, щоб отримати еквівалент Name = row.Name_1, спробувавши атрибут name як; NameField = "Ім'я_1"; Name = рядок.NameField; або Name = рядок + "." + NameField, де NameField = arcpy.GetParameterAsText (2) та ім'я утримується у колонці Name_1. Будь-які ідеї? Примітка I; я використав ";" для позначення нового рядка.
GeorgeC

1
з'ясував вище - row.GetValue (xxx) від gis.stackexchange.com/questions/16586/…
GeorgeC

7

Набір інструментів Обмежувальний контейнер робить саме те, що ви хочете. Якщо ви просто хочете фрагменти коду, вивчіть функції в скриптах, то явно розглядаєтесь з величиною.

EDIT

Я повинен додати, що скрипт додасть значення в поле «Ліворуч», «Право, вгору» і «знизу» у створеному вихідному файлі, який може бути використаний для подальшої обробки


Спасибі. Перевіримо це. Сподіваюся, я можу використовувати код у своїх скриптах / моделях python.
GeorgeC

2

Я тільки що спробував мінімальну граничну геометрію (конверт) (в управлінні даними) в ArcGIS 10, і, здається, це робиться точно так само для всіх полів.


1

Іншим способом було б зробити SearchCursor () на форм-файлі, тоді ви можете використовувати row.shape.extent:

rows = arcpy.SearchCursor(shapefileName)

for row in rows:
   extent = row.shape.extent
   ...
   ...

1

Як зазначено у Витягуванні координат багатокутних вершин у ArcMap? ви можете отримати вершини багатокутника, а потім додати координати x і y кожної вершини як поля в таблиці атрибутів. Це має обмеження не приєднувати максимум / хв координат безпосередньо до кожного багатокутника, але цього можна досягти кількома способами.

Метод, який мені найбільше знайомий, - це зчитування полів x і y в списки python за допомогою модуля pyshp , який можна потім сортувати для пошуку максимальних і мінімальних значень для кожного багатокутника. Потім Pyshp можна використовувати для відкриття класу авторів, щоб додати нові поля до оригінальних багатокутників та записати ці значення max та min у правильний багатокутник.

Я вважаю, що це можна зробити за допомогою arcpy, але у мене виникло багато проблем із записом у shapefiles у 9.3 за допомогою геопроцесора, тому я віддаю перевагу методу pyshp, однак я не впевнений, що модуль arcpy вирішив ці проблеми.


0

Чи намагалися ви використати великі літери "M" у "XMax"? Я думаю, що це повинно бути:

print desc.extent.XMax

замість

print desc.extent.Xmax

згідно документації . Звичайно, це змушує мене замислитися, як працював ваш перший фрагмент коду. У будь-якому випадку, постріляйте!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.