পাইথনের সাথে আরকজিআইএস ডেস্কটপ ব্যবহার করে অন্য অ্যাট্রিবিউটের পরিবর্তনের ভিত্তিতে নতুন অ্যাট্রিবিউট গণনা করছেন?


11

আমি বিভিন্ন বৈশিষ্ট্যের উপর ভিত্তি করে আচরণের মধ্যে জিপিএস টাইম-এনকোডড পয়েন্ট ডেটার একটি সেট শ্রেণিবদ্ধ করার চেষ্টা করছি।

আমি অবস্থানের উপর ভিত্তি করে 0 এবং বাড়ির জন্য 1 এর মতো একটি বৈশিষ্ট্য তৈরি করেছি এবং এখন বাড়ি থেকে দূরে ভ্রমণের সংখ্যাটি নির্ধারণ করতে চাই (পয়েন্টগুলির একটি সেট 01111111111110একটি ট্রিপ হবে কারণ এটি ঘরে বসে শুরু হয়েছিল)। আমি অ্যাট্রিবিউট ফিল্ডটি যুক্ত করেছি যাতে ট্রিপ নম্বর থাকবে, তবে ক্ষেত্রটি কীভাবে গণনা করতে হয় তা জানি না তাই এটি হোম / অ্যাওয়ে ফিল্ডের উপর ভিত্তি করে।

এখানে জিপিএস ডেটার একটি উদাহরণ রয়েছে (অপ্রাসঙ্গিক তথ্য নির্দেশ করতে "*" ব্যবহার করে এবং কেবল 1, 2, ইত্যাদি হিসাবে সূচীকরণের সময়গুলি), উপরে বর্ণিত "হোম / অ্যাভ" সূচক এবং কাঙ্ক্ষিত ট্রিপ সূচক, "ট্রিপ", যা আমার গুণতে হবে:

Time Lat Lon Home/Away Trip
   1   *   *         0    0
   2   *   *         1    1
   3   *   *         1    1
....
  12   *   *         1    1
  13   *   *         0    0
  14   *   *         0    0
  15   *   *         1    2
  16   *   *         1    2
.... 
  34   *   *         1    2
  35   *   *         0    0
  36   *   *         0    0
  37   *   *         1    3
....

আমার ডেটা সেটটি অ্যাট্রিবিউট টেবিলের প্রতিটি ট্রিপটিতে ম্যানুয়ালি যেতে এবং সংখ্যাটি নির্ধারণের জন্য খুব বড়, সুতরাং বাড়ি / দূরের বৈশিষ্ট্যটি কীভাবে অর্ডার করা হয় এবং প্রতিটি পয়েন্টের "ক্লাম্প" কে হিসাবে চিহ্নিত করা হয় তার ভিত্তিতে ক্ষেত্রটি গণনা করার কোনও উপায় আছে? হোঁচট?

এগুলি পাইথন কোডটির মতো দেখতে খালি হাড় (আমি কোড নিয়ে অভিজ্ঞ নই)।

এক্সপ্রেশন:

trip = Reclass(!home!)

উবুন্টুতে:

def Reclass(home):  
  if (home = 0):  
    return 0   
  elif (home = 1 and lastValue = 0):  
    return _(incremental numbering?)_  
  elif (home = 1 and lastValue = 1):  
    return lastValue  

ম্যাট উইল্কির প্রস্তাবিত স্ক্রিপ্টটি ব্যবহার করার পরে আমি কিছু পরিবর্তন করেছি যাতে আমার প্রথম ট্রিপটি 1 নম্বর হয়, আমার দ্বিতীয়টি 2, ইত্যাদি ইত্যাদি

এখানে ম্যাট এর কোডটি সংশোধন করা হয়েছে:

import arcpy
rows = arcpy.UpdateCursor("test2")

