Viac

Výber riadkov vo vrstve pomocou arcpy.SearchCursor

Výber riadkov vo vrstve pomocou arcpy.SearchCursor


Pracujem na projekte identifikácie bodov, ktoré spadajú pozdĺž ciest. Cesty sú rovnako ako body uložené v rámci jednej geodatabázy jednej triedy funkcií. Používam ArcGIS 10.3.

Snažím sa použiť arcpy vyhľadávací kurzor nakonfigurovaný pomocou pre vyhlásenie na iteráciu prostredníctvom súboru údajov o mojich cestách. V rámci pre slučka Na vrátenie 3 číslice používam funkciu row.getValue krátky celé číslo uložené v poli s názvom „FacilityID“ v rámci atribútov vrstvy vozoviek. Potom chcem použiť túto hodnotu na výber príslušného riadka vo vrstve ciest. Ďalej v riadku by som potom použil tento vybraný riadok ako základ a vyberte podľa polohy dopyt. V súčasnosti môj kód ne iteruje prostredníctvom výberov. Môžem ho nechať vytlačiť všetky 3 číslice v poli „FacilityID“, ale prestane fungovať, ak použijem nástroj arcpy.SelectLayerByAttribute_management.

Pretože mám pocit, že to všetko nevysvetľujem veľmi dobre, uvediem skrátenú verziu svojho kódu:

import arcpy, os from arcpy import env arcpy.env.workspace = "C:  Temp  Test.gdb" env.overwriteOutput = True ROADS = "Test_Roads" FIELD = "FacilityID" roadcursor = arcpy.SearchCursor (roads_lyr) pre riadok v roadcursor: ROADID = (row.getValue (FIELD)) print ROADID, typ (ROADID) expression1 = "" FacilityID  "=" + str (ROADID) arcpy.SelectLayerByAttribute_management (roads_lyr, "NEW_SELECTION", expression1) arcpy.SelectLayerByA roads_lyr, "REMOVE_FROM_SELECTION", výraz1)

V druhom prípade som zmenil typ výberu na „jasný výber“ a dosiahol sa rovnaký výsledok.


Moja preferovaná metóda iterácie záznamov a výberu každého z nich je nasledovná. Je to dlho zdĺhavé, ale všetky funkcie sú pre tieto veci veľmi užitočné.

import arcpy, os #Vytvorte skriptovací nástroj roadFeatures = arcpy.GetParameterAsText (0) field = arcpy.GetParameterAsText (0) #v nastavení nástroja použite nastavenie „získať z“ a nastavte ho na vlastnosti cesty #Alebo, stačí priradiť vaše údaje, ako ste to urobili predtým ##roadFeatures = "Test_Roads" #field = "FacilityID" ## Tieto 3 funkcie používam stále, veľmi praktické ## def getFieldList (fc): #návrat zoznamu reťazcov pre názvy polí fieldObjects = arcpy. fieldDelimited = arcpy.AddFieldDelimiters (arcpy.Describe (table) .path, field) fieldType = arcpy.ListFields (table, field) [0] .type if str (fieldType) == 'String': valueList = ["'%s '" % hodnota pre hodnotu v valueList] whereClause =" % s IN ( % s) " % (fieldDelimited,', '.join (map (str, valueList)))) return whereClause def returnFieldIndex (inFC, fieldName): #returns int index určeného poľa fieldList = getFieldList (inFC) index = 0 pokus: pre fld v fieldList: if fieldName == fld: return int (index) index += 1 else: index += 1 okrem: arcpy.AddMessage ("Chyba pri vracaní indexu poľa. “) #################################################### ####################### fieldList = getFieldList (roadFeatures) fieldIndex = returnFieldIndex (roadFeatures, field) arcpy.MakeFeatureLayer (roadFeatures, "roadsLayer") s arcpy.da. SearchCursor ("roadsLayer", (fieldList)) ako kurzor: pre riadok v kurzore: #Tento riadok vytvára klauzulu where, ktorá v zásade hovorí „urobte klauzulu pre riadok s ID objektu #, ktoré momentálne iterujem “. whereClause = createWhereClause ("roadsLayer", field, [row [fieldIndex]]) arcpy.SelectLayerByAttribute_management ("roadsLayer", "CLEAR_SELECTION") arcpy.SelectLayerByAttribute_management ("roadsLayer", #NEW_SELECTION kód, ktorý potrebujete na „roadsLayer“, v ktorom bude vybratý aktuálny riadok.

Skript funguje tak, že vyberie každý riadok na základe indexu „poľa“.

Postup: pre každý riadok v množine údajov získajte hodnotu „poľa“ a potom vyberte riadok s hodnotou poľa (alias aktuálny riadok)

Poznámka: Ak k objektu roadFeatures priradíte vrstvu, riadok MakeFeatureLayer nebudete potrebovať.


Pozri si video: ZOBRAL SOM CZSK TÍM DO VÍKENDOVKY!