Viac

Použitie arcpy.UpdateCursor na odstránenie riadkov neodstráni na základe počítadla?

Použitie arcpy.UpdateCursor na odstránenie riadkov neodstráni na základe počítadla?


Pokúšam sa odstrániť riadky z tvarového súboru pomocou arcpy.UpdateCursor. Prvá vec, ktorú som urobil, bolo získať jedinečný zoznam hodnôt z kľúčového poľa „PolyGUID“, potom tento zoznam zopakujem pomocou arcpy.UpdateCursor. Keď som vnútri kurzora, nastavil som počítadlo x = 0, potom pre každý záznam zvýšim +1. Po odstránení druhého záznamu sa zdá, že k odstráneniu riadku nedošlo. Nemôže objekt vrátený UpdateCursor fungovať týmto spôsobom? Tu je kód…

import arcpy from arcpy import env outPointFromPoint = r "C:  Trash  Nov2011  ResFinalC6.shp" sql = "" PolyGUID  "<>" "ocur = arcpy.SearchCursor (outPointFromPoint, sql) listDelete = [] for oc in ocur: if oc.PolyGUID not in listDelete: listDelete.append (oc.PolyGUID) print len ​​(listDelete) del oc, ocur, x, sql for lD in listDelete: sql2 = "" PolyGUID  "=" + "'" + str (lD) + "'" upcur = arcpy.UpdateCursor (outPointFromPoint, sql2, "", "", "FMEAS2 A") x = 0 pre upc in upcur: x = x + 1 tlač upc.FMEAS2 #print x ak x == 1: vytlačiť x else: vytlačiť "--------------------------" + str (x) vytlačiť "Vymazanie:" + str (upc.PolyGUID) + str (upc.FMEAS2) upcur.deleteRow (upc) del sql2, upc, upcur, x, lD, listDelete

PolyGUID pochádzajú z polygónu fc. Vedenie polygónu vo fc, ResFinalC6.shp, znamená, že počas operácie LocateFeatureAlongARoute… záznam z polygónu mal jeden alebo viac ako jeden výsledný záznam. Ak bol výsledkom viac ako jeden záznam, musím sa zbaviť všetkých ostatných záznamov. Polygónový záznam pretínal trasu na viac ako jednom mieste (pri problémových záznamoch trikrát). Výsledkom je pole zobrazujúce hodnotu m, kde došlo k priesečníku. Čo som teda urobil, bolo pre každú jedinečnú hodnotu v PolyGUID získať UpdateCursor ... zoradiť pole, ktoré obsahuje hodnotu M (pretože potrebujem záznam s najnižšou hodnotou m) a pomocou počítadla x odstrániť tie PolyGUID, ktoré viedli k ďalším viac ako jeden záznam (všetky okrem jedného s najnižšou hodnotou m ... a preto som triedil na UpdateCursor) vyplývajúci z dotazu s UpdateCursor.


Problém je v tom, že potom, čo kurzor prešiel záznamom 1 a nastavil x = 1…, potom zaznamenal 2 a nastavil x = 2 a potom vymazal záznam 2 ... skript sa dostane k tým PolyGUIDom, ktoré sa zobrazia trikrát ... môj príkaz na tlač je zasiahnutý a x sa nastaví na x = 3, ale záznam sa nevymaže. Spustil som to mnohokrát a vždy zostali rovnaké PolyGUIDy a všetky sa objavili trikrát pred pokusom o odstránenie. V okne shellu pythonu, kde prebieha tlač, je záznam 3 prekliaty, ale nie vymazaný.


V nadväznosti na niektoré komentáre k vášmu príspevku som váš skript trochu vyčistil. Existuje niekoľko nepotrebných premenných a logika je trochu ťažkopádna. Očividne nemám tvarový súbor, s ktorým pracujete, a netestoval som to na ničom lokálnom smieť nepracuje hneď pre vás, ale malo by nám to prinajmenšom poskytnúť dobrý základ na to, aby ste mohli začať.

import arcpy shp = r'C:  Trash  Nov2011  ResFinalC6.shp 'sql = "" PolyGUID  "<>" "rows = arcpy.SearchCursor (shp, sql) delList = [] pre riadok v riadkoch: delList. pripojiť (riadok.PolyGUID) vytlačiť len (delList) del riadky riadky = arcpy.UpdateCursor (shp, "#", "#", "#", "FMEAS2 A") pre riadok v riadkoch: if row.PolyGUID v delList: vytlačiť "Vymazanie: %s %s" %(riadok.PolyGUID, riadok.FMEAS2) riadky.deleteRow (riadok) del riadky

UPRAVIŤ:

Dobre, myslím, že mám lepší prehľad o tvojom procese. Toto nie je najefektívnejší spôsob, ako to urobiť, pretože vytvorí kurzor pre každý PolyGUID bez ohľadu na to, či obsahuje duplicitné položky, ale je to začiatok ... POZNÁMKA: Druhý kurzor bol zmenený na aktualizačný kurzor (13:06 EST)

import arcpy shp = r'C:  Trash  Nov2011  ResFinalC6.shp 'sql = "" PolyGUID  "<>" " # #-Najprv získame úplný zoznam všetkých riadkov PolyGUID = arcpy.SearchCursor (shp, sql) polyguids = set () pre riadok v riadkoch: polyguids.add (row.PolyGUID) del riadky tlač len (polyGUIDs) #-Teraz umožníme opakovať každý PolyGUID ... pre sprievodcu v polyguide: #-vytvoríme nový kurzor pre každý PolyGUID, ktorý vráti iba riadky pre tento GUID sql = "" PolyGUID  "= ' % s'" % guid rows = arcpy.UpdateCursor (shp, sql, "#", "#", "FMEAS2 A") x = 0 pre riadok v riadkoch: ak x == 0: #-uložte prvý záznam (pretože je zoradený podľa „FMEAS2“, prvý záznam je ten, ktorý chceme) x += 1 ďalší: #-ak je viacero záznamov s rovnakým PolyGUID , odstráňte ich vytlačením „Odstránenie: %s %s“ %(riadok.PolyGUID, riadok.FMEAS2) riadky.deleteRad (riadok) del riadky