trip = 0
for row in rows:
    if row.home == 0:
        prev = row.home
        row.TRIP = trip
        rows.updateRow(row)

    elif row.home == 1 and prev == 0:
        trip += 1
        prev = row.home
        row.TRIP = trip
        rows.updateRow(row)
        rows.next()

    elif row.home == 1 and prev == 1:
        prev = row.home
        row.TRIP = trip
        rows.updateRow(row)
        rows.next()

    row.TRIP = trip
    rows.updateRow(row)


del row, rows

তারপরে আমি কেবল বাড়ির জন্য বেছে নেব = 0 এবং আমার ট্রিপ ফিল্ডটি 0 এ ফিরে গণনা করুন খুব সুন্দরভাবে অর্ডার করা ভ্রমণের।

উত্তর:


12

এর জন্য আপনি আপডেটকসার ব্যবহার করতে পারেন , যা বৈশিষ্ট্য শ্রেণি বা টেবিলটি খোলে এবং প্রতিটি রেকর্ড (সারি) ক্রমান্বয়ে ধাপে ধাপে।

নীচের স্ক্রিপ্টটি এই পরীক্ষার ডেটাতে কাজ করে

+-----------------------+
| Time| Home_Away|Trip  |
+-----|----------|------+
|  1  |  0       | <nul>|
|  2  |  1       | <nul>|
|  4  |  1       | <nul>|
|  5  |  0       | <nul>|
|  6  |  0       | <nul>|
|  7  |  1       | <nul>|
|  9  |  1       | <nul>|
| 12  |  1       | <nul>|
| 13  |  0       | <nul>|
+-----------------------+

import arcpy
fc = r'D:\s\py\pyscratch.gdb\gps_points'

# open the feature class and create the cursor
rows = arcpy.UpdateCursor(fc)

trip = 0
for row in rows:
    if row.HOME_AWAY == 0:
        trip += 1           # start of new trip, increment counter
        row.TRIP = trip     # calc the TRIP field to be current trip#
        rows.updateRow(row) # save
        print "Trip %s started at %s" % (trip, row.TIME)

    # keep cycling through records until HOME_AWAY is not 1
    while row.HOME_AWAY == 1:
        row.TRIP = trip
        rows.updateRow(row)
        rows.next() # move to next record

    # this is for the trailing end of a trip, the second 0
    # print "     %s ended at %s" % (trip, row.TIME)
    row.TRIP = trip
    rows.updateRow(row)

# remove programming objects and data locks
# the data itself is left alone
del row, rows

ট্রিপ ব্লকের শেষ প্রান্তটি আসলে একটি ট্রিপের শুরুতেও চালানো হয়, তবে যেহেতু ট্রিপ কাউন্টারটি সঠিকভাবে শুরু করে-ট্রিপ-সারিতে ডাবল ক্যালকের বিষয়টি বিবেচনা করে না। আমি কী বলতে চাইছি তা দেখতে সেই ব্লকের মুদ্রণ বিবৃতিটি কমেন্ট করুন।

পাইথন স্বয়ংক্রিয়ভাবে ব্লকের rows.next()শেষে একটি অন্তর্ভুক্ত যোগ করে for row in rows

এটি ডেটা অখণ্ডতা ধরে। যদি কোনও সারিতে ( 000বা 00000) শূন্য হোম / অ্যাওয়ে রেকর্ডগুলির মধ্যে কখনও বিজোড় সংখ্যা থাকে তবে তা গণ্ডগোল হবে । যে ট্রিপটি কেবল শুরু এবং স্টপ সমন্বিত থাকে তা ঠিক হওয়া উচিত , উদাহরণস্বরূপ 3 টি ট্রিপ সিকোয়েন্স 01..10 00 01..10, যেখানে স্পেসগুলি ভ্রমণের মধ্যবর্তী ফাঁকগুলি বোঝায়। অন্য কথায়, ফলাফলগুলি বৈধ করুন!


