Answers:
一种方法是克隆该层,使用定义查询并分别对其进行标记,第一层仅使用左上角的标签位置,第二层使用左下角的位置。
将THEFIELD类型整数添加到图层并使用以下表达式填充它:
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
致电方式:
FirstOrOthers( !Shape! )
在目录中创建图层的副本,应用定义查询THEFIELD = 1。
对原始图层应用定义查询THEFIELD = 2。
应用不同的固定标签位置
根据对原始解决方案的评论进行更新:
添加字段COORD并使用填充
'%s %s' %(round( !Shape!.firstPoint.X,2),round( !Shape!.firstPoint.Y,2))
使用第一个和最后一个标签来汇总此字段。使用COORD字段将此表重新连接回原始表。选择以下记录:firs <> last并使用以下命令在新字段中串联第一个和最后一个标签
'%s\n%s' %(!Sum_Output_4.First_MUID!, !Sum_Output_4.Last_MUID!)
使用Count_COORD和THEFIELD定义2个“不同层”,并使用字段对其进行标记:
受@Hornbydd解决方案启发的更新#2:
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]
with arcpy.da.SearchCursor(lyr,["FID","SHAPE@","MUID"]) as cursor:
for row in 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]=L
L=dLabels[XY]
L=L+'\n'+LABEL
dLabels[XY]=L
except:
dFids[XY]=[FD]
dLabels[XY]=LABEL
Labels=dLabels[aKey]
Fids=dFids[aKey]
if f == Fids[0]:
return Labels
return ""
更新于2016年11月,希望持续进行。
下面的表达式在2000个重复项上进行了测试,其工作原理如下:
mxd = arcpy.mapping.MapDocument("CURRENT")
lyr = arcpy.mapping.ListLayers(mxd,"centres")[0]
dFids={}
dLabels={}
fidKeys={}
with arcpy.da.SearchCursor(lyr,["FID","SHAPE@","MUID"]) as cursor:
for FD,shp,LABEL in cursor:
XY='%s %s' %(round(shp.firstPoint.X,2),round( shp.firstPoint.Y,2))
fidKeys[FD]=XY
if XY in 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]
return "
以下是部分解决方案。
这进入Advance标签表达式。它不是很有效,因此我询问您数据集中的点数。因此,对于每条被标记的行,它都会构建2个字典d
,其中键是XY,值是文本,d2
并且是objectID和XY。使用字典的组合,可以返回单个标签,该标签是由换行符组成的串联,在我的示例中,它是TARGET_FID的串联。“ sj”是目录中的图层名称。
import arcpy
def FindLabel ( [OBJECTID] ):
ob = str([OBJECTID])
mxd = arcpy.mapping.MapDocument("CURRENT")
d ={}
d2 = {}
lyr = arcpy.mapping.ListLayers(mxd,"sj")[0]
with arcpy.da.SearchCursor(lyr,["OID@","SHAPE@XY","TARGET_FID"]) as cursor:
for row in cursor:
objID = str(row[0])
temp = row[1]
tup = str(temp[0]) + "," + str(temp[1])
d2[objID] = tup
txt = str(row[2])
if tup in d:
v = d[tup]
v = v + "\n" + txt
d[tup] = v
else:
d[tup] = txt
temp = d2[ob]
return d[temp]
为什么这是部分解决方案,是因为对每个点都执行了此操作,所以我还没有想到您将如何关闭所有其他堆叠的点。正因为如此,我认为最终的解决方案是一些python,该Python可以构建一个新的单点层,并使用从点堆叠中构建的单个标签。
下面是3个堆叠点的输出,您可以看到为每个点创建了标签,因为它们都存在于同一位置。