ওভারল্যাপিং পয়েন্টগুলির জন্য লেবেলগুলি কি একটি লেবেলে একত্রিত / একত্রী করা যায়?


12

আমার কাছে নমুনা অবস্থানের প্রতিনিধিত্বকারী পয়েন্ট রয়েছে। প্রায়শই, একাধিক নমুনা একই স্থানে নেওয়া হবে: একই অবস্থানের সাথে একাধিক পয়েন্ট তবে বিভিন্ন নমুনা আইডি এবং অন্যান্য বৈশিষ্ট্য। আমি সেই দফার সমস্ত পয়েন্টের সমস্ত নমুনা আইডি তালিকাভুক্ত স্ট্যাকযুক্ত পাঠ্য সহ একক লেবেলের সাথে সহ-অবস্থিত সমস্ত পয়েন্টকে লেবেল করতে চাই।

নিয়মিত লেবেলিং ইঞ্জিন বা ম্যাপ্লেক্স ব্যবহার করে আরকিজিআইএস-এ এটি কি সম্ভব? আমি জানি যে আমি প্রতিটি বৈশিষ্ট্যের জন্য একটি বৈশিষ্ট্যের মানতে প্রতিটি অবস্থানের জন্য সমস্ত নমুনা আইডি সহ একটি নতুন স্তর তৈরি করে এটিকে ঘিরে কাজ করতে পারি তবে আমি কেবল লেবেলিংয়ের জন্য নতুন ডেটা তৈরি করা এড়াতে চাই।

মূলত আমি এ থেকে যেতে চাই:

এখানে চিত্র বর্ণনা লিখুন

এটি (শীর্ষস্থানীয় পয়েন্টের জন্য):

এখানে চিত্র বর্ণনা লিখুন

লেবেলগুলির কোনও ম্যানুয়াল সম্পাদনা না করে।


আপনার ডেটাসেটে কয়টি পয়েন্ট রয়েছে?
হর্নবিড্ড

উত্তর:


11

এটি করার একটি উপায় হ'ল স্তরটি ক্লোন করা, সংজ্ঞা প্রশ্নগুলি ব্যবহার করে এবং পৃথকভাবে লেবেল করা, প্রথম স্তরের উপরের-বামে কেবলমাত্র লেবেল অবস্থান এবং দ্বিতীয়টির জন্য নিম্ন-বাম ব্যবহার করা।

নীচে অভিব্যক্তি ব্যবহার করে স্তরটিতে এফআইএলডি টাইপ পূর্ণসংখ্যা যুক্ত করুন এবং এটি পপুলেট করুন:

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 প্রয়োগ করুন।

বিভিন্ন নির্দিষ্ট লেবেল বসানো প্রয়োগ করুন

এখানে চিত্র বর্ণনা লিখুন

মূল সমাধানের মন্তব্যের ভিত্তিতে আপডেট করুন:

ক্ষেত্রের কর্ড যুক্ত করুন এবং এটি ব্যবহার করে পপুলেট করুন

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

লেবেলের জন্য প্রথম এবং শেষ ব্যবহার করে এই ক্ষেত্রটি সংক্ষিপ্ত করুন। এই টেবিলটি মূলত COord ক্ষেত্রটি ব্যবহার করে যোগ দিন। রেকর্ডগুলি নির্বাচন করুন যেখানে প্রথম <<> ব্যবহার করে একটি নতুন ক্ষেত্রে প্রথম এবং শেষ লেবেল ব্যবহার করে last

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

2 'বিভিন্ন স্তর' এবং ক্ষেত্রগুলি তাদের লেবেল হিসাবে সংজ্ঞায়িত করতে গণনা_কোর্ড এবং THEFIELD ব্যবহার করুন:

এখানে চিত্র বর্ণনা লিখুন

@ হর্নবিডিডি সমাধান দ্বারা অনুপ্রাণিত # 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, আশা করি শেষ।

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 "

আরে আপনি এটি ফাটল! নিস! আমি জানতাম যে সেখানে কেউ হুইসাই আউট ছিল! যেমনটি আমি প্রত্যাশা করেছিলাম এটি একটি খুব পুনরাবৃত্ত প্রক্রিয়া তাই একটি বড় ডেটাসেট চালান এবং লেবেলগুলি আঁকতে চিরকাল লাগে (ভাল এটি আমার পরীক্ষার ডেটাতে কার্যকর হয়েছিল)। আমি কয়েক লাইন প্রসারিত করে আপনার কোড শৈলীটি টুইট করেছি। আমি মিনিমালিস্টটি পাই, সমস্তগুলি এক লাইনে অনুসরণ করা শক্ত difficult
হর্নবিড্ড

