Dies ist der dritte Teil einer mehrteiligen Serie über ArcPy-Cursor; insbesondere die Arbeit mit ArcPy-Cursorn als iterierbare Objekte in Python. Der erste Teil der Serie<\/A> behandelt einige der wichtigen Komponenten der Iteration in Python. Der zweite Teil der Serie<\/A> befasst sich mit dem Iterieren und Schleifen über ArcPy Data Access Cursors. Der dritte Teil der Serie<\/STRONG> behandelt die Verwendung mehrerer Python-eigener und itertools-Funktionen mit ArcPy Data Access Cursors. Der vierte Teil der Serie wird sich mit der Verwendung von Generatoren oder Generator-Ausdrücken befassen, um Auswahl- oder Filterlogik für die Wiederverwendung von Code zu trennen. Fünfte oder folgende Teile sind derzeit unbekannt.<\/EM><\/P><\/P>Die ersten beiden Teile dieser Serie behandeln Iterationskomponenten von Python und das Iterieren\/Schleifen in Python, die beide entscheidend sind, um iterierbare Objekte zu verstehen und mit ihnen zu arbeiten. Über das manuelle Iterieren oder Schleifen über ein iterierbares Objekt hinaus gibt es zahlreiche Python-eingebaute Funktionen<\/A>, die mit iterierbaren Objekten und Sequenzen arbeiten. Bereits ab Version 2.3 wurde ein itertools<\/A>-Modul eingeführt, das "Funktionen zur Erstellung von Iteratoren für effizientes Schleifen" enthält.<\/P><\/P>Der Fokus dieser Serie liegt darauf, ArcPy Data Access Cursors als Python-iterierbare Objekte zu behandeln. Wie bei den meisten Dingen im Leben gibt es mehr als einen Weg, eine Frage mit ArcGIS zu beantworten, und ich möchte einige kontrastierende Beispiele zusammen mit pythonischen Beispielen bieten. So sehr ich es auch mag, idiomatisches Python zu schreiben, wird es viele Gelegenheiten geben, bei denen die Verwendung nativer Geoverarbeitungswerkzeuge schneller ist als reines Python. Schnellen Code zu schreiben ist großartig, aber das ist eine separate Diskussion für einen anderen Tag.<\/P><\/P>Es gibt so viele eingebaute und itertools-Funktionen, die mit iterierbaren Objekten arbeiten, dass ich sie nicht alle demonstrieren kann, aber ich werde einige wenige zeigen, um zu veranschaulichen, wie solche Funktionen gut mit ArcPy Data Access Cursors funktionieren. Für diesen und zukünftige Teile der Serie werde ich die vorherigen Beispiele zugunsten eines realen Datensatzes hinter mir lassen, den Leser herunterladen und selbst ausprobieren können. Konkret werde ich das USA States layer package<\/A> verwenden, das mit Esri Data & Maps enthalten ist und auf ArcGIS.com<\/A> verfügbar ist.<\/P><\/P>Der gleiche ArcPy Data Access SearchCursor<\/A> wird für die meisten der folgenden Beispiele verwendet:<\/P><SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> layer <SPAN class="operator token">=<\/SPAN> r<SPAN class="string token">'USA States\\USA States (below 1:3m)'<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> fields <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">[<SPAN class="string token">"STATE_ABBR"<SPAN class="punctuation token">,<SPAN class="string token">"SHAPE@AREA"<SPAN class="punctuation token">,<SPAN class="string token">"SUB_REGION"<SPAN class="punctuation token">,<SPAN class="string token">"POP2010"<SPAN class="punctuation token">]<SPANSPAN> <SPAN class="operator token">>><SPANSPAN>><SPANSPAN> cursor <SPANSPAN>=<SPANSPAN> arcpy.da.SearchCursor(layer, fields) <SPANSPAN>>><SPANSPAN>><SPANSPAN> <SPANSPAN><<EMOJI_0></SPANSPAN><SPANSPAN><<EMOJI_1></SPANSPAN><SPANSPAN><<EMOJI_2></SPANSPAN><SPANSPAN><<EMOJI_3></SPANSPAN>Eines der Fragen, die von Zeit zu Zeit in den Foren\GeoNet auftauchen, ist, wie man die Anzahl der Datensätze in einem Datensatz oder einer Auswahlmenge mithilfe von Cursorn zählt:>>> # Beispiel 1: Anzahl der Datensätze mit ArcGIS-Geoverarbeitungswerkzeug ermitteln >>> arcpy.GetCount_management(layer) <Result '52'> >>> >>> # Beispiel 2: Anzahl der Datensätze mit Variable als Zähler ermitteln >>> with cursor: ... i = 0 ... for row in cursor: ... i = i + 1 # oder i += 1 ... print(i) 52 >>> >>> # Beispiel 3: Anzahl der Datensätze mit eingebauten list- und len-Funktionen ermitteln >>> with cursor: ... print(len(list(cursor))) 52 >>> >>> # Beispiel 4: Anzahl der Datensätze mit eingebauter sum-Funktion ermitteln >>> with cursor: ... print(sum(1 for row in cursor)) 52 >>> <<EMOJI_4></SPANSPAN><<EMOJI_5></SPANSPAN><<EMOJI_6></SPANSPAN><<EMOJI_7></SPANSPAN><<EMOJI_8></SPANSPAN><<EMOJI_9></SPANSPAN><<EMOJI_10></SPANSPAN><<EMOJI_11></SPANSPAN><<EMOJI_12></SPANSPAN><<EMOJI_13></SPANSPAN><<EMOJI_14></SPANSPAN><<EMOJI_15></SPANSPAN><<EMOJI_16></SPANSPAN><<EMOJI_17></SPANSPAN><<EMOJI_18></SPANSPAN><<EMOJI_19></SPANSPAN><<EMOJI_20></SPANSPAN><<EMOJI_21></SPANSPAN><<EMOJI_22></SPANSPAN><<EMOJI_23></SPANSPAN><<EMOJI_24></SPANSPAN><<EMOJI_25></SPANSPAN><<EMOJI_26></SPANSPAN><<EMOJI_27></SPANSPAN><<EMOJI_28>Blick auf die Beispiele zur Zählung von Datensätzen:Beispiel 1 verwendet das ArcGIS-Get Count <\/_A>-Geoverarbeitungswerkzeug.Das Get Count-Werkzeug ruft die Anzahl der Datensätze in einer Feature-Class, Tabelle, Layer oder Raster ab. Es arbeitet nicht direkt mit Cursorn. Es kann auch in der GUI verwendet werden.<\/_LI><\/_UL>Beispiel 2 durchläuft den Cursor unter Verwendung einer Variablen als Zähler.Eine Zählschleife Die Struktur ist in einer Vielzahl von Programmiersprachen üblich.<\/LI><\/UL><\/LI>Beispiel 3 verwendet die eingebauten list<\/SPAN> <\/A>und len<\/SPAN> <\/A>-Funktionen.Die list<\/SPAN>-Funktion wandelt den gesamten Cursor in eine Python-Liste um, und die len<\/SPAN>-Funktion gibt die Länge der Liste zurück, was der Anzahl der Datensätze im Cursor entspricht.<\/LI>Das Erstellen einer Python-Liste erfordert das Kopieren des gesamten Inhalts des Cursors in den Speicher, was bei extrem großen Datensätzen problematisch werden könnte.<\/LI><\/UL><\/LI>Beispiel 4 verwendet die eingebaute sum<\/SPAN> <\/A>-Funktion zusammen mit einem Generator-Ausdruck<\/A>.Die Verwendung eines Python-Generator-Ausdrucks anstelle einer Liste kopiert nicht<\/SPAN> den gesamten Inhalt des Cursors in den Speicher.<\/LI><\/UL><\/LI><\/UL><\/P>Ich habe Beispiel 1 aufgenommen, weil es der leistungsstärkste Ansatz ist, um Datensatzanzahlen von Datensätzen und Auswahlmengen innerhalb des ArcGIS-Frameworks zu erhalten, aber es behandelt einen Cursor nicht als Python-iterierbares Objekt, was der Fokus dieser Serie ist. Beispiel 2 ist funktional und syntaktisch korrekt, obwohl ich argumentieren würde, dass es nicht das Pythonischste ist. Beispiele 3 und 4 verwenden beide eingebaute Python-Funktionen, die einen Cursor als iterierbar behandeln, aber es ist diskutabel, ob Beispiel 3 oder 4 pythonischer ist, da jeder Ansatz Stärken und Schwächen hat.<\/P><\/P>Eine weitere Frage, die gelegentlich auftaucht, ist, wie man einen Datensatz aus einem Datensatz basierend auf den minimalen oder maximalen Werten eines der Felder im Datensatz abruft. Das nächste Beispielset ruft den Datensatz\Zeile für den Bundesstaat mit der höchsten Bevölkerung im Jahr 2010 (POP2010) ab:<\/P><SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Tabellenname für Datenquelle der Ebene abrufen<\/Span> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> desc <SPAN class="operator token">=<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Describe<SPAN class="punctuation token">(<\/SPAN>layer<SPAN class="punctuation token">)<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> fc_name <SPAN class="operator token">=<\/SPAN> desc<SPAN class="punctuation token">.<\/SPAN>featureClass<SPAN class="punctuation token">.<\/SPAN>baseName <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Beispiel 5: Maximalen Bevölkerungsdatensatz mit ArcGIS-Geoverarbeitungswerkzeugen abrufen<\/Span> <SPAN class="operator token">>><\/span><span class="operator token">><span> summary_table <span class="operator token">=<span> arcpy<span class="punctuation token">.<span>Statistics_analysis<span class="punctuation token">(<span>layer<span class="punctuation token">,<span> <span class="punctuation token">. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . </span> "in_memory/summary_max"<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "POP2010 MAX"<span class="punctuation token">)<span> <span class="operator token">>><span> arcpy<span class="punctuation token">.<span>AddJoin_management<span class="punctuation token">(<span>layer<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "POP2010"<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> summary_table<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "MAX_POP2010"<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "KEEP_COMMON"<span class="punctuation token">)<span> <span class="operator token">>><span> joined_fields <span class="operator token">=<span> [<span>(field <span class="keyword token">if</span> "@" <spanclass=keyword-token >in</ span > field < spanclass=keyword-token >else</ span > ".".join([fc_name,< span > field]) ) <span>. . </ span > for field <span>. . </ span > in fields] <spanclass=operator-token >>></ span > cursor_sql_join < spanclass=operator-token >=</ span > arcpy.da.SearchCursor(layer,< span > joined_fields) <spanclass=operator-token >>></ span > print next(cursor_sql_join) (u'CA', 41.639274447708424, u'Pacific', 37253956) <spanclass=operator-token >>></ span > del cursor_sql_join <spanclass=operator-token >>></ span > arcpy.RemoveJoin_management(layer, "summary_max") <Result 'USA States\\USA States (below 1:3m)'> <spanclass=operator-token >>></ span > <spanclass=operator-token >>></ span > < spanclass=comment-token ># Beispiel 6: Maximalen Bevölkerungsdatensatz mit SQL abrufen Unterabfrage</SPAN> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> sql <SPAN class="operator token">=</SPAN> <SPAN class="string token">"POP2010 IN ((SELECT MAX(POP2010) FROM {}))"</SPAN><SPAN class="punctuation token">.</SPAN>format<span class="punctuation token">(</span>fc_name<span class="punctuation token">)</span> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> cursor_sql_subqry <SPAN class="operator token">=</SPAN> arcpy<span class="punctuation token">.</span>da<span class="punctuation token">.</span>SearchCursor<span class="punctuation token">(</span>layer<span class="punctuation token">,</span> fields<span class="punctuation token">,</span> sql<span class="punctuation token">)</span> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="keyword token">print</SPAN> next<span class="punctuation token">(</span>cursor_sql_subqry<span class="punctuation token">)</span> <SPAN class="punctuation token">(</span>u<span class="string token">'CA'</span><span class="punctuation token">,</span> <SPAN class="number token">41.639274447708424</SPAN><span class="punctuation token">,</span> u<span class="string token">'Pacific'</span><span class="punctuation token">,</span> <SPAN class="number token">37253956</SPAN><span class="punctuation token">)</span> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="keyword token">del</SPAN> cursor_sql_subqry <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="comment token"># Beispiel 7: Erhalte Datensatz mit maximaler Bevölkerung durch Schleife und Vergleich</SPAN> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <span class="keyword token">with</span> cursor<span class="punctuation token">:</span> <SPAN class="punctuation token">.</span><SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn> max_row <span class="operator token">=</span> next<span class="punctuation token">(</span>cursor<span class="punctuation token">)</span> <SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn> <span class="keyword token">for</span> row <span class="keyword token">in</span> cursor<span class="punctuation token">:</span> <SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn> <span class="keyword token">if</span> row<span class="punctuation token">[</span><Spanclass = "numbertoken" >3 </Span >< spanclass = " punctuationtoken " >]</ span > < spanclass = " operatortoken " >> </ span > max_row<spanclass = " punctuationtoken " >[ </ span >< Spanclass = " numbertoken " >3 </ Span >< spanclass = " punctuationtoken " >] :</ span > <SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; max_row < spanclass = " operatortoken " >= </ span > row <SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" keywordtoken" >print </ Span > max_row <Spanclass =" punctuationtoken" >( </ Span >u<Spanclass =" stringtoken" >'CA' </ Span >< Spanclass =" punctuationtoken" >, </ Span > < Spanclass =" numbertoken" >41.639274447708424 </ Span >< Spanclass =" punctuationtoken" >, </ Span > u<Spanclass =" stringtoken" >'Pacific' </ Span >< Spanclass =" punctuationtoken" >, </ Span > < Spanclass =" numbertoken" >37253956 </ Span >< Spanclass =" punctuationtoken" >( </ Span ) <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" commenttoken" ># Beispiel 8: Erhalte Datensatz mit maximaler Bevölkerung mit eingebauter max-Funktion</ Span > <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" keywordtoken" >from </ Span > operator < Spanclass =" keywordtoken" >import </ Span > itemgetter <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" keywordtoken" >with </ Span > cursor<spanclass= " punctuationtoken ">:</ span> <Spanclass= " punctuationtoken ">. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . </ span> & nbsp ; print max(cursor, key=itemgetter(3)) & nbsp ; (u'CA', 41.639274447708424, u'Pacific', 37253956) > & gt; <<EMOJI_0>><<EMOJI_1>><<EMOJI_2>><<EMOJI_3>><<EMOJI_4>><<EMOJI_5>><<EMOJI_6>><<EMOJI_7>><<EMOJI_8>><<EMOJI_9>><<EMOJI_10>><<EMOJI_11>><<EMOJI_12>><<EMOJI_13>><<EMOJI_14>><<EMOJI_15>><<EMOJI_16>><<EMOJI_17>><<EMOJI_18>><<EMOJI_19>><<EMOJI_20>><<EMOJI_21>><<EMOJI_22>><<EMOJI_23>><<EMOJI_24>><<EMOJI_25>><<EMOJI_26>><<EMOJI_27>><<EMOJI_28>><<EMOJI_29>><<EMOJI_30>><<EMOJI_31>><<EMOJI_32>><<EMOJI_33>><<EMOJI_34>><<EMOJI_35>><<EMOJI_36>><<EMOJI_37>><<EMOJI_38>><<EMOJI_39>><<EMOJI_40>><<EMOJI_41>><<EMOJI_42>><<EMOJI_43>><<EMOJI_44>><<EMOJI_45>><<EMOJI_46>><<EMOJI_47>><<EMOJI_48>> Beim Betrachten der Beispiele für den maximalen Datensatz: - Die Beispiele 5 und 6 benötigen den Tabellennamen für die Datenquelle der layer. - Der Tabellenname wurde mit der ArcPy <a href=\"http://desktop.arcgis.com/en/desktop/latest/analyze/arcpy-functions/describe.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Describe</a>-Funktion und Eigenschaften von zwei verschiedenen Describe-Objekten gefunden (die Eigenschaftsabfragen wurden in Zeile 03 verkettet). - Beispiele 5 und 6 benötigen beide den zugrundeliegenden Tabellennamen, aber aus unterschiedlichen Gründen. - Bei Beispiel 5 wird der Basistabellenname benötigt, um den Cursor neu zu erstellen, nachdem die Zusammenfassungsstatistik-Tabelle an die Quelltabelle des Layers angefügt wurde. - Bei Beispiel 6 wird der Basistabellenname benötigt, um die Unterabfrage zu erstellen, die in der WHERE-Klausel des SQL-Cursors verwendet wird. - Beispiel 5 verwendet die ArcGIS-Tools für <a href=\"http://desktop.arcgis.com/en/desktop/latest/tools/analysis-toolbox/summary-statistics.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Summary Statistics</a> und <a href=\"http://desktop.arcgis.com/en/desktop/latest/tools/data-management-toolbox/add-join.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Add Join</a> Geoverarbeitungswerkzeuge. - Das Summary Statistics-Werkzeug findet den maximalen Bevölkerungswert im Datensatz. Das Add Join-Werkzeug ermöglicht es, das Ergebnis des Summary Statistics-Werkzeugs zurück zum ursprünglichen Layer zu verknüpfen, um den entsprechenden Datensatz mit der maximalen Bevölkerung zu finden. - Bevor ein Cursor gegen den neu verbundenen Layer erstellt wird, müssen die ursprünglichen Felder aktualisiert werden, um den Tabellennamen dem Feldnamen voranzustellen (Zeile 16). - Beispiel 6 verwendet eine SQL-Unterabfrage in der WHERE-Klausel der SQL-Abfrage. - Die SQL-Unterabfrage identifiziert den maximalen Bevölkerungswert. Der/die Wert(e), die von der SQL-Unterabfrage zurückgegeben werden, werden verwendet, um Datensätze im ursprünglichen Datensatz auszuwählen. - Beispiel 7 durchläuft den Cursor mit einer Variablen, die den Datensatz mit dem Maximalwert hält. - Eine Schleifenstruktur ist in einer Vielzahl von Programmiersprachen üblich. - Beispiel 8 verwendet die eingebaute <a href=\"https://docs.python.org/2/library/functions.html#max\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span style=\"font-family: courier new,courier;\">max</span></a>-Funktion zusammen mit der <a href=\"https://docs.python.org/2/library/operator.html\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span style=\"font-family: courier new,courier;\">operator.itemgetter</span></a>-Funktion. - Die <span style=\"font-family: courier new,courier;\">max</span>-Funktion arbeitet auf einem Iterierbaren, aber es ist notwendig, <span style=\"font-family: courier new,courier;\">operator.itemgetter</span> zu verwenden, da der Cursor ein Iterierbares von Tupeln darstellt und kein Iterierbares von numerischen Datentypen ist. Ich habe Beispiel 5 aufgenommen, weil es nur ArcGIS-Geoverarbeitungswerkzeuge verwendet und in der GUI implementiert werden kann. Obwohl es ohne Skriptkenntnisse in der GUI implementiert werden kann, ist Beispiel 5 auch das umständlichste, d.h., es hat die meisten Schritte, ist am langsamsten und erzeugt Zwischenprodukte. Mit nur ein wenig SQL- oder Python-Wissen öffnen sich die Türen zu eleganteren und leistungsfähigeren Ansätzen. Ähnlich wie Beispiel 2 oben ist Beispiel 7 funktional und syntaktisch korrekt, obwohl ich argumentieren würde, dass Beispiel 8 pythonischer ist.<\/P><P><\/P><P>Anstatt nur den Bundesstaat mit der größten Bevölkerung im Jahr 2010 zu ermitteln, lassen Sie uns die Bundesstaaten und ihre Bevölkerungen nach absteigender Bevölkerung ausgeben:<\/P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Beispiel 9: Bundesstaat und Bevölkerung nach absteigender Bevölkerung ausgeben<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Verwendung des Sort geoprocessing tools<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> sorted_table <SPAN class="operator token">=<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Sort_management<SPAN class="punctuation token">(<\/SPAN>layer<SPAN class="punctuation token">, <\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">"in_memory\/sorted_pop"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="punctuation token">.<\/span><span class="punctuation token">.<\/span><span class="punctuation token">.<\/span> <span class="string token">"POP2010 DESCENDING"<\/span><span class="punctuation token">)<\/span> <span class="punctuation token">.<\/span><span class="punctuation token">.<\/span><span class="punctuation token">.<\/span> <span class="operator token">> ><\/span><span class="operator token">><\/span> cursor_sorted_table <span class="operator token">=<\/span> arcpy< span class="punctuation token">.<\/span>da< span class="punctuation token">.<\/span>SearchCursor< span class="punctuation token">(<\/span>sorted_table< span class="punctuation token">, <\/span>fields< span class="punctuation token">)<\/span> <span class="operator token">> ><\/span><span class="operator token">><\/span> < span class="keyword token">with<\/span> cursor_sorted_table< span class="punctuation token">:<\/span> <span class="punctuation token">.<\/span>< span class="punctuation token">.<\/span>< span class="punctuation token">.<\/span>& nbsp; & nbsp; & nbsp; & nbsp; < span class= "keyword token" > for < / span > state < span class = "punctuation token" > , < / span > area < span class = "punctuation token" > , < / span > sub_region < span class = "punctuation token" > , < / span > pop2010 < span class = "keyword token" > in < / span > cursor_sorted_table < span class = "punctuation token" > : < / span > <span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; < span class= "keyword token" > print < / span > " {}, {} " . format ( state , pop2010 ) <span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; CA , 37253956 TX , 25145561 NY , 19378102 <span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span > DC , 601723 WY , 563626 PR , -99 <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > del cursor_sorted_table <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > # Beispiel 10: Bundesstaat und Bevölkerung nach absteigender Bevölkerung ausgeben <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > #& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; Verwendung der SQL ORDER BY-Klausel <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > sql = "ORDER BY POP2010 DESC" <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > cursor_orderby_sql = arcpy.da.SearchCursor(layer, fields, sql_clause=(None, sql)) <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > with cursor_orderby_sql: <span class = "punctuation_token"> reverse<SPAN class="operator token">=<\/SPAN><SPAN class="token boolean">True<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">:<\/SPAN>\n<SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="keyword token">print<\/SPAN> <SPAN class="string token">"{}, {}"<\/SPAN><SPAN class="punctuation token">.<\/SPAN>format<SPAN class="punctuation token">(<\/SPAN>state<SPAN class="punctuation token">,<\/SPAN> pop2010<SPAN class="punctuation token">)<\/SPAN>\n<SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> \nCA<SPAN class="punctuation token">,<\/SPAN> <SPAN class="number token">37253956<\/SPAN>\nTX<SPAN class="punctuation token">,<\/SPAN> <SPAN class="number token">25145561<\/SPAN>\nNY<SPAN class="punctuation token">,<\/SPAN> <SPAN class="number token">19378102<\/SPAN>\n<SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/span><span class="punctuation token">.<\/span>\nDC<span class="punctuation token">,<\/span> <span class="number token">601723<\/span>\nWY<span class="punctuation token">,<\/span> <span class="number token">563626<\/span>\nPR<span class="punctuation token">,<\/span> <span class="operator token">-<\/span><span class="number token">99<\/span>\n<span class="operator token">>><\/span><span class="operator token">><\/span>\n<span class="line-numbers-rows"><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span></span></span>Blick auf die Beispiele mit absteigender Bevölkerung:<\/P> Beispiel 9 verwendet das ArcGIS Sort-Geoverarbeitungswerkzeug. Das Sort-Werkzeug sortiert die ursprüngliche Tabelle in eine neue Tabelle. Ein neuer Cursor muss mit der neu sortierten Feature-Class definiert werden.<\/LI> <\/UL> Beispiel 10 verwendet eine SQL ORDER BY-Klausel. Die SQL ORDER BY-Klausel wird als Teil der sql_clause beim Erstellen eines neuen Cursors übergeben.<\/LI> <\/UL> Beispiel 11 verwendet die eingebaute sorted-Funktion zusammen mit der operator.itemgetter-Funktion. Die sorted-Funktion arbeitet auf einem Iterable, aber es ist notwendig, operator.itemgetter zu verwenden, da der Cursor ein Iterable von Tupeln und kein Iterable von numerischen Datentypen darstellt. Die sorted-Funktion wandelt den gesamten Cursor in eine Python-Liste um, und das Erstellen einer Python-Liste erfordert das Kopieren des gesamten Inhalts des Cursors in den Speicher, was bei extrem großen Datensätzen problematisch werden könnte. <\UL>I ch habe Beispiel 9 aufgenommen, weil es ArcGIS-Geoverarbeitungswerkzeuge verwendet und leicht in der GUI implementiert werden kann. Ähnlich wie Beispiel 5 oben ist Beispiel 9 umständlich, wenn man skripten statt die GUI zu verwenden. Beispiel 10 verwendet etwas grundlegendes SQL für eine einfache Lösung, obwohl es erforderlich ist, einen weiteren Cursor zu erstellen, anstatt den vorhandenen Cursor wiederzuverwenden. Beispiel 11 ist idiomatisch, da es die eingebaute sorted-Funktion verwendet und den Cursor als Iterable behandelt. Da die Funktion sorted eine neu sortierte Python-Liste aus einem Iterable zurückgibt, könnte die Verwendung der Funktion bei extrem großen Datensätzen problematisch werden.
<\/P>
Der Fokus dieser Serie liegt darauf, ArcPy Data Access Cursors als Python-iterierbare Objekte zu behandeln. Wie bei den meisten Dingen im Leben gibt es mehr als einen Weg, eine Frage mit ArcGIS zu beantworten, und ich möchte einige kontrastierende Beispiele zusammen mit pythonischen Beispielen bieten. So sehr ich es auch mag, idiomatisches Python zu schreiben, wird es viele Gelegenheiten geben, bei denen die Verwendung nativer Geoverarbeitungswerkzeuge schneller ist als reines Python. Schnellen Code zu schreiben ist großartig, aber das ist eine separate Diskussion für einen anderen Tag.<\/P>
Es gibt so viele eingebaute und itertools-Funktionen, die mit iterierbaren Objekten arbeiten, dass ich sie nicht alle demonstrieren kann, aber ich werde einige wenige zeigen, um zu veranschaulichen, wie solche Funktionen gut mit ArcPy Data Access Cursors funktionieren. Für diesen und zukünftige Teile der Serie werde ich die vorherigen Beispiele zugunsten eines realen Datensatzes hinter mir lassen, den Leser herunterladen und selbst ausprobieren können. Konkret werde ich das
Der gleiche ArcPy Data Access
<SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> layer <SPAN class="operator token">=<\/SPAN> r<SPAN class="string token">'USA States\\USA States (below 1:3m)'<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> fields <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">[<SPAN class="string token">"STATE_ABBR"<SPAN class="punctuation token">,<SPAN class="string token">"SHAPE@AREA"<SPAN class="punctuation token">,<SPAN class="string token">"SUB_REGION"<SPAN class="punctuation token">,<SPAN class="string token">"POP2010"<SPAN class="punctuation token">]<SPANSPAN> <SPAN class="operator token">>><SPANSPAN>><SPANSPAN> cursor <SPANSPAN>=<SPANSPAN> arcpy.da.SearchCursor(layer, fields) <SPANSPAN>>><SPANSPAN>><SPANSPAN> <SPANSPAN><<EMOJI_0></SPANSPAN><SPANSPAN><<EMOJI_1></SPANSPAN><SPANSPAN><<EMOJI_2></SPANSPAN><SPANSPAN><<EMOJI_3></SPANSPAN>
Eines der Fragen, die von Zeit zu Zeit in den Foren\GeoNet auftauchen, ist, wie man die Anzahl der Datensätze in einem Datensatz oder einer Auswahlmenge mithilfe von Cursorn zählt:
>>> # Beispiel 1: Anzahl der Datensätze mit ArcGIS-Geoverarbeitungswerkzeug ermitteln >>> arcpy.GetCount_management(layer) <Result '52'> >>> >>> # Beispiel 2: Anzahl der Datensätze mit Variable als Zähler ermitteln >>> with cursor: ... i = 0 ... for row in cursor: ... i = i + 1 # oder i += 1 ... print(i) 52 >>> >>> # Beispiel 3: Anzahl der Datensätze mit eingebauten list- und len-Funktionen ermitteln >>> with cursor: ... print(len(list(cursor))) 52 >>> >>> # Beispiel 4: Anzahl der Datensätze mit eingebauter sum-Funktion ermitteln >>> with cursor: ... print(sum(1 for row in cursor)) 52 >>> <<EMOJI_4></SPANSPAN><<EMOJI_5></SPANSPAN><<EMOJI_6></SPANSPAN><<EMOJI_7></SPANSPAN><<EMOJI_8></SPANSPAN><<EMOJI_9></SPANSPAN><<EMOJI_10></SPANSPAN><<EMOJI_11></SPANSPAN><<EMOJI_12></SPANSPAN><<EMOJI_13></SPANSPAN><<EMOJI_14></SPANSPAN><<EMOJI_15></SPANSPAN><<EMOJI_16></SPANSPAN><<EMOJI_17></SPANSPAN><<EMOJI_18></SPANSPAN><<EMOJI_19></SPANSPAN><<EMOJI_20></SPANSPAN><<EMOJI_21></SPANSPAN><<EMOJI_22></SPANSPAN><<EMOJI_23></SPANSPAN><<EMOJI_24></SPANSPAN><<EMOJI_25></SPANSPAN><<EMOJI_26></SPANSPAN><<EMOJI_27></SPANSPAN><<EMOJI_28>
Blick auf die Beispiele zur Zählung von Datensätzen:
<SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Tabellenname für Datenquelle der Ebene abrufen<\/Span> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> desc <SPAN class="operator token">=<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Describe<SPAN class="punctuation token">(<\/SPAN>layer<SPAN class="punctuation token">)<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> fc_name <SPAN class="operator token">=<\/SPAN> desc<SPAN class="punctuation token">.<\/SPAN>featureClass<SPAN class="punctuation token">.<\/SPAN>baseName <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Beispiel 5: Maximalen Bevölkerungsdatensatz mit ArcGIS-Geoverarbeitungswerkzeugen abrufen<\/Span> <SPAN class="operator token">>><\/span><span class="operator token">><span> summary_table <span class="operator token">=<span> arcpy<span class="punctuation token">.<span>Statistics_analysis<span class="punctuation token">(<span>layer<span class="punctuation token">,<span> <span class="punctuation token">. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . </span> "in_memory/summary_max"<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "POP2010 MAX"<span class="punctuation token">)<span> <span class="operator token">>><span> arcpy<span class="punctuation token">.<span>AddJoin_management<span class="punctuation token">(<span>layer<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "POP2010"<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> summary_table<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "MAX_POP2010"<span class="punctuation token">,<span> <span class="punctuation token">. . . </span> "KEEP_COMMON"<span class="punctuation token">)<span> <span class="operator token">>><span> joined_fields <span class="operator token">=<span> [<span>(field <span class="keyword token">if</span> "@" <spanclass=keyword-token >in</ span > field < spanclass=keyword-token >else</ span > ".".join([fc_name,< span > field]) ) <span>. . </ span > for field <span>. . </ span > in fields] <spanclass=operator-token >>></ span > cursor_sql_join < spanclass=operator-token >=</ span > arcpy.da.SearchCursor(layer,< span > joined_fields) <spanclass=operator-token >>></ span > print next(cursor_sql_join) (u'CA', 41.639274447708424, u'Pacific', 37253956) <spanclass=operator-token >>></ span > del cursor_sql_join <spanclass=operator-token >>></ span > arcpy.RemoveJoin_management(layer, "summary_max") <Result 'USA States\\USA States (below 1:3m)'> <spanclass=operator-token >>></ span > <spanclass=operator-token >>></ span > < spanclass=comment-token ># Beispiel 6: Maximalen Bevölkerungsdatensatz mit SQL abrufen Unterabfrage</SPAN> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> sql <SPAN class="operator token">=</SPAN> <SPAN class="string token">"POP2010 IN ((SELECT MAX(POP2010) FROM {}))"</SPAN><SPAN class="punctuation token">.</SPAN>format<span class="punctuation token">(</span>fc_name<span class="punctuation token">)</span> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> cursor_sql_subqry <SPAN class="operator token">=</SPAN> arcpy<span class="punctuation token">.</span>da<span class="punctuation token">.</span>SearchCursor<span class="punctuation token">(</span>layer<span class="punctuation token">,</span> fields<span class="punctuation token">,</span> sql<span class="punctuation token">)</span> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="keyword token">print</SPAN> next<span class="punctuation token">(</span>cursor_sql_subqry<span class="punctuation token">)</span> <SPAN class="punctuation token">(</span>u<span class="string token">'CA'</span><span class="punctuation token">,</span> <SPAN class="number token">41.639274447708424</SPAN><span class="punctuation token">,</span> u<span class="string token">'Pacific'</span><span class="punctuation token">,</span> <SPAN class="number token">37253956</SPAN><span class="punctuation token">)</span> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="keyword token">del</SPAN> cursor_sql_subqry <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="comment token"># Beispiel 7: Erhalte Datensatz mit maximaler Bevölkerung durch Schleife und Vergleich</SPAN> <SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <span class="keyword token">with</span> cursor<span class="punctuation token">:</span> <SPAN class="punctuation token">.</span><SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn> max_row <span class="operator token">=</span> next<span class="punctuation token">(</span>cursor<span class="punctuation token">)</span> <SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn> <span class="keyword token">for</span> row <span class="keyword token">in</span> cursor<span class="punctuation token">:</span> <SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn><SPAn class="punctuation token">.</SPAn> <span class="keyword token">if</span> row<span class="punctuation token">[</span><Spanclass = "numbertoken" >3 </Span >< spanclass = " punctuationtoken " >]</ span > < spanclass = " operatortoken " >> </ span > max_row<spanclass = " punctuationtoken " >[ </ span >< Spanclass = " numbertoken " >3 </ Span >< spanclass = " punctuationtoken " >] :</ span > <SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; max_row < spanclass = " operatortoken " >= </ span > row <SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >< SPAnclass = " punctuationtoken " >. </ SPAn >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" keywordtoken" >print </ Span > max_row <Spanclass =" punctuationtoken" >( </ Span >u<Spanclass =" stringtoken" >'CA' </ Span >< Spanclass =" punctuationtoken" >, </ Span > < Spanclass =" numbertoken" >41.639274447708424 </ Span >< Spanclass =" punctuationtoken" >, </ Span > u<Spanclass =" stringtoken" >'Pacific' </ Span >< Spanclass =" punctuationtoken" >, </ Span > < Spanclass =" numbertoken" >37253956 </ Span >< Spanclass =" punctuationtoken" >( </ Span ) <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" commenttoken" ># Beispiel 8: Erhalte Datensatz mit maximaler Bevölkerung mit eingebauter max-Funktion</ Span > <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" keywordtoken" >from </ Span > operator < Spanclass =" keywordtoken" >import </ Span > itemgetter <Spanclass =" operatortoken" >> > </ Span >< Spanclass =" operatortoken" >> </ Span > < Spanclass =" keywordtoken" >with </ Span > cursor<spanclass= " punctuationtoken ">:</ span> <Spanclass= " punctuationtoken ">. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . </ span> & nbsp ; print max(cursor, key=itemgetter(3)) & nbsp ; (u'CA', 41.639274447708424, u'Pacific', 37253956) > & gt; <<EMOJI_0>><<EMOJI_1>><<EMOJI_2>><<EMOJI_3>><<EMOJI_4>><<EMOJI_5>><<EMOJI_6>><<EMOJI_7>><<EMOJI_8>><<EMOJI_9>><<EMOJI_10>><<EMOJI_11>><<EMOJI_12>><<EMOJI_13>><<EMOJI_14>><<EMOJI_15>><<EMOJI_16>><<EMOJI_17>><<EMOJI_18>><<EMOJI_19>><<EMOJI_20>><<EMOJI_21>><<EMOJI_22>><<EMOJI_23>><<EMOJI_24>><<EMOJI_25>><<EMOJI_26>><<EMOJI_27>><<EMOJI_28>><<EMOJI_29>><<EMOJI_30>><<EMOJI_31>><<EMOJI_32>><<EMOJI_33>><<EMOJI_34>><<EMOJI_35>><<EMOJI_36>><<EMOJI_37>><<EMOJI_38>><<EMOJI_39>><<EMOJI_40>><<EMOJI_41>><<EMOJI_42>><<EMOJI_43>><<EMOJI_44>><<EMOJI_45>><<EMOJI_46>><<EMOJI_47>><<EMOJI_48>> Beim Betrachten der Beispiele für den maximalen Datensatz: - Die Beispiele 5 und 6 benötigen den Tabellennamen für die Datenquelle der layer. - Der Tabellenname wurde mit der ArcPy <a href=\"http://desktop.arcgis.com/en/desktop/latest/analyze/arcpy-functions/describe.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Describe</a>-Funktion und Eigenschaften von zwei verschiedenen Describe-Objekten gefunden (die Eigenschaftsabfragen wurden in Zeile 03 verkettet). - Beispiele 5 und 6 benötigen beide den zugrundeliegenden Tabellennamen, aber aus unterschiedlichen Gründen. - Bei Beispiel 5 wird der Basistabellenname benötigt, um den Cursor neu zu erstellen, nachdem die Zusammenfassungsstatistik-Tabelle an die Quelltabelle des Layers angefügt wurde. - Bei Beispiel 6 wird der Basistabellenname benötigt, um die Unterabfrage zu erstellen, die in der WHERE-Klausel des SQL-Cursors verwendet wird. - Beispiel 5 verwendet die ArcGIS-Tools für <a href=\"http://desktop.arcgis.com/en/desktop/latest/tools/analysis-toolbox/summary-statistics.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Summary Statistics</a> und <a href=\"http://desktop.arcgis.com/en/desktop/latest/tools/data-management-toolbox/add-join.htm\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Add Join</a> Geoverarbeitungswerkzeuge. - Das Summary Statistics-Werkzeug findet den maximalen Bevölkerungswert im Datensatz. Das Add Join-Werkzeug ermöglicht es, das Ergebnis des Summary Statistics-Werkzeugs zurück zum ursprünglichen Layer zu verknüpfen, um den entsprechenden Datensatz mit der maximalen Bevölkerung zu finden. - Bevor ein Cursor gegen den neu verbundenen Layer erstellt wird, müssen die ursprünglichen Felder aktualisiert werden, um den Tabellennamen dem Feldnamen voranzustellen (Zeile 16). - Beispiel 6 verwendet eine SQL-Unterabfrage in der WHERE-Klausel der SQL-Abfrage. - Die SQL-Unterabfrage identifiziert den maximalen Bevölkerungswert. Der/die Wert(e), die von der SQL-Unterabfrage zurückgegeben werden, werden verwendet, um Datensätze im ursprünglichen Datensatz auszuwählen. - Beispiel 7 durchläuft den Cursor mit einer Variablen, die den Datensatz mit dem Maximalwert hält. - Eine Schleifenstruktur ist in einer Vielzahl von Programmiersprachen üblich. - Beispiel 8 verwendet die eingebaute <a href=\"https://docs.python.org/2/library/functions.html#max\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span style=\"font-family: courier new,courier;\">max</span></a>-Funktion zusammen mit der <a href=\"https://docs.python.org/2/library/operator.html\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span style=\"font-family: courier new,courier;\">operator.itemgetter</span></a>-Funktion. - Die <span style=\"font-family: courier new,courier;\">max</span>-Funktion arbeitet auf einem Iterierbaren, aber es ist notwendig, <span style=\"font-family: courier new,courier;\">operator.itemgetter</span> zu verwenden, da der Cursor ein Iterierbares von Tupeln darstellt und kein Iterierbares von numerischen Datentypen ist. Ich habe Beispiel 5 aufgenommen, weil es nur ArcGIS-Geoverarbeitungswerkzeuge verwendet und in der GUI implementiert werden kann. Obwohl es ohne Skriptkenntnisse in der GUI implementiert werden kann, ist Beispiel 5 auch das umständlichste, d.h., es hat die meisten Schritte, ist am langsamsten und erzeugt Zwischenprodukte. Mit nur ein wenig SQL- oder Python-Wissen öffnen sich die Türen zu eleganteren und leistungsfähigeren Ansätzen. Ähnlich wie Beispiel 2 oben ist Beispiel 7 funktional und syntaktisch korrekt, obwohl ich argumentieren würde, dass Beispiel 8 pythonischer ist.<\/P><P><\/P><P>Anstatt nur den Bundesstaat mit der größten Bevölkerung im Jahr 2010 zu ermitteln, lassen Sie uns die Bundesstaaten und ihre Bevölkerungen nach absteigender Bevölkerung ausgeben:<\/P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Beispiel 9: Bundesstaat und Bevölkerung nach absteigender Bevölkerung ausgeben<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> <SPAN class="comment token"># Verwendung des Sort geoprocessing tools<\/SPAN> <SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> sorted_table <SPAN class="operator token">=<\/SPAN> arcpy<SPAN class="punctuation token">.<\/SPAN>Sort_management<SPAN class="punctuation token">(<\/SPAN>layer<SPAN class="punctuation token">, <\/SPAN> <SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="string token">"in_memory\/sorted_pop"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="punctuation token">.<\/span><span class="punctuation token">.<\/span><span class="punctuation token">.<\/span> <span class="string token">"POP2010 DESCENDING"<\/span><span class="punctuation token">)<\/span> <span class="punctuation token">.<\/span><span class="punctuation token">.<\/span><span class="punctuation token">.<\/span> <span class="operator token">> ><\/span><span class="operator token">><\/span> cursor_sorted_table <span class="operator token">=<\/span> arcpy< span class="punctuation token">.<\/span>da< span class="punctuation token">.<\/span>SearchCursor< span class="punctuation token">(<\/span>sorted_table< span class="punctuation token">, <\/span>fields< span class="punctuation token">)<\/span> <span class="operator token">> ><\/span><span class="operator token">><\/span> < span class="keyword token">with<\/span> cursor_sorted_table< span class="punctuation token">:<\/span> <span class="punctuation token">.<\/span>< span class="punctuation token">.<\/span>< span class="punctuation token">.<\/span>& nbsp; & nbsp; & nbsp; & nbsp; < span class= "keyword token" > for < / span > state < span class = "punctuation token" > , < / span > area < span class = "punctuation token" > , < / span > sub_region < span class = "punctuation token" > , < / span > pop2010 < span class = "keyword token" > in < / span > cursor_sorted_table < span class = "punctuation token" > : < / span > <span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; < span class= "keyword token" > print < / span > " {}, {} " . format ( state , pop2010 ) <span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; CA , 37253956 TX , 25145561 NY , 19378102 <span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span >< span class = "punctuation token" > . < / span > DC , 601723 WY , 563626 PR , -99 <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > del cursor_sorted_table <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > # Beispiel 10: Bundesstaat und Bevölkerung nach absteigender Bevölkerung ausgeben <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > #& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; Verwendung der SQL ORDER BY-Klausel <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > sql = "ORDER BY POP2010 DESC" <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > cursor_orderby_sql = arcpy.da.SearchCursor(layer, fields, sql_clause=(None, sql)) <span class = "operator token" >& gt ;& gt ;& gt ; </span >< span class = "operator token" >& gt ; </span > with cursor_orderby_sql: <span class = "punctuation_token"> reverse<SPAN class="operator token">=<\/SPAN><SPAN class="token boolean">True<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">:<\/SPAN>\n<SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> <SPAN class="keyword token">print<\/SPAN> <SPAN class="string token">"{}, {}"<\/SPAN><SPAN class="punctuation token">.<\/SPAN>format<SPAN class="punctuation token">(<\/SPAN>state<SPAN class="punctuation token">,<\/SPAN> pop2010<SPAN class="punctuation token">)<\/SPAN>\n<SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN> \nCA<SPAN class="punctuation token">,<\/SPAN> <SPAN class="number token">37253956<\/SPAN>\nTX<SPAN class="punctuation token">,<\/SPAN> <SPAN class="number token">25145561<\/SPAN>\nNY<SPAN class="punctuation token">,<\/SPAN> <SPAN class="number token">19378102<\/SPAN>\n<SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/SPAN><SPAN class="punctuation token">.<\/span><span class="punctuation token">.<\/span>\nDC<span class="punctuation token">,<\/span> <span class="number token">601723<\/span>\nWY<span class="punctuation token">,<\/span> <span class="number token">563626<\/span>\nPR<span class="punctuation token">,<\/span> <span class="operator token">-<\/span><span class="number token">99<\/span>\n<span class="operator token">>><\/span><span class="operator token">><\/span>\n<span class="line-numbers-rows"><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><span></span></span>
Es gibt zahlreiche weitere Beispiele, die mir eingefallen sind, aber dieser Beitrag ist bereits länger als erwartet. Ich glaube, dass die drei obigen Beispielsätze zeigen, wie eingebaute Python-Funktionen, die auf Iterables arbeiten, mit ArcPy Data Access-Cursorn verwendet werden können, um idiomatisches Python für ArcGIS zu schreiben. Der nächste Teil der Serie befasst sich mit der Verwendung von Generatoren und Generator-Ausdrücken mit ArcPy Data Access-Cursorn.
These are great examples, thanks for posting. Just yesterday I was trying to figure out the best way to count the number of rows returned in a cursor.
If you can reach back to the layer, feature layer, feature class, table view, or table; then the Get Count tool is by far the quickest method. If you have an existing ArcPy cursor that needs to be used, instead of what the cursor was created from, then there are several similar performing Python-based options as I demonstrated.
I just wanted to show iterable-based examples, which aren't always the fastest, but adding performance into the discussion would have made it longer and more complicated.
Angemeldete Mitglieder können Beiträge verfassen, Updates folgen und mehr. Neu hier? Registrieren Sie ein kostenloses Konto.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.