আরকিপি বা মডেলবিল্ডার ব্যবহার করে পয়েন্ট লোকেশনগুলি মুভিং / অফসেটিং?


10

আমার কাছে একটি নন-জিওররিফারেন্সড সিএডি স্তর রয়েছে ( এই প্রশ্নটি দেখুন ) যাতে পাঠ্য টীকা বৈশিষ্ট্য রয়েছে। আমি পাঠ্যটিকে পয়েন্টে রূপান্তর করতে একটি মডেল তৈরি করেছি, তবে টীকাকে একটি পয়েন্ট ফিচার ক্লাসে রূপান্তরিত করার পরে, আমি দেখতে পাচ্ছি যে সিএডি পাঠ্য অ্যাঙ্কর পয়েন্টগুলি সিএডি পাঠ্যের কেন্দ্রের সাথে মিলিত হয় না (যেখানে পয়েন্টগুলি অন্তর্ভুক্ত)।

অতএব, আমি চাই programatically (ArcPy বা ModelBuilder ব্যবহার করে) [পদক্ষেপ] এর বর্তমান অবস্থান কোনো বৈশিষ্ট্যের আপেক্ষিক (ব-দ্বীপ X, Y) একটি মাপা x, y মান যে, আমি প্রদান করবে ব্যবহার করে।

এটি আমাকে জিআইএস পয়েন্টগুলি যেখানে রয়েছে সেগুলি সরিয়ে নেওয়ার অনুমতি দেবে, অফসেট সিএডি অ্যাঙ্কর পয়েন্টের পরিবর্তে।

আমি এই কাজটি কীভাবে সম্পাদন করতে পারি?


@ পলিজিও শ্যাপি @ XY IN 10.1 ব্যবহার করে একটি দুর্দান্ত উত্তর দিয়েছে তবে বর্তমানে আমি 10.0 চালাচ্ছি। কোন 10.0 ধারণা?

উত্তর:


17

এই কোডটি শ্যাপ @ এক্সওয়াই টোকেনটি ব্যবহার করে এটি করা উচিত যা আরকিজিআইএস 10.1-এ আরকিপি.ডি.অ্যাপডেটকার্সার সহ এসেছে ।

import arcpy
# Set some variables
fc = r"C:\temp\test.gdb\testFC"
fc2 = r"C:\temp\test.gdb\testFCcopy"
xOffset = 0.001
yOffset = 0.001
# Code to make a copy which will have its coordinates moved (and can be compared with original)
if arcpy.Exists(fc2):
    arcpy.Delete_management(fc2)
arcpy.Copy_management(fc,fc2)
# Perform the move
with arcpy.da.UpdateCursor(fc2, ["SHAPE@XY"]) as cursor:
    for row in cursor:
        cursor.updateRow([[row[0][0] + xOffset,row[0][1] + yOffset]])

কোডিং এখানে ব্যবহৃত প্যাটার্ন থেকে এসেছিলেন ArcPy ক্যাফে


ইসস! শপ @ এক্সওয়াইটি কেবলমাত্র 10.1-এ উপলব্ধ to এটি একটি দুর্দান্ত উত্তর (এগিয়ে যাওয়া), তবে আমি অপেক্ষা করতে যাচ্ছি এবং 10.0 এর জন্য কারও কোনও পরামর্শ আছে কিনা তা দেখতে যাচ্ছি। ধন্যবাদ!
RyanKDalton

এটি পড়ার জন্য কারও জন্য অনুরূপ প্রক্রিয়া সম্পর্কিত আরও তথ্য More এখনও 10.1। arcpy.wordpress.com/2013/06/07/disperse-overlapping-pPoint
দ্য জোন্স

