Daha çox

Üst-üstə düşən nöqtələr üçün yazıları birləşdirmək / birləşdirmək olar?

Üst-üstə düşən nöqtələr üçün yazıları birləşdirmək / birləşdirmək olar?


Nümunə yerləri təmsil edən nöqtələrim var. Çox vaxt eyni məkanda birdən çox nümunə götürüləcək: eyni məkana sahib, lakin fərqli nümunə identifikatorları və digər atributları olan bir çox nöqtə. Tək bir etiketlə birlikdə olan bütün nöqtələri, həmin nöqtədəki bütün nöqtələrin bütün nümunə şəxsiyyətlərinin siyahısını yığılmış mətnlə etiketləmək istərdim.

ArcGIS-də adi etiketləmə mühərriki və ya Maplex istifadə etməklə bu mümkündürmü? Bir atribut dəyərində hər yer üçün bütün nümunə identifikatorları ilə yeni bir təbəqə yaradaraq bunun üzərində işləyə biləcəyimi bilirəm, ancaq etiketləmək üçün yeni məlumatlar yaratmamaq istərdim.

Əsasən bundan getmək istəyirəm:

Buna (ən üst nöqtə üçün):

Etiketlərin əl ilə düzəldilməsi olmadan.


Bunun bir yolu təbəqəni klonlaşdırmaq, tərif sorğularından istifadə etmək və ayrıca etiketləmək, birinci təbəqə üçün yalnız yuxarı sol, ikinci üçün aşağı sol mövqedən istifadə etməkdir.

THEFIELD tipli tam ədədi qatına əlavə edin və aşağıdakı ifadədən istifadə edərək doldurun:

aList = [] def FirstOrOthers (shp): qlobal aList açarı = "% s% s"% (dəyirmi (shp.firstPoint.X, 3), dəyirmi (shp.firstPoint.Y, 3)) 2 aList.append (key) return 1

Ona zəng edin:

FirstOrOthers (! Forma!)

Məzmun cədvəlində təbəqənin bir nüsxəsini yaradın, THEFIELD = 1 tərif sorğusunu tətbiq edin.

Orijinal təbəqə üçün THEFIELD = 2 tərif sorğusunu tətbiq edin.

Fərqli sabit etiket yerləşdirmə tətbiq edin

Orijinal həlli şərhlərə əsaslanan yeniləmə:

Sahəni COORD əlavə edin və istifadə edərək doldurun

'% s% s'% (round (! Shape! .firstPoint.X, 2), round (! Shape! .firstPoint.Y, 2))

Etiket üçün ilk və son istifadə edərək bu sahəni ümumiləşdirin. COORD sahəsindən istifadə edərək bu cədvəli yenidən orijinalına qoşun. Çubuqların <> son olduğu qeydləri seçin və yeni bir sahədə ilk və son etiketi birləşdirin

'% s  n% s'% (! Sum_Output_4.First_MUID !,! Sum_Output_4.Last_MUID!)

2 'fərqli təbəqə' və onları etiketləmək üçün sahələri təyin etmək üçün Count_COORD və THEFIELD istifadə edin:

@Hornbydd həllindən ilhamlanan # 2-ni yeniləyin:

import arcpy def FindLabel ([FID], [MUID]): f, m = int ([FID]), [MUID] mxd = arcpy.mapping.MapDocument ("CURRENT") dFids = {} dLabels = {} lyr = arcpy.mapping.ListLayers (mxd, "merkezler") [0] ilə arcpy.da.SearchCursor (lyr, ["FID", "SHAPE @", "MUID"]) kursor kimi: kursorda sıra üçün: FD, shp , LABEL = sıra XY = "% s% s"% (dəyirmi (shp.firstPoint.X, 2), dəyirmi (shp.firstPoint.Y, 2)) əgər f == FD: aKey = XY sınayın: L = dFids [XY] L + = [FD] dFids [XY] = LL = dLabels [XY] L = L + ' n' + LABEL dLabels [XY] = L istisna olmaqla: dFids [XY] = [FD] dLabels [XY] = LABEL Etiketlər = dLabels [aKey] Fids = dFids [aKey] əgər f == Fids [0]: return Etiketlər return ""

Noyabr 2016 YENİLƏNİN, inşallah son.

2000 təkrar sınaqdan keçirilmiş ifadənin altında cazibədarlıq kimi işləyir:

mxd = arcpy.mapping.MapDocument ("CURRENT") lyr = arcpy.mapping.ListLayers (mxd, "merkezler") [0] dFids = {} dLabels = {} fidKeys = {} arcpy.da.SearchCursor ilə (lyr, ["FID", "SHAPE @", "MUID"]) kursor kimi: FD, shp, imlecdəki LABEL üçün: XY = "% s% s"% (round (shp.firstPoint.X, 2), round ( shp.firstPoint.Y, 2)) fidKeys [FD] = XY əgər XY dLabels: dLabels [XY] + = (' n' + LABEL) dFids [XY] + = [FD] else: dLabels [XY] = LABEL dFids [XY] = [FD] def FindLabel ([FID]): f = int ([FID]) aKey = fidKeys [f] Fids = dFids [aKey] if f == Fids [0]: return dLabels [aKey ] qayıt "

Aşağıda qismən bir həll var.

Bu Advance etiket ifadəsinə daxil olur. Çox təsirli deyil, buna görə də məlumatlarınızdakı nöqtələrin sayı barədə soruşuram. Beləliklə etiketlənmiş hər sıra üçün 2 lüğət hazırlayırdburada açar XY, dəyəri mətn vəd2olan objectID və XY. Bu lüğətlərin birləşməsindən istifadə edərək yeni sətir simvolları ilə birləşmə olan bir etiketi qaytara bilər, mənim nümunəmdə TARGET_FID-ni birləşdirir. "sj" TOC-dəki qat adıdır.

idxal arcpy def FindLabel ([OBJECTID]): ob = str ([OBJECTID]) mxd = arcpy.mapping.MapDocument ("CURRENT") d = {} d2 = {} lyr = arcpy.mapping.ListLayers (mxd, "sj ") [0] arcpy.da.SearchCursor ilə (lyr, [" OID @ "," SHAPE @ XY "," TARGET_FID "]) kursor kimi: kursorda sıra üçün: objID = str (sıra [0]) temp = sıra [1] tup = str (temp [0]) + "," + str (temp [1]) d2 [objID] = tup txt = str (sıra [2]) əgər tup d: v = d [tup ] v = v + " n" + txt d [tup] = v başqa: d [tup] = txt temp = d2 [ob] qayıt d [temp]

Bunun niyə qismən həll olunması budur ki, bu, hər nöqtə üçün edilir, yığılmış nöqtələrin hamısını necə söndürəcəyinizi düşünə bilmədim. Buna görə düşünürəm ki, son həll nöqtələr yığınından tikilmiş bir etiketlə yeni tək nöqtələr qatını quran bəzi pitondur.

Aşağıda 3 yığılmış nöqtənin çıxışı var, çünki hər nöqtə üçün eyni yerdə olduqları üçün etiket yaradıldığını görə bilərsiniz.