Próbuję obliczyć powierzchnię wielokąta w moim skrypcie Python. Tworzę nowy wielokąt z scalania dwóch razem i chciałbym dodać obszar wynikowego wielokąta do pola w pliku wyjściowym. Wielokąt jest przechowywany w regularnym pliku kształtu i jest rzutowany. Obszar najlepiej w jednostkach mapy.
Myślałbym, że jest to dość powszechne i proste zadanie, ale pomimo wielu Googleingów jak dotąd nie byłem w stanie znaleźć działających rozwiązań.
Miałem zamiar arcpy.updateCursor
wstawić wartość po jej obliczeniu (na tym etapie jest tylko jedna funkcja w FC), więc najłatwiej jest, jeśli można ją zwrócić jako zmienną. Działa również każde alternatywne rozwiązanie, które spełnia to samo zadanie (przeniesienie wartości obszaru do właściwego pola).
Próbowałem także kalkulatora Field z Python. Zmodyfikowany ze stron pomocy, myślałem, że następujące będą działać, ale jak dotąd nie ma szczęścia.
arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
Uruchamianie ArcGIS Basic 10.1 SP1 z Python 2.7 w systemie Windows 7.
Odpowiednie części mojego obecnego kodu wyglądają następująco:
#/.../
arcpy.Copy_management(inpgs, outpgs)
arcpy.AddField_management(outpgs, 'Shape_area', 'LONG')
fields = AM.FieldLst(outpgs)
#/.../
# Identify and search for shapes smaller than minimum area
where1 = '"' + 'Shape_Area' + '" < ' + str(msz)
polyrows = arcpy.SearchCursor(inpgs, where1)
for prow in polyrows:
grd1 = prow.GridID # GridID on the current polygon
grd2 = nDD.get(grd1) # GridID on the polygon downstream
# Update features
if grd2
geometry1 = prow.Shape
geometry2 = geometryDictionary[grd2]
# Update temporary features
arcpy.Merge_management([geometry1, geometry2], tempMerged)
arcpy.Dissolve_management(tempMerged, tempPgs)
fds = AM.FieldLst(tempPgs)
for field in fields[2:]:
arcpy.AddField_management(tempPgs, field, 'DOUBLE')
for fd in fds[2:]:
arcpy.DeleteField_management(tempPgs, fd)
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
# Append them to output FC
try:
arcpy.Append_management(tempPgs, outpgs, "TEST")
except arcgisscripting.ExecuteError:
arcpy.Append_management(tempPgs, outpgs, "NO_TEST")
elif ...
else ...
źródło
SHAPE@AREA
części kursora do odczytu obszaru; ale struktura kodu zależy od tego, czy twój obszar jest w tych samych jednostkach, co to, co chcesz napisać.Odpowiedzi:
Istnieją trzy różne sposoby znajdowania i przechowywania obszaru wielokąta w klasie obiektów za pomocą arcpy: 1) kalkulator polowy, 2) „klasyczne” kursory arcpy i 3)
arcpy.da
kursory. Część tego zapożyczono z mojej poprzedniej odpowiedzi na temat korzystania z SearchCursor .1. Kalkulator polowy
Podczas korzystania z kalkulatora pola istnieją trzy różne typy wyrażeń, które używają różnych analizatorów wyrażeń. Jest to określone w trzecim parametrze narzędzia geoprzetwarzania Oblicz pole . Podczas uzyskiwania dostępu do właściwości obiektu Geometry przy użyciu polecenia „podobnie jak”
!shape.area!
należy użyć analizatora składni Python 9.3.Wyrażenie, które miałeś wcześniej, wykonało
split()
polecenie wyniku!SHAPE.AREA!
. Zwracalist
obiekt Python , którego nie można rzutować nafloat
obiekt.W swoim wyrażeniu możesz określić jednostkę zwracanego obszaru za pomocą
@SQUAREKILOMETERS
flagi, zastępującSQUAREKILOMETERS
je jednostkami na stronie pomocy Oblicz pole .Oto kod Python, którego użyłbym dla tej metody:
2. Arc 10.0 - Kursory „klasyczne”
Podczas używania klasycznych kursorów (tj.
arcpy.UpdateCursor
) Obiekt kursora jest iterowalnym obiektem zawierającymrow
obiekty. Musisz użyć metodgetValue
isetValue
, aby uzyskać geometrię z wiersza (jako obiekt geometrii i ustawić wartość obszaru narow
liczbę zmiennoprzecinkową.Twój wiersz wyjściowy jest przechowywany w tymczasowej przestrzeni do rysowania, dopóki nie wywołasz
updateRow
metody na kursorze. Zapisuje to nowe dane w rzeczywistym zestawie danych.Oto kod Python, którego użyłbym dla tej metody:
3. Arc 10.1 - kursory arcpy.da
Podczas korzystania z nowych kursorów w module dostępu do danych (tj.
arcpy.da.UpdateCursor
) Musisz przekazać listę nazw pól jako drugi parametr w konstruktorze kursora. Wymaga to nieco więcej pracy z góry, ale wynikowymirow
obiektami są listy w języku Python, co ułatwia odczyt i zapis danych podczas iteracji w wierszach kursora.arcpy.da.UpdateCursor
ma również lepszą wydajność niżarcpy.UpdateCursor
częściowo, ponieważ pomija nieistotne pola, zwłaszcza geometrię.Podczas czytania geometrię, można wybrać jedną z wielu żetonów geometrii, na przykład
SHAPE@TRUECENTROID
,SHAPE@AREA
alboSHAPE@
. Użycie „prostszego” tokena znacznie poprawia wydajność w porównaniu doSHAPE@
, który zawiera wszystkie informacje o geometrii. Pełna lista tokenów znajduje się na stroniearcpy.da.UpdateCursor
pomocy.Tak jak poprzednio, wiersz wyjściowy jest przechowywany w tymczasowej przestrzeni do rysowania, dopóki nie wywołasz
updateRow
metody na kursorze. Zapisuje to nowe dane w rzeczywistym zestawie danych.Oto kod Python, którego użyłbym dla tej metody:
źródło
row[1] = row[0]
ponieważ nie ma jużarea
atrybutu. Możesz także użyć kursora jako menedżera kontekstu wwith
instrukcji i nie musisz się martwić o usunięcie czegokolwiek.