ArcPy kullanarak etiket stillerini (yazı tipi, renk, boyut vb.) Değiştirme?


9

ArcGIS 10.2 için farklı daire tiplerine dayanan bir katmandaki noktaları etiketleme işlemini otomatikleştirecek bir python makrosu yazmaya çalışıyorum. Örneğin, bir daire tarzı, bir etiket olarak beyaz kalın metinli mavi bir kareye sahip olacaktır; bir diğeri siyah kalın metinli pembe bir kareye sahip olacaktı; diğerinde beyaz kalın metinli kırmızı bir kare vb. olurdu.

Bu etiketlerin stilini değiştirmek için arcpy'de hangi ifadeyi veya işlevi kullanırsınız?

Şu anda, komut dosyası daireleri bir harita koduyla etiketlemekte ve TOK'daki adını gerektiği gibi dairelere değiştirmektedir.

resim açıklamasını buraya girin

Şimdi, her biri için benzersiz bir etiket yapmak için etiketlerin yazı tipini, grafiğini ve boyutunu değiştirmek ve daha sonra bu katmanlardan birini yapmak zorunda kaldığımızda her zaman düğmeye basmak ve işlemi otomatikleştirmek için bir düğme yapmak istiyorum.

Yazı tiplerinin, etiketlerin ve grafiklerin Python komut dosyası (ArcPy, IDLE, vb.) Kullanılarak değiştirilmesinin herhangi bir yolu var mı?


Bu yazıyı düzenlemeye karar verdim, burada ne yapacağım hakkında son bir açıklama yapalım, böylece karışıklık yok. Esasen, haritadaki noktalar yukarıdaki resme benzemekten şuraya gidecek:

resim açıklamasını buraya girin


Kullanmaya çalıştığım lblClass.expressionkod çalışmıyor ancak işlevini kullanmayı denedim . Muhtemelen doğru yönde atılan adım budur. Aşağıda, etiketlerin yazı tiplerini değiştirmek için labelClass.expression ifadesini almak için kullanmaya çalıştığım bazı kodlar bulunmaktadır.

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])

Yanıtlar:


7

Arcpy.mapping API'si yalnızca doğrudan değiştirilebilen sınırlı sayıda katman özelliğine erişim sağlar, ancak Katman Özellikleri iletişim kutusunda bulunan tüm özellikler UpdateLayer işlevi kullanılarak değiştirilebilir. Bilgiler bir kaynak katmandan çıkarılır ve güncellenmesi gereken bir harita belgesindeki katmana uygulanır. Source_layer bir katman (.lyr) dosyası veya bir harita belgesindeki katman olabilir. UpdateLayer sağlam bir işlevdir, çünkü farklı sonuçlar üretmek için birkaç farklı şekilde kullanılabilir.

Semboloji / etiketleri istediğiniz gibi oluşturmanız ve bir katman dosyasına kaydetmeniz gerekir. Ardından arcpy.mapping.UpdateLayer () öğesini kullanarak bu katman dosyasını yükleyin .

Birden fazla kişinin python eklentisini çalıştırması gerekiyorsa, katman dosyasını herkese açık bir ağ sürücüsü gibi herkes için erişilebilir hale getirmeniz gerekir.


Özel bir Güncelleme Katmanı Özellikleri araç kutusu oluşturdum . ArcMap TOC'de bir katman seçmenize ve ardından bir giriş katmanı dosyası seçmenize olanak tanır. Daha sonra katmanı katman dosyasındaki tüm özelliklerle günceller ve orijinal özellik sınıfına geri kaynaklanır. Gdb, mdb, shp veya sde'deki verilerle çalışacaktır.

Kaynak Kodunu Görüntüle

Herhangi bir sorunuz olursa lütfen bize bildirin.

resim açıklamasını buraya girin


Her şey (semboloji ve etiketler) ile başka bir nokta tabanlı veri katmanından ayrı bir katman dosyası oluşturdum, yürütür, ancak tek yaptığı, etiketlenmemiş, unmbolized apartman dosyasını (hangisini seçmeyi seçersem) tamamen değiştirmektir. sourceLayer apartman dosyası. Bunun "yalnızca güncelleme sembolojisi" bölümündeki Yanlış nedeniyle olduğunu varsayıyorum. Bunun sadece semboloji ve etiketleri uygulayacak, ancak noktaları farklı bir yere taşımayacak şekilde yürütülmesinin bir yolu var mı?
Tyler Spears

Bunu yapmak için ne tür işlevler aramalıyım? Yeniden kaynak sağlama konusunda fazla bilgim yok. Bu arada yardımınıza minnettarım.
Tyler Spears

Kodumu sığdırmak için bu ayarlamayı denedim. UpdateLayer işlevi aracılığıyla çalışır, ancak satır 35'te: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]dizinin aralık dışında olduğunu belirten bir hata atar.
Tyler Spears

Bu, arcpy.mapping.ListLayersyöntemin geçerli mxd'de sizin adınızla aynı ada sahip bir katman bulamadığı anlamına gelir input_layer_file( [0]geri dönen dizinin aralık dışında bir dizini listede hiçbir öğe olmadığı anlamına gelir).
XIY

Yaptım ve bunun çok yakın olduğunu hissediyorum, ancak sorun, UpdateLayer kısmı bittikten sonra şu hatayı atıyor: 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

Başka bir seçenek, python kullanarak katmandaki özel etiket ifadesini ayarlamak (boyut ve renk değiştirme ..etc):

Örneğin

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

Etiket ifadeleri oluşturma

Bunlar şu şekilde ayarlanabilir:

LabelClass (arkpy.mapping)

DÜZENLE:

Bunu dene:

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>"

Diğer satır ifadelerinizi kaldırabilirsiniz (döngü, labClass ve işlev çağrısı için). Ayrıca, işlevin FindLabel olarak adlandırılması gerekir.


Böyle bir işleve benzer bir şey kullanmaya çalıştım. Denilen bir tanım oluşturdum def getLabel (Code, Type)ve sonra kullandığım farklı harita kodları için if-else deyimlerini ayarladıktan sonra, sadece döndüren 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")' ayarladım bir hata TypeError: unsupported operand type(s) for &: 'str' and 'str'temelde Esri web sitesi örneklerini takip ediyorum. Yazı tipini değiştirebileceğimi kanıtlayabilirsem, daha zor yönleri (etiketlerin şekli, arka planı ve rengi gibi) ayarlamaya devam edebilirim.
Tyler Spears

@Tyler Spears, Alan adları etrafındaki çift tırnak işaretlerini kaldırmayı deneyin.
artwork21

Bunu yaptığımda parametrelerin tanımlanmadığını söylüyor.
Tyler Spears

@Tyler Spears, Kodunuzu sorunuza gönderebilir misiniz? İşlev parantezlerinin dışında tek bir alıntı var.
artwork21

Kesinlikle, kodumu göstermek için sorumu güncelledim.
Tyler Spears
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.