1
সম্পাদনা করার জন্য ধন্যবাদ লেবেল (ইঞ্জিন?) আচরণের কারণে এই বাদামটি ক্র্যাক করা শক্ত ছিল। এটি ফাংশনগুলির সমস্ত পরামিতিগুলিকে স্ট্রিং হিসাবে বিবেচনা করে! এজন্য প্রথমে যদি এফ = ইনট ([এফআইডি]) ছাড়া কাজ না করে। গতি সম্পর্কে আমি কখনই এটি 50 পয়েন্টের বেশি সেটে ব্যবহার করতে পারি না। এটি স্ক্রিপ্টে রূপান্তর করতে হবে যা কেবলমাত্র দু'বার ডেটাসেটের মাধ্যমে নতুন ক্ষেত্রকে পপুলেট করে: ১) উভয় অভিধান সংকলন করতে অনুসন্ধান কার্সার, ২) তাদের কাছ থেকে পড়ার জন্য আপডেট কার্সর দ্রষ্টব্য: ট্রায়াল স্টেটমেন্টের পরে প্রথম 3 টি লাইন অপ্রচলিত হয়, সমাধান পোস্ট করার পরে I তারা নিরাপদে অপসারণ করা যেতে পারে উপলব্ধি।
ফেলিক্সআইপি

এফওয়াইআই আমি এতে ফিরে আসার সুযোগ পাইনি তবে আমি পরের সপ্তাহ বা তার মধ্যে আপনার সমাধানটিকে ঘূর্ণি দেওয়ার পরিকল্পনা করছি। পাইথন ছাড়া আরও একটি কাজ (যা আমি এই ক্ষেত্রে ব্যবহার করেছি) আছে, আমি সে সম্পর্কে একটি উত্তরও পোস্ট করব।
ড্যান সি

জিওনেটে এই পৃষ্ঠাটি জুড়ে এসেছিল । আমি বিশ্বব্যাপী অভিধানের চতুর ব্যবহারটি পছন্দ করেছি তারপরে এই প্রশ্নোত্তর সম্পর্কে চিন্তাভাবনা করেছি এবং এর সাথে একটি লিঙ্ক যুক্ত করেছি।
হর্নবিড্ড

@ হর্নবিড্ড হ্যাঁ, এটি রিচার্ডের থেকে সমস্ত কিছুর মতোই খুব স্মার্ট এবং বিস্তারিত এবং আমার (আমাদের) সমাধানে বিশাল পার্থক্য আনবে। একটিকে কয়েকটি প্রথম লাইন অন্তর্ভুক্ত করে আরও উন্নত করা যেতে পারে। তবে ওপি থেকে প্রাপ্ত প্রতিক্রিয়ার সময়ের উপর ভিত্তি করে মনে হয় তিনি আগ্রহ হারিয়ে ফেলেছেন, আমিও বিরক্ত করি না
ফেলিক্সআইপি

4

নীচে একটি আংশিক সমাধান দেওয়া হয়।

এটি অ্যাডভান্স লেবেল এক্সপ্রেশনতে যায়। এটি খুব দক্ষ নয় তাই আপনার ডেটাসেটে পয়েন্টের সংখ্যা সম্পর্কে জিজ্ঞাসা করছি। সুতরাং যে প্রতিটি সারিতে লেবেলযুক্ত এটির জন্য এটি দুটি অভিধান তৈরি করে dযেখানে কীটি এক্সওয়াই এবং মানটি পাঠ্য এবং d2যা অবজেক্টআইডি এবং এক্সওয়াই। অভিধানের সংমিশ্রণটি ব্যবহার করে এটি একটি একক লেবেল ফেরত দিতে সক্ষম যা নতুন লাইনের অক্ষরগুলির সাথে একত্রিতকরণ হয়, আমার উদাহরণে এটি TARGET_FID এর সাথে সংযুক্ত করে। "এসজে" টিওসি-র স্তরের নাম।

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.