2
+1, আপনাকে একটি আপডেট কার্সারে এটি করতে হবে। ক্যালকুলেটফিল্ড সরঞ্জামটি গ্যারান্টি দেয় না যে কোড ব্লকটি একবারে চালিত হবে, সুতরাং tripভেরিয়েবলটি যেকোন স্বেচ্ছাসেবী সংখ্যার পুনরায় সূচনা হতে পারে।
জেসন শিয়েরার

এটি দুর্দান্ত কাজ করে যে আমার সমস্ত ট্রিপগুলিতে ভ্রমণের জন্য সমস্ত পয়েন্টের জন্য একটি নম্বর বরাদ্দ করা হয়েছে, তবে বাড়ির সমস্ত পয়েন্টকে একটি নতুন নম্বর দেওয়া হয় (অর্থাত আমার ডেটা বাড়ির পয়েন্টগুলি দিয়ে শুরু হয় এখন 1, 2, 3, সংখ্যাযুক্ত ..) ... 136 এবং তারপরে আমার প্রথম ট্রিপটিতে সমস্ত লেবেল রয়েছে 137)। এটি কোনও বড় বিষয় নয় কারণ আমি সমস্ত "হোম" পয়েন্টগুলি 0 তে ফিরিয়ে দিতে পারি, তবে আমার ট্রিপগুলি 1 থেকে শুরু হয়েছিল এবং এর পরে সমান সংখ্যায় থাকলে এটি দুর্দান্ত হবে। কোন পরামর্শ?
আলমাথম

@ অ্যালিস, আমি পরীক্ষা করিনি, তবে আপনাকে যা করতে হবে তা হ'ল row.TRIP = tripদুটি ব্লকের প্রত্যেকটির লাইন মন্তব্য করা বা মুছতে হবে যা ভ্রমণের শুরু এবং শেষের পরিচালনা করে। (এবং, এটি ভাবতে আসুন, rows.updateRow(row)যা অনুসরণ করে, কারণ সেখানে আর সংরক্ষণের মতো কিছুই নেই))
ম্যাট উইলকি

আড়াল বাছাই! আমার স্ক্রিপ্টটির এখন তিনটি অংশ রয়েছে:
AlmaThom

5

"ক্ষেত্রের উদাহরণগুলি গণনা করুন" এর অধীনে আর্কজিআইএস 10 সহায়তা আপনাকে কীভাবে "সংখ্যার ক্ষেত্রের জমে থাকা মান গণনা করতে হবে" তা দেখায়। এটি কৌশলটি করবে, শর্তিত ডেটা শারীরিকভাবে উদ্দেশ্যগত অস্থায়ী ক্রমে থাকে are

এটি সরাসরি প্রয়োগ করতে, আপনার [হোম / অ্যাওয়ে] সূচকটি উল্টান (এটি 1 থেকে বিয়োগ করুন) যাতে "0" এর অর্থ "দূরে" এবং "1" এর অর্থ "বাড়ি"। আমি নীচের উদাহরণে এটিকে [দূরে / হোম] বলি।

উদাহরণস্বরূপ এর संचयी মান গণনা করুন - [সংশ্লেষক]।

একটি যোগ করুন এবং দুটি দ্বারা ভাগ করুন - [ট্রিপ] উদাহরণে (প্রায়)।

অবশেষে, সমস্ত "হোম" রেকর্ডের জন্য [ট্রিপ] শূন্যে সেট করুন। এখন ফলাফল উদাহরণের সাথে একমত:

Time Lat Lon Home/Away Trip Away/Home Cumulative 
   1   *   *         0    0         1          1
   2   *   *         1    1         0          1
   3   *   *         1    1         0          1
.... 
  12   *   *         1    1         0          1
  13   *   *         0    0         1          2
  14   *   *         0    0         1          3
  15   *   *         1    2         0          3
  16   *   *         1    2         0          3
.... 
  34   *   *         1    2         0          3
  35   *   *         0    0         1          4
  36   *   *         0    0         1          5
  37   *   *         1    3         0          5
