ป้ายกำกับสำหรับจุดที่ทับซ้อนกันสามารถรวม / รวมเข้าด้วยกันได้หรือไม่


12

ฉันมีคะแนนที่เป็นตัวแทนของสถานที่ตัวอย่าง บ่อยครั้งที่จะมีการสุ่มตัวอย่างหลายตัวอย่างในสถานที่เดียวกัน: หลายจุดพร้อมตำแหน่งเดียวกัน แต่ ID ตัวอย่างที่แตกต่างกันและคุณลักษณะอื่น ๆ ฉันต้องการติดป้ายจุดทั้งหมดที่อยู่ร่วมกับป้ายกำกับเดียวโดยมีข้อความแบบเรียงซ้อนแสดงรายการรหัสตัวอย่างทั้งหมดของจุดทั้งหมดในจุดนั้น

เป็นไปได้ใน ArcGIS โดยใช้เครื่องมือการทำป้ายกำกับปกติหรือ Maplex? ฉันรู้ว่าฉันสามารถแก้ไขปัญหานี้ได้โดยการสร้างเลเยอร์ใหม่พร้อมรหัสตัวอย่างทั้งหมดสำหรับแต่ละสถานที่ด้วยค่าแอตทริบิวต์เดียว แต่ฉันต้องการหลีกเลี่ยงการสร้างข้อมูลใหม่เพียงเพื่อทำป้ายกำกับ

โดยทั่วไปฉันต้องการไปจากนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ถึงสิ่งนี้ (สำหรับจุดสูงสุด):

ป้อนคำอธิบายรูปภาพที่นี่

โดยไม่ต้องทำการแก้ไขฉลากด้วยตนเอง


มีกี่คะแนนในชุดข้อมูลของคุณ?
Hornbydd

คำตอบ:


11

วิธีหนึ่งในการทำเช่นนี้คือการโคลนเลเยอร์โดยใช้คิวรีคำจำกัดความและติดฉลากแยกต่างหากโดยใช้ตำแหน่งป้ายบนซ้ายเท่านั้นสำหรับเลเยอร์แรกและซ้ายล่างเป็นวินาที

เพิ่มจำนวนเต็มชนิด 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 เลือกระเบียนที่ภาคเรียน <> สุดท้ายและต่อกันเลเบลแรกและสุดท้ายในฟิลด์ใหม่โดยใช้

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

ใช้ Count_COORD และ THEFIELD เพื่อกำหนด 2 'เลเยอร์ที่แตกต่าง' และฟิลด์เพื่อติดป้ายกำกับ:

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต # 2 แรงบันดาลใจจากโซลูชัน @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]
  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 ""

อัปเดตพฤศจิกายน 2559 หวังว่าจะผ่านมา

ด้านล่างมีการทดสอบการแสดงผลซ้ำซ้อน 2,000 ครั้งทำงานเหมือนมีเสน่ห์:

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 "

เฮ้คุณแตกมัน! ดี! ฉันรู้ว่ามีใครบางคนที่กำลังดังกึกก้องอยู่ที่นั่น! อย่างที่ฉันคาดไว้มันเป็นกระบวนการที่ซ้ำซากมากดังนั้นให้รันบนชุดข้อมูลขนาดใหญ่และฉลากใช้เวลาในการวาดตลอดเวลา ฉันได้ปรับแต่งสไตล์โค้ดของคุณโดยการขยายบรรทัดไม่กี่บรรทัด ฉันพบว่ามินิมัลลิสต์ทั้งหมดอยู่ในบรรทัดเดียวยากที่จะติดตาม
Hornbydd

