Mehr

Können Etiketten für überlappende Punkte zu einem Etikett kombiniert/zusammengeführt werden?

Können Etiketten für überlappende Punkte zu einem Etikett kombiniert/zusammengeführt werden?


Ich habe Punkte, die Beispielstandorte darstellen. Häufig werden mehrere Proben am selben Ort genommen: mehrere Punkte mit demselben Ort, aber unterschiedlichen Proben-IDs und anderen Attributen. Ich möchte alle Punkte, die sich gemeinsam befinden, mit einem einzigen Label beschriften, mit gestapeltem Text, der alle Proben-IDs aller Punkte an dieser Stelle auflistet.

Ist dies in ArcGIS mit der regulären Beschriftungs-Engine oder Maplex möglich? Ich weiß, dass ich dies umgehen könnte, indem ich einen neuen Layer mit allen Beispiel-IDs für jeden Standort in einem Attributwert erstelle, aber ich möchte vermeiden, dass neue Daten nur für die Beschriftung erstellt werden.

Grundsätzlich möchte ich davon ausgehen:

Dazu (für den obersten Punkt):

Ohne manuelle Bearbeitung der Etiketten.


Eine Möglichkeit, dies zu tun, besteht darin, den Layer zu klonen, Definitionsabfragen zu verwenden und sie separat zu beschriften.

Fügen Sie dem Layer eine Ganzzahl vom Typ THEFIELD hinzu und füllen Sie ihn mit dem folgenden Ausdruck:

aList=[] def FirstOrOthers(shp): global aList key="%s%s" %(round(shp.firstPoint.X,3),round(shp.firstPoint.Y,3)) if key in aList: return 2 aList.append(key) return 1

Rufen Sie es an, indem Sie:

FirstOthers( !Form! )

Erstellen Sie eine Kopie des Layers im Inhaltsverzeichnis, wenden Sie die Definitionsabfrage THEFIELD=1 an.

Wenden Sie die Definitionsabfrage THEFIELD=2 für den ursprünglichen Layer an.

Wenden Sie verschiedene feste Etikettenplatzierungen an

UPDATE basierend auf Kommentaren zur ursprünglichen Lösung:

Fügen Sie das Feld COORD hinzu und füllen Sie es mit . aus

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

Fassen Sie dieses Feld mit first und last for label zusammen. Verknüpfen Sie diese Tabelle mit dem COORD-Feld wieder mit dem Original. Wählen Sie Datensätze aus, bei denen der erste<>letzte ist, und verketten Sie das erste und letzte Label in einem neuen Feld mit

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

Verwenden Sie Count_COORD und THEFIELD, um 2 "verschiedene Ebenen" und Felder zu definieren, um sie zu beschriften:

Update #2 inspiriert von @Hornbydd-Lösung:

import arcpy def FindLabel ([FID],[MUID]): f,m=int([FID]),[MUID] mxd = arcpy.mapping.MapDocument("CURRENT") dFids={} dLabels={} lyr = arcpy.mapping.ListLayers(mxd,"centres")[0] mit arcpy.da.SearchCursor(lyr,["FID","[email protected]","MUID"]) als Cursor: für Zeile im Cursor: FD,shp ,LABEL=row XY="%s %s" %(round(shp.firstPoint.X,2),round( shp.firstPoint.Y,2)) if f == FD: aKey=XY try: L=dFids [XY] L+=[FD] dFids[XY]=LL=dLabels[XY] L=L+'
'+LABEL dLabels[XY]=L außer: dFids[XY]=[FD] dLabels[XY]=LABEL Labels=dLabels[aKey] Fids=dFids[aKey] if f == Fids[0]: return Labels geben "" zurück

UPDATE November 2016, hoffentlich letzte.

Der folgende Ausdruck wurde an 2000 Duplikaten getestet, funktioniert wie Charme:

mxd = arcpy.mapping.MapDocument("CURRENT") lyr = arcpy.mapping.ListLayers(mxd,"centres")[0] dFids={} dLabels={} fidKeys={} with arcpy.da.SearchCursor(lyr, ["FID","[email protected]","MUID"]) als Cursor: für FD,shp,LABEL im Cursor: XY="%s %s" %(round(shp.firstPoint.X,2),round( shp.firstPoint.Y,2)) fidKeys[FD]=XY wenn XY in dLabels: dLabels[XY]+=('
'+LABEL) dFids[XY]+=[FD] sonst: dLabels[XY]= LABEL dFids[XY]=[FD] def FindLabel ([FID]): f=int([FID]) aKey=fidKeys[f] Fids=dFids[aKey] if f == Fids[0]: Rückgabe dLabels[aKey ] Rückkehr "

Unten ist eine Teillösung.

Dies geht in den Advance-Label-Ausdruck ein. Es ist nicht sehr effizient, daher frage ich nach der Anzahl der Punkte in Ihrem Datensatz. Für jede Zeile, die beschriftet wird, werden also 2 Wörterbücher erstelltDwobei der Schlüssel das XY und der Wert der Text ist undd2Dies ist die Objekt-ID und das XY. Mit dieser Kombination von Wörterbüchern ist es in der Lage, ein einzelnes Label zurückzugeben, das eine Verkettung mit Zeilenumbruchzeichen ist, in meinem Beispiel ist es die Verkettung von TARGET_FID. "sj" ist der Layername im Inhaltsverzeichnis.

import arcpy def FindLabel ( [OBJECTID] ): ob = str([OBJECTID]) mxd = arcpy.mapping.MapDocument("CURRENT") d ={} d2 = {} lyr = arcpy.mapping.ListLayers(mxd,"sj ")[0] mit arcpy.da.SearchCursor(lyr,["[email protected]","[email protected]","TARGET_FID"]) als Cursor: für Zeile im Cursor: objID = str(row[0]) temp = row[1] tup = str(temp[0]) + "," + str(temp[1]) d2[objID] = tup txt = str(row[2]) wenn tup in d: v = d[tup ] v = v + "
" + txt d[tup] = v sonst: d[tup] = txt temp = d2[ob] zurück d[temp]

Warum dies eine Teillösung ist, ist, dass dies für jeden Punkt gemacht wird, ich konnte mir nicht ausdenken, wie Sie alle anderen gestapelten Punkte ausschalten würden. Aus diesem Grund denke ich, dass die ultimative Lösung eine Python ist, die eine neue Ebene einzelner Punkte mit einem einzigen Label aus dem Stapel von Punkten erstellt.

Unten sehen Sie die Ausgabe von 3 gestapelten Punkten, wie Sie sehen können, dass die Beschriftung für jeden Punkt erstellt wird, da sie alle an derselben Stelle vorhanden sind.