Suite

Les étiquettes des points qui se chevauchent peuvent-elles être combinées/fusionnées en une seule étiquette ?

Les étiquettes des points qui se chevauchent peuvent-elles être combinées/fusionnées en une seule étiquette ?


J'ai des points représentant des exemples d'emplacements. Souvent, plusieurs échantillons seront prélevés au même endroit : plusieurs points avec le même emplacement mais des ID d'échantillon et d'autres attributs différents. J'aimerais étiqueter tous les points qui sont co-localisés avec une seule étiquette, avec du texte empilé répertoriant tous les ID d'échantillon de tous les points de cet endroit.

Est-ce possible dans ArcGIS à l'aide du moteur d'étiquetage standard ou de Maplex ? Je sais que je pourrais contourner ce problème en créant une nouvelle couche avec tous les exemples d'ID pour chaque emplacement dans une valeur d'attribut, mais j'aimerais éviter de créer de nouvelles données uniquement pour l'étiquetage.

En gros je veux partir de ça :

À ceci (pour le point le plus haut):

Sans faire aucune édition manuelle des étiquettes.


Une façon de procéder consiste à cloner la couche, en utilisant des requêtes de définition et en les étiquetant séparément, en utilisant uniquement la position de l'étiquette en haut à gauche pour la première couche et en bas à gauche pour la seconde.

Ajoutez un entier de type THEFIELD au calque et remplissez-le à l'aide de l'expression ci-dessous :

aList=[] def FirstOrOthers(shp) : global aList key="%s%s" %(round(shp.firstPoint.X,3),round(shp.firstPoint.Y,3)) si la clé dans aList : return 2 aList.append(key) return 1

Appelez-le par :

PremierOuAutres( !Forme! )

Créez une copie de couche dans la table des matières, appliquez la requête de définition THEFIELD=1.

Appliquer la requête de définition THEFIELD=2 pour la couche d'origine.

Appliquer différents emplacements d'étiquettes fixes

MISE À JOUR basée sur les commentaires de la solution d'origine :

Ajoutez le champ COORD et remplissez-le en utilisant

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

Résumez ce champ en utilisant le premier et le dernier pour l'étiquette. Joignez cette table à l'original en utilisant le champ COORD. Sélectionnez les enregistrements où firs<>last et concaténez la première et la dernière étiquette dans un nouveau champ à l'aide de

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

Utilisez Count_COORD et THEFIELD pour définir 2 « couches différentes » et des champs pour les étiqueter :

Mise à jour #2 inspirée de la solution @Hornbydd :

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] avec arcpy.da.SearchCursor(lyr,["FID","[email protected]","MUID"]) comme curseur : pour la ligne du curseur : 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=dLabel[XY] L=L+'
'+LABEL dLabel[XY]=L sauf : dFids[XY]=[FD] dLabel[XY]=LABEL Labels=dLabels[aKey] Fids=dFids[aKey] if f == Fids[0] : renvoie les étiquettes renvoient ""

MISE À JOUR Novembre 2016, espérons-le dernier.

L'expression ci-dessous testée sur 2000 doublons fonctionne comme un charme :

mxd = arcpy.mapping.MapDocument("CURRENT") lyr = arcpy.mapping.ListLayers(mxd,"centres")[0] dFids={} dLabels={} fidKeys={} avec arcpy.da.SearchCursor(lyr, ["FID","[email protected]","MUID"]) comme curseur : pour FD,shp,LABEL dans le curseur : XY="%s %s" %(round(shp.firstPoint.X,2),round( shp.firstPoint.Y,2)) fidKeys[FD]=XY si XY dans dLabels : dLabels[XY]+=('
'+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 ] revenir "

Vous trouverez ci-dessous une solution partielle.

Cela va dans l'expression de l'étiquette Advance. Ce n'est pas très efficace, c'est pourquoi je demande le nombre de points dans votre ensemble de données. Donc, pour chaque ligne étiquetée, il crée 2 dictionnairesoù la clé est le XY et la valeur est le texte etd2qui est l'objectID et le XY. En utilisant cette combinaison de dictionnaires, il est capable de renvoyer une seule étiquette qui est une concaténation avec des caractères de nouvelle ligne, dans mon exemple, c'est la concaténation de TARGET_FID. "sj" est le nom de la couche dans la table des matières.

import arcpy def FindLabel ( [OBJECTID] ): ob = str([OBJECTID]) mxd = arcpy.mapping.MapDocument("CURRENT") d ={} d2 = {} lyr = arcpy.mapping.ListLayers(mxd,"sj ")[0] avec arcpy.da.SearchCursor(lyr,["[email protected]","[email protected]","TARGET_FID"]) comme curseur : pour la ligne dans le curseur : objID = str(row[0]) temp = row[1] tup = str(temp[0]) + "," + str(temp[1]) d2[objID] = tup txt = str(row[2]) si tup dans d: v = d[tup ] v = v + "
" + txt d[tup] = v else : d[tup] = txt temp = d2[ob] return d[temp]

La raison pour laquelle il s'agit d'une solution partielle est que cela est fait pour chaque point, je n'ai pas pu imaginer comment vous désactiveriez tous les autres points empilés. C'est pour cette raison que je pense que la solution ultime est un python qui crée une nouvelle couche de points uniques avec une seule étiquette construite à partir de la pile de points.

Vous trouverez ci-dessous la sortie de 3 points empilés, comme vous pouvez le voir, l'étiquette est créée pour chaque point car ils existent tous au même endroit.


Voir la vidéo: Kuinka Saada 2 Karkkipussia 15 Sentillä