....

রেকর্ডের জন্য, এখানে আর্কজিআইএস 10 সহায়তা থেকে নেওয়া কোডটি। আমি এটিকে কিছুটা সংশোধন করেছি যাতে এটি প্রতিটি পদক্ষেপ একবারে করতে পারে: এখন আপনার কেবল এটি চালানো দরকার। এটি পরিষ্কার হওয়া উচিত যেখানে [হোম / এওয়ে] উল্টে যায় এবং যেখানে "1 যোগ করুন, 2 দ্বারা ভাগ করুন" পদক্ষেপটি ঘটে।

এক্সপ্রেশন:

acc(!Home/Away!)

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

PYTHON_9.3

কোড ব্লক:

t=0
def acc(i):
  global t
  if t:
    t += (1-i)
  else:
    t = 1
  if i:
    return (t+1)/2
  else:
    return 0

3
যে কোনও বড় সংখ্যক রেকর্ডের জন্য এটি কাজ করবে না। কোডব্লক প্রতি কয়েক লক্ষ সারিগুলিতে পুনরায় চালিত হয় (পুরো আবর্জনা সংগ্রহের চক্র সহ) সুতরাং tআপাতদৃষ্টিতে এলোমেলো স্থানে 0 এ পুনরায় সেট হবে।
জেসন শিয়েরার

2
ধন্যবাদ, @ জেসন: আমি এই বাগ সম্পর্কে সচেতন ছিলাম না। এটি আসল শো-স্টপার। <গলাবাজি> আমি ভেবেছিলাম ArcGIS তাই আপ স্কেল করার কথা ছিল যে বেশী সামান্য খেলনা সমস্যার জন্য এটা ভাল </ গলাবাজি>?
whuber

1
কোনও ত্রুটি নয়, এটি মেমরি ফাঁসকে হ্রাস করার চেষ্টা করার জন্য ভিবিএস স্ক্রিপ্ট বাস্তবায়ন থেকে উত্তরাধিকারসূত্রে প্রাপ্ত একটি বাস্তবায়ন বিশদ (ব্যবহারকারীরা প্রতিটি রেকর্ডের জন্য একটি তালিকার সাথে যুক্ত হন তবে বাস্তবে কখনই কোনও কিছুর জন্য তালিকাটি ব্যবহার করেন না)। আমি নিশ্চিত যে আমি 11 এ রিফ্রেশটি থেকে মুক্তি পেয়েছি কারণ এটি অ-স্পষ্ট আচরণ, তবে মনে নেই।
জেসন শিয়েরার

1
@ জেসন এটি আমার জন্য একটি নতুন শ্রুতিমধুরতা: "বাস্তবায়ন বিশদ"। অন্যান্য শ্রুতিমধুরতা হ'ল "বৈশিষ্ট্য" এবং "নথিভুক্ত আচরণ"। অন্য যে কোনও নামে গোলাপ ...
শুকনো

2
এখানে আমি এটি কীভাবে দেখছি, @ জেসন: সহায়তা পৃষ্ঠা নিজেই আমার উপস্থাপিত কোড সরবরাহ করে। সুতরাং, ESRI- র অংশটির একটি অন্তর্নিহিত দাবি রয়েছে যে কোডটি কাজ করে। আপনার মতে, এটি হয় না; প্রকৃতপক্ষে, আপনার বৈশিষ্ট্যের অধীনে এটি উল্লেখযোগ্যভাবে, নিঃশব্দে, সতর্কতা ছাড়াই এবং অনির্দেশ্য ব্যর্থ হতে পারে এটি কেবল একটি বাগ নয়, এটি বাগের সম্ভাব্যতমতম রূপ। একটি "পর্যায়ক্রমিক রিসেট" কোনও "স্থিরতা" নয়, এটি একটি ক্লুজ যা কেবল পরিস্থিতিকে আরও খারাপ করে তোলে আইএমএইচও।
whuber
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.