এটি কি আসলে কোথাও মান নির্ধারণ করছে? এর আগে কখনও আপডেটকসার ব্যবহার হয়নি। সাধারণত আমি + = করি এবং তারপরে সারিটি আপডেট করি। অন্যথায় আমি কেবল আমার সংস্করণে আলাদা কিছু করি আপডেট কার্সারটি ['শেপ @ এক্স', 'শপ @ ওয়াই]] ব্যবহার করে যাতে আপনি সারিটি করার পরিবর্তে সারি [0] এবং সারি [1] হিসাবে অ্যাক্সেস করতে পারেন [0] ] [0] এবং সারি [0] [1]। আমার জন্য এটি পড়ার জন্য আরও কিছুটা সহজ ভাবেন।
Eseglem

হ্যাঁ, সারিগুলি আপডেট করার জন্য এটি একটি বৈধ উপায়। প্রকৃতপক্ষে, আমি কয়েক সপ্তাহ আগে অবধি আপডেটরে ()) তে পাস হওয়া কোনও মান দেখিনি। এটি আসলে জ্যামিতি আপডেট করার জন্য একটি উদাহরণ ছিল।
পল

আপনার উত্তর পলিজিওর জন্য অনেক ধন্যবাদ! কোডটি পরিবর্তন ছাড়াই কাজ করেছে বলে আমি আসলেই বেশ মুগ্ধ হয়েছিলাম। আমি আর্কজিআইএস ডেস্কটপ 10.6 চালাচ্ছি
রি মিনো

8

আমাকে আমার চূড়ান্ত সমাধানের দিকে নিয়ে যাওয়ার জন্য আমি @ আর্টওয়ার্ক 21কে কৃতিত্ব দিচ্ছি। আমি আসলে ArcGIS 10.0 অনলাইন সহায়তা নিবন্ধ "নামক একটি প্রায় সম্পূর্ণ স্ক্রিপ্ট পাওয়া হিসাব ফিল্ড উদাহরণ ," উপবিষয়শ্রেণীটি "এর অধীনে তালিকাভুক্ত কোড নমুনার-জ্যামিতি " এবং " একটি বিন্দু বৈশিষ্ট্য বর্গ জন্য, নামান এক্স 100 দ্বারা প্রতিটি বিন্দু তুল্য "

আমি মডেলবিল্ডার "গণনা ক্ষেত্র" সরঞ্জামের মধ্যে যে চূড়ান্ত স্ক্রিপ্টটি ব্যবহার করেছি তা হ'ল:

এক্সপ্রেশন:

shiftXYCoordinates(!SHAPE!,%ShiftX%,%ShiftY%)

যেখানে ShiftX এবং ShiftY হল পরিবর্তনশীল (পরামিতি হিসাবে) মডেলবিল্ডার ক্যানভাসে সংজ্ঞায়িত।

এক্সপ্রেশন প্রকার:

PYTHON_9.3

কোড ব্লক:

def shiftXYCoordinates(shape,x_shift,y_shift):
   point = shape.getPart(0)
   point.X += float(x_shift)
   point.Y += float(y_shift)
   return point

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

ShiftXY মডেল

এটি একটি কবজির মতো কাজ করেছে, আপনার ইনপুটটির জন্য আপনাকে সমস্ত ধন্যবাদ!


কলামে সঞ্চিত সারণীর অভ্যন্তরের মান অনুসারে বৈশিষ্ট্যটি স্থানান্তর করা কি সম্ভব?
লসবলটিকা

1
এটা করা উচিত. উপযুক্ত কলামগুলিতে কেবল শিফটএক্স এবং শিফটওয়্যার প্যারামিটারগুলি অর্পণ করুন।
রায়ানকডাল্টন

আপনি এখানে "আকৃতি" হিসাবে যা যাচ্ছেন তা নিয়ে আমি বিভ্রান্ত। আপনি আমাকে সাহায্য করতে পারেন দয়া করে?
jbchurchill

"এক্সপ্রেশন" এমন পরামিতিগুলি দেখায় যাগুলি shiftXYCoordinates () নামে কোড-ব্লক ফাংশনে পাস হচ্ছে। সুতরাং প্রথম প্যারামিটারটি হল শ্যাপ! এটি স্তর থেকে আকৃতি ক্ষেত্র।
রায়ানকডাল্টন

5

বৈশিষ্ট্যগুলির অবস্থানগুলি সরাতে আপনি এই ফিল্ড ক্যালকুলেটর স্ক্রিপ্টটিও ব্যবহার করতে পারেন :

def XYsetVALUE( shape, X_value, Y_value): 
  myMoveX = 0.001
  myMoveY = 0.001
  point = shape.getPart(0) 
  point.X = X_value + myMoveX
  point.Y = Y_value + myMoveY
  return point 

