Vairāk

Arcpy.mapping. Slāņa kļūda, strādājot ar failiem vairākos datu rāmjos

Arcpy.mapping. Slāņa kļūda, strādājot ar failiem vairākos datu rāmjos


Es varu iegūt šādu kodu, lai tas darbotos mxd ar vienu datu rāmi. Tomēr man tas ir nepieciešams, lai palaistu un pārvietotos pa mxd, kurā ir vairāki datu rāmji ar identiski nosauktiem failiem un datu avotiem, kas ir manā dziesmu sarakstā.

EDIT Papildus informācija - Pēdējā paziņojuma nolūks bija nodrošināt risinājumu, lai arcpy nespētu iestatīt attēlojuma izteiksmi slāņa rekvizītu dialoglodziņā, atkārtoti pievienojot failu ar nosaukuma lauku. Tātad, jautājums ir par to, kā vislabāk atjaunināt slāņu displeja izteiksmi pēc iespējas automatizētākā veidā (vēlams ar python, jo man nav pazīstamas ArcObjects).

importēt arcpy lyrlist = ['Inset Bridges', 'Bridges', 'Transportation Points', 'Transport Lines'] mxd = arcpy.mapping.MapDocument ("Current") dflist = arcpy.mapping.ListDataFrames (mxd) df in dflist : if df.scale <= 126720: for lyr in (arcpy.mapping.ListLayers (mxd, "", df)): if lyr.supports ("DEFINITIONQUERY"): ja lyr.name in lyrlist: NewFile = arcpy.mapping .Layer (lyr.dataSource) OldFN = lyr.name NewFile.name = "NewFi" lyr.name = "OldFi" arcpy.mapping.InsertLayer (df, lyr, NewFile, "AFTER") #šādas rindas rezultāts ValueError palaižot #mxd, kurā ir vairāki datu rāmji ar failu nosaukumiem no lyrlist updateLyr = arcpy.mapping.Layer ("NewFi") sourceLyr = arcpy.mapping.Layer ("OldFi") arcpy.mapping.UpdateLayer (df, updateLyr, sourceLyr, True) updateLyr.name = OldFN arcpy.mapping.RemoveLayer (df, lyr) arcpy.RefreshTOC () arcpy.RefreshActiveView drukāt "skripts pabeigts" del mxd

Kods darbojas labi, līdz tas nokļūst vietā, kur es piešķiru mainīgo updateLyr. Tas man rada šādu kļūdu:

Izpildlaika kļūdas izsekošana (pēdējais pēdējais zvans):

Fails "", 44. rinda, collas

Fails "c: program files (x86) arcgis desktop10.1 arcpy arcpy arcobjects mixins.py", 389. rinda, tajā super (LayerMixin, self).tajā(lyrfile)

Fails "c: program files (x86) arcgis desktop10.1 arcpy arcpy arcobjects_base.py", 47. rinda, tajā par arg args))

ValueError: objekts: CreateObject Layer nederīgs datu avots


Lai to atkļūdotu, iesaku mainīt:

df in dflist: ja df.scale <= 126720: lyr in (arcpy.mapping.ListLayers (mxd, "", df)): ja lyr.supports ("DEFINITIONQUERY"):

uz:

df in dflist: if df.scale <= 126720: for lyr in (arcpy.mapping.ListLayers (mxd, "", df)): print df.name + ":" + lyr.name if lyr.supports (" DEFINITIONQUERY "):

Es neesmu pārbaudījis iepriekš minēto, taču tam vajadzētu ļaut jums precīzi noteikt datu rāmi un slāni tajā, kas izraisa jūsu kļūdu.


Es saņēmu labas atkļūdošanas idejas, kas man palīdzēja galu galā nākt klajā ar manu risinājumu, kas galu galā bija vienkāršāks nekā tas, ko es mēģināju darīt. Būtībā es ļauju arkveida UpdateLayer veikt vairāk darba, lai atrisinātu manu displeja izteiksmes problēmu. Es neesmu pārliecināts, kas bija manas sākotnējās problēmas avots, bet šāds risinājums izdarīja to, ko es gribēju:

* EDIT Lūk, mans risinājums. Tas ir rediģēts, lai mainītu pēdējo UpdateLayer parametru uz False. Tas bija kritiski, jo pēc tam failam, kura displejs bija jāatjaunina, tiek izmantota visa slāņa veidne, nevis tikai leģenda. Plašāku informāciju skatiet ESRI dokumentācijā.

importēt arcpy mxd = arcpy.mapping.MapDocument ("Current") dflist = arcpy.mapping.ListDataFrames (mxd) df in dflist: ja df.scale <= 126720: par lyr in (arcpy.mapping.ListLayers (mxd, ") ", df)): ja lyr.supports (" DEFINITIONQUERY "): ja lyr.name ==" Tilti ": sourceLyr = arcpy.mapping.Layer (r" C:  Bridgefile.lyr ") arcpy.mapping.UpdateLayer ( df, lyr, sourceLyr, False) print lyr.name + "updated" elif lyr.name == "Transportation Lines": sourceLyr = arcpy.mapping.Layer (r ": C:  TransFile.lyr") arcpy.mapping. UpdateLayer (df, lyr, sourceLyr, False) drukāt lyr.name + "atjaunināts" arcpy.RefreshTOC () arcpy.RefreshActiveView drukāt "skripts pabeigts" del mxd