Modificare gli stili di etichetta (carattere, colore, dimensioni, ecc.) Usando ArcPy?


9

Sto cercando di scrivere una macro Python per ArcGIS 10.2 che automatizzerà il processo di etichettatura dei punti in un livello basato su diversi tipi di appartamenti. Ad esempio, uno stile di appartamenti avrebbe un quadrato blu con testo in grassetto bianco come un'etichetta; un altro avrebbe un quadrato rosa con testo in grassetto nero; un altro avrebbe un quadrato rosso con un testo in grassetto bianco, ecc.

Quale espressione o funzione useresti in arcpy per modificare lo stile di queste etichette?

Attualmente, lo script identifica gli appartamenti con un codice mappa e cambia il nome nel sommario in appartamenti, come dovrebbe.

inserisci qui la descrizione dell'immagine

Ora voglio cambiare il carattere, la grafica e le dimensioni delle etichette per renderle un'etichetta unica per ognuna, quindi creare un pulsante per premere e automatizzare semplicemente il processo ogni volta che dobbiamo fare uno di questi livelli.

Esiste un modo per modificare caratteri, etichette e grafica con l'uso dello scripting Python (ArcPy, IDLE, ecc.)?


Ho deciso di modificare questo post per dare una descrizione finale di ciò che sto andando qui, quindi non c'è confusione. In sostanza, i punti sulla mappa passeranno da come l'immagine sopra a questo:

inserisci qui la descrizione dell'immagine


Ho provato ad usare la lblClass.expressionfunzione, tuttavia il codice che sto cercando di usare non funziona. Immagino che sia probabilmente il passo nella giusta direzione. Di seguito è riportato un codice che ho provato a utilizzare solo per ottenere il labelClass.expression per modificare i caratteri delle etichette.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])

Risposte:


7

L'API arcpy.mapping fornisce solo l'accesso a un numero limitato di proprietà layer che possono essere modificate direttamente, ma tutte le proprietà presenti nella finestra di dialogo Proprietà layer possono essere modificate utilizzando la funzione UpdateLayer. Le informazioni vengono estratte da un livello di origine e applicate al livello in un documento della mappa che deve essere aggiornato. Source_layer può essere un file di livello (.lyr) o un livello all'interno di un documento della mappa. UpdateLayer è una funzione affidabile perché può essere utilizzata in diversi modi per produrre risultati diversi.

È necessario creare la simbologia / etichette come desiderato e salvarla in un file di livello. Quindi caricare quel file di layer utilizzando arcpy.mapping.UpdateLayer () .

Se più persone devono eseguire il componente aggiuntivo python, è necessario rendere il file di livello accessibile a tutti, ad esempio un'unità di rete pubblica.


Ho finito per creare una casella degli strumenti Proprietà livello aggiornamento personalizzata . Consente di selezionare un livello nel sommario ArcMap, quindi selezionare un file di livello di input. Quindi aggiorna il layer con tutte le proprietà all'interno del file layer e rinvia alla classe di feature originale. Funzionerà con i dati in gdb, mdb, shp o sde.

Visualizza il codice sorgente

Per favore fatemi sapere se avete domande.

inserisci qui la descrizione dell'immagine


Ho creato un file di livello separato da un altro livello di dati basato su punti con tutto il set (simbologia ed etichette), viene eseguito, ma tutto ciò che sembra fare è sostituire completamente il file dell'appartamento senza etichetta, non simbolizzato (qualunque scelga di aggiungere) con il file dell'appartamento sourceLayer. Suppongo che ciò sia dovuto a False nella sezione "aggiorna solo simbologia". C'è un modo in cui questo può essere eseguito in modo da applicare solo la simbologia e le etichette ma non spostare i punti in una posizione diversa?
Tyler Spears,

Che tipo di funzioni dovrei cercare per farlo? Non ho troppa familiarità con il re-sourcing. Apprezzo il tuo aiuto finora, comunque.
Tyler Spears,

Ho provato a modificarlo per adattarlo al mio codice. Funziona tramite la funzione UpdateLayer, ma alla riga 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]genera un errore che indica che l'indice non è compreso nell'intervallo.
Tyler Spears,

Ciò significa che il arcpy.mapping.ListLayersmetodo non sta trovando un layer nel mxd corrente con lo stesso nome del tuo input_layer_file(un indice di indice di [0]ritorno fuori intervallo significa che non ci sono elementi nell'elenco).
XIY

L'ho fatto e sento che questo è molto vicino, ma il problema è che, al termine della parte UpdateLayer, viene generato il seguente errore: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears,

6

Un'altra opzione è quella di impostare un'espressione di etichetta personalizzata sul livello (cambiando dimensione e colore ... ecc) usando python:

per esempio

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Costruire espressioni di etichette

Possono essere impostati tramite:

LabelClass (arcpy.mapping)

MODIFICARE:

Prova questo:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

È possibile rimuovere le altre istruzioni di linea (per loop, labClass e call to function). Inoltre, la funzione deve essere chiamata FindLabel.


Ho provato a utilizzare qualcosa di simile a una funzione come questa. Ho creato una definizione chiamata def getLabel (Code, Type)e dopo aver impostato le istruzioni if-else per i diversi codici mappa che utilizzo, ho quindi impostato 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")', che restituisce un errore TypeError: unsupported operand type(s) for &: 'str' and 'str'sto sostanzialmente seguendo gli esempi del sito web di Esri. Se posso semplicemente dimostrare di poter cambiare il carattere, posso quindi passare alla regolazione degli aspetti più difficili (come la forma, lo sfondo e il colore delle etichette).
Tyler Spears,

@Tyler Spears, prova a rimuovere le doppie virgolette attorno ai nomi dei campi.
artwork21

Quando lo faccio, dice che i parametri non sono definiti.
Tyler Spears,

@Tyler Spears, puoi pubblicare il tuo codice nella tua domanda? Hai una virgoletta singola al di fuori delle parentesi di funzione.
artwork21

Assolutamente, ho aggiornato la mia domanda per mostrare il mio codice.
Tyler Spears,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.