XYsetVALUE (! শেপ !, এক্স_কোর্ড !,! ওয়াই_কর্ড!)

উপরের ফাংশনটি ব্যবহার করে আপনি আপনার মডেলের মধ্যে একটি অতিরিক্ত গণনা ফিল্ড পদ্ধতি অন্তর্ভুক্ত করতে পারেন।


এটি করার একটি আকর্ষণীয় উপায়, আমি আসলে জানতাম না আপনি শেপ ফিল্ডে গণনা ফিল্ড করতে পারবেন। এটি হ'ল এটি করার সহজতম উপায় যদি এটি সমস্ত পয়েন্টের জন্য সেট অফসেট হয়। পয়েন্ট.এক্স + = মাইমোভেক্স এবং পয়েন্ট.ওয়াই + = ময়মোভওয়াই এর জন্য এক্স এবং ওয়াই স্থানাঙ্কে পাস করার প্রয়োজনের পরিবর্তে এটি করা সম্ভবত দ্রুত হবে।
eseglem

5

আমি সমাধানটি একটি নির্দিষ্ট দিক (কোণ) এবং একটি প্রদত্ত দূরত্বের দিকে স্থানান্তর / শিফট পয়েন্ট পয়েন্টে রূপান্তর করেছি।

দেখতে:

def shiftXYCoordinates(shape,angle,distance):
point = shape.getPart(0)
point.Y += distance * math.cos(math.radians(angle))
point.X += distance * math.sin(math.radians(angle))
return point

এবং আপনার পয়েন্ট বৈশিষ্ট্যগুলির জন্য (অথবা অবশ্যই একটি ধ্রুবক সহ) জন্য যদি আপনার একটি ক্ষেত্র "কোণ" থাকে তবে shiftXYCoordinates (! শেপ !, অ্যাঙ্গেল !, 5000) এর মতো ডাকা হবে। দশমিক ডিগ্রিতে কোণ দেওয়া উচিত। 0 টি "উপরে", 90 "ডানদিকে" স্থানান্তরিত হবে stri

চলার আগে ক্ষেত্রের নাম "শেপ" নির্বাচন করতে ভুলবেন না :)

(আর্কম্যাপ 10.0 এসপি 5 এ সমাধান পরীক্ষিত)


4

আপনি দেখতে পাচ্ছেন যে আপনি যখন কার্সার টোকেনগুলিতে অ্যাক্সেস পান তখন এটি 10.1 এ অনেক সহজ।

import arcpy
# Code to move features in copy of same dataset
fc = r"C:\temp\test.gdb\testFC"
fc2 = r"C:\temp\test.gdb\testFCcopy"
xOffset = 0.001
yOffset = 0.001
if arcpy.Exists(fc2):
    arcpy.Delete_management(fc2)
arcpy.Copy_management(fc, fc2)

shape = arcpy.Describe(fc2).ShapeFieldName

cursor = arcpy.UpdateCursor(fc2)
for row in cursor:    
    point = row.getValue(shape).getPart()
    row.setValue(shape, arcpy.Point(point.X + xOffset, point.Y + yOffset))
    cursor.updateRow(row) 

del point, row, cursor

2

এটি 10.0 এর জন্য কাজ করে:

# Featureclass here
FC = r'featureclass'

fcount = 0
shapefield = arcpy.Describe(FC).shapeFieldName
featureUpdate = arcpy.UpdateCursor(FC)
for f in featureUpdate:
    # Hard coded shifts but easy enough to set up a lookup function if needed
    sLon = 0.001
    sLat = 0.001
    # Optional but I like to count to see where it is at in the process
    if fcount % 1000 == 0:
        print('Updating feature %s...' %(fcount))
    # Get the original value
    cF = f.getValue(shapefield)
    cPNT = cF.getPart()
    # Create a new point with the shifted value
    sPNT = arcpy.Point(cPNT.X - sLon, cPNT.Y - sLAT)
    # Set the shapefield to the new point and update feature
    f.setValue(shapefield, sPNT)
    featureUpdate.updateRow(f)
    fcount += 1
del featureUpdate
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.