1
@Hornbydd ขอบคุณสำหรับการแก้ไข น็อตนี้ยากที่จะแตกเนื่องจากพฤติกรรมของฉลาก (เครื่องยนต์?) มันถือว่าพารามิเตอร์ฟังก์ชั่นทั้งหมดเป็นสตริง! นี่คือเหตุผลว่าทำไมก่อนถ้าไม่ทำงานโดยไม่มี f = int ([FID]) เกี่ยวกับความเร็วฉันจะไม่ใช้มันกับชุดที่มีคะแนนมากกว่า 50 คะแนน มันจะต้องถูกแปลงเป็นสคริปต์ที่เติมฟิลด์ใหม่โดยการผ่านชุดข้อมูลเพียงสองครั้ง: 1) เคอร์เซอร์ค้นหาเพื่อรวบรวมทั้งพจนานุกรม 2) เคอร์เซอร์อัปเดตที่จะอ่านจากพวกเขาหมายเหตุ: 3 บรรทัดแรกหลังจากลองใช้คำสั่งล้าสมัยแล้ว ตระหนักว่าพวกเขาสามารถลบออกได้อย่างปลอดภัย
FelixIP

FYI ฉันไม่ได้มีโอกาสกลับมาที่เรื่องนี้อีก แต่ฉันวางแผนที่จะให้ทางแก้ปัญหาของคุณในสัปดาห์หน้า นอกจากนี้ยังมีวิธีแก้ปัญหาอื่น (ที่ฉันใช้ในกรณีนี้) โดยไม่มี Python ฉันจะโพสต์คำตอบเกี่ยวกับเรื่องนั้นด้วย
Dan C

มาทั่วหน้านี้ใน geonet ฉันชอบการใช้พจนานุกรมระดับโลกอย่างชาญฉลาดจากนั้นจึงคิดถึงคำถามและคำตอบนี้และเพิ่มลิงก์เข้าไป
Hornbydd

@Hornbydd ใช่มันฉลาดและมีรายละเอียดเหมือนทุกอย่างจากริชาร์ดและจะสร้างความแตกต่างให้กับโซลูชันของเรา หนึ่งสามารถปรับปรุงเพิ่มเติมโดยการลบไม่กี่บรรทัดซึ่งรวมถึงคนแรกมาก อย่างไรก็ตามตามเวลาตอบสนองจาก OP ดูเหมือนว่าเขาจะหมดความสนใจฉันก็ไม่สนใจเช่นกัน
FelixIP

4

ด้านล่างเป็นวิธีแก้ปัญหาบางส่วน

สิ่งนี้จะเข้าสู่การแสดงออกของฉลากขั้นสูง มันไม่ได้มีประสิทธิภาพมากดังนั้นฉันถามเกี่ยวกับจำนวนคะแนนในชุดข้อมูลของคุณ ดังนั้นสำหรับแต่ละแถวที่มีป้ายกำกับมันจะสร้างพจนานุกรม 2 รายการdโดยที่คีย์คือ XY และค่าคือข้อความและd2ซึ่งเป็น objectID และ XY การใช้พจนานุกรมชุดนั้นสามารถส่งคืนป้ายกำกับเดียวซึ่งเป็นการเชื่อมต่อกับอักขระบรรทัดใหม่ตัวอย่างของฉันคือการต่อ TARGET_FID "sj" เป็นชื่อเลเยอร์ใน TOC

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]

เหตุใดนี่เป็นวิธีแก้ปัญหาบางส่วนก็คือมันทำสำหรับทุกจุดฉันไม่สามารถคิดได้ว่าคุณจะปิดจุดซ้อนกันอื่น ๆ ได้อย่างไร เป็นเพราะเหตุนี้ฉันคิดว่าทางออกที่ดีที่สุดคืองูหลามบางตัวที่สร้างเลเยอร์ใหม่ของจุดเดียวที่มีป้ายชื่อเดียวที่สร้างขึ้นจากสแต็กของจุด

ด้านล่างคือผลลัพธ์ของ 3 จุดที่ซ้อนกันตามที่คุณเห็นว่ามีการสร้างป้ายกำกับสำหรับแต่ละจุดตามที่มีอยู่ในตำแหน่งเดียวกัน

ตัวอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.