آموزش Field Calculator در ArcGIS Pro   www gisland org   ۰۹۱۲۰۴۳۸۸۷۴

نویسنده: دکتر سعید جوی زاده | مشاوره و آموزش تخصصی GIS: ۰۹۱۲۰۴۳۸۸۷۴

آموزش Field Calculator یکی از کاربردی‌ترین بخش‌های آموزش GIS است، زیرا تقریباً هیچ پروژه‌ای بدون محاسبه در جدول توصیفی به پایان نمی‌رسد. محاسبه مساحت قطعات، ساخت کد شناسایی، تبدیل واحدها، پاک‌سازی نام‌ها و طبقه‌بندی عوارض بر اساس یک شرط، همگی با ابزار Calculate Field انجام می‌شوند. کاربری که این ابزار را خوب بشناسد، کاری را که دیگران در چند ساعت و به‌صورت دستی انجام می‌دهند در چند ثانیه تمام می‌کند. در این مقاله محیط این ابزار در ArcGIS Pro و پانزده دستور پرکاربرد آن را مرور می‌کنیم. پرسشی داشتید؟ ۰۹۱۲۰۴۳۸۸۷۴

Field Calculator چیست و کجا قرار دارد؟

Field Calculator یا همان ابزار Calculate Field، مقدار یک فیلد را برای همه رکوردها یا رکوردهای انتخاب‌شده بر اساس یک عبارت محاسبه می‌کند. برای باز کردن آن در ArcGIS Pro، جدول توصیفی لایه را باز کنید، روی عنوان فیلد مورد نظر راست‌کلیک کنید و Calculate Field را بزنید. این ابزار از پنل Geoprocessing نیز در دسترس است و می‌توان آن را در ModelBuilder و اسکریپت‌های پایتون به کار برد.

در ArcGIS Pro سه زبان برای نوشتن عبارت وجود دارد: Python 3، Arcade و SQL. پایتون انعطاف‌پذیرترین گزینه است و در این مقاله بیشتر مثال‌ها با آن نوشته شده‌اند. Arcade زبان اختصاصی شرکت Esri است که در برچسب‌گذاری، پاپ‌آپ و نقشه‌های تحت وب نیز کاربرد دارد. SQL برای برخی منابع داده مانند ژئودیتابیس‌های سازمانی سرعت بالاتری دارد، ولی امکانات آن محدودتر است.

سه نکته حیاتی پیش از شروع

نخست اینکه نتیجه محاسبه روی داده اصلی نوشته می‌شود. اگر در حالت ویرایش نباشید، امکان بازگشت وجود ندارد؛ پس همیشه پیش از محاسبات مهم از لایه نسخه پشتیبان بگیرید یا نتیجه را در یک فیلد تازه بنویسید. دوم اینکه اگر رکوردهایی انتخاب شده باشند، محاسبه فقط روی همان‌ها انجام می‌شود؛ این ویژگی مفید است اما اگر فراموش کنید انتخابی فعال دارید، نتیجه ناقص می‌گیرید. سوم اینکه نوع فیلد باید با نتیجه عبارت سازگار باشد؛ نمی‌توان متن را در فیلد عددی نوشت و عدد اعشاری در فیلد صحیح گرد می‌شود.

در عبارت‌های پایتون نام فیلدها میان دو علامت تعجب قرار می‌گیرد، مانند !NAME!، و در Arcade به شکل $feature.NAME نوشته می‌شود. با دوبار کلیک روی نام فیلد در فهرست، نرم‌افزار خودش آن را با قالب درست وارد می‌کند و نیازی به تایپ دستی نیست.

دستورهای متنی

۱. ترکیب دو فیلد متنی

برای ساخت نشانی کامل از نام شهر و نام خیابان، دو فیلد را با علامت جمع و یک جداکننده به هم وصل کنید:

!CITY! + " - " + !STREET!

۲. تبدیل حروف به بزرگ یا کوچک

برای یکدست‌سازی نام‌های انگلیسی از متدهای upper، lower و title استفاده می‌شود:

!NAME!.upper()
!NAME!.title()

۳. حذف فاصله‌های اضافه

فاصله‌های ناخواسته ابتدا و انتهای متن باعث می‌شود اتصال جدول‌ها (Join) شکست بخورد. متد strip این مشکل را برطرف می‌کند:

!CODE!.strip()

۴. جایگزینی بخشی از متن

برای اصلاح دسته‌جمعی یک غلط املایی یا یکسان‌سازی حروف «ی» و «ک» عربی و فارسی که از مشکلات آشنای داده‌های فارسی است، متد replace به کار می‌آید:

!NAME!.replace("ي", "ی").replace("ك", "ک")

۵. استخراج بخشی از متن

اگر چهار رقم نخست یک کد نشان‌دهنده شهرستان باشد، با برش رشته می‌توان آن را جدا کرد. شماره‌گذاری در پایتون از صفر آغاز می‌شود:

!FULLCODE![0:4]

دستورهای عددی

۶. تبدیل واحد

برای تبدیل مساحت از مترمربع به هکتار کافی است مقدار را بر ده هزار تقسیم کنید:

!AREA_M2! / 10000

۷. گرد کردن اعداد

تابع round عدد را تا تعداد رقم اعشار دلخواه گرد می‌کند:

round(!AREA_HA!, 2)

۸. محاسبه تراکم و درصد

تراکم جمعیت از تقسیم جمعیت بر مساحت به دست می‌آید. اگر احتمال صفر بودن مخرج وجود دارد، حتماً از شرط استفاده کنید تا خطای تقسیم بر صفر رخ ندهد (به دستور ۱۲ مراجعه کنید):

!POP! / !AREA_KM2!

۹. شماره‌گذاری ترتیبی رکوردها

برای ساخت شماره ردیف یکتا، در بخش Code Block تابع زیر را بنویسید و در کادر عبارت آن را فراخوانی کنید:

rec = 0
def autonum():
    global rec
    rec += 1
    return rec

سپس در کادر عبارت بنویسید: autonum(). این روش برای ساخت کد شناسایی پیاپی بسیار رایج است.

دستورهای هندسی

۱۰. محاسبه مساحت و محیط

با شیء هندسه می‌توان مساحت را مستقیماً در واحد دلخواه گرفت. توجه کنید که لایه باید سیستم تصویر متری مانند UTM داشته باشد، وگرنه عدد به‌دست‌آمده معتبر نخواهد بود:

!shape.area@hectares!
!shape.length@kilometers!

برای لایه‌هایی با سیستم مختصات جغرافیایی می‌توان از مساحت ژئودزیک استفاده کرد که به شکل !shape.geodesicArea@hectares! نوشته می‌شود. ابزار جداگانه Calculate Geometry Attributes نیز همین کار را با رابط ساده‌تر انجام می‌دهد.

۱۱. استخراج مختصات مرکز عارضه

مختصات X و Y مرکز ثقل هر عارضه را می‌توان در دو فیلد عددی جداگانه نوشت:

!shape.centroid.X!
!shape.centroid.Y!

دستورهای شرطی

۱۲. طبقه‌بندی با شرط

پرکاربردترین استفاده از Code Block، طبقه‌بندی بر اساس مقدار یک فیلد است. برای نمونه، طبقه‌بندی شیب به سه کلاس:

def cls(s):
    if s is None:
        return "نامشخص"
    elif s < 5:
        return "کم"
    elif s < 15:
        return "متوسط"
    else:
        return "زیاد"

در کادر عبارت بنویسید: cls(!SLOPE!). دقت کنید تورفتگی خط‌ها در پایتون اهمیت دارد و باید یکدست باشد؛ ترکیب Tab و فاصله منشأ خطاهای رایجی است.

۱۳. مدیریت مقادیر خالی (Null)

مقادیر Null در پایتون با None شناخته می‌شوند و اگر در محاسبه وارد شوند خطا ایجاد می‌کنند. برای جایگزینی آن‌ها با صفر می‌توان نوشت:

0 if !POP! is None else !POP!

۱۴. شرط یک‌خطی

برای شرط‌های ساده نیازی به Code Block نیست و می‌توان از عبارت شرطی یک‌خطی استفاده کرد:

"شهری" if !POP! > 10000 else "روستایی"

دستور تاریخ

۱۵. ثبت تاریخ روز

برای ثبت زمان آخرین ویرایش در یک فیلد از نوع Date، ماژول datetime را به کار ببرید:

datetime.datetime.now()

همین کارها با Arcade

اگر با سرویس‌های آنلاین یا لایه‌های منتشرشده کار می‌کنید، Arcade انتخاب بهتری است. منطق همان است و تنها نگارش تفاوت دارد. ترکیب دو فیلد به شکل $feature.CITY + ” – ” + $feature.STREET نوشته می‌شود، گرد کردن با تابع Round و شرط با تابع IIf یا ساختار if انجام می‌گیرد. مزیت Arcade این است که عبارت نوشته‌شده را می‌توان بدون تغییر در برچسب‌ها، پاپ‌آپ‌ها و داشبوردها نیز استفاده کرد. فهرست توابع این زبان در مستندات Arcade در دسترس است.

خطاهای رایج و راه رفع آن‌ها

پیام خطای عمومی «ERROR 000539» معمولاً نشان می‌دهد عبارت پایتون مشکل نگارشی دارد یا مقدار Null وارد محاسبه شده است. متن کامل پیام را بخوانید؛ خط آخر آن دلیل دقیق را می‌گوید. اگر خطای نوع داده دریافت کردید، احتمالاً می‌خواهید متن را با عدد جمع کنید؛ در این حالت عدد را با تابع str به متن یا متن را با int و float به عدد تبدیل کنید.

اگر فیلد شما قابل انتخاب نیست یا محاسبه انجام نمی‌شود، بررسی کنید که لایه در برنامه دیگری باز نباشد، فیلد از نوع سیستمی مانند OBJECTID یا Shape_Area نباشد و جدول در حالت Join با جدول دیگری که نام فیلدها را تغییر می‌دهد قرار نداشته باشد. در شیپ‌فایل‌ها نام فیلد حداکثر ده نویسه است و حروف فارسی در نام فیلد توصیه نمی‌شود. برای نمایش درست متن‌های فارسی نیز باید کدگذاری فایل UTF-8 باشد.

توصیه مهم دیگر، آزمایش عبارت روی چند رکورد است. ابتدا سه یا چهار رکورد را انتخاب کنید، محاسبه را اجرا کنید و نتیجه را بررسی کنید. اگر درست بود، انتخاب را بردارید و عبارت را روی کل جدول اجرا کنید. همچنین می‌توانید با دکمه Export عبارت‌های پرکاربرد خود را ذخیره و در پروژه‌های بعدی بارگذاری کنید.

Field Calculator در QGIS

کاربران QGIS ابزار مشابهی به همین نام دارند که با زبان عبارت‌نویسی اختصاصی QGIS کار می‌کند. در آنجا مساحت با متغیر $area، طول با $length و شرط با ساختار CASE WHEN نوشته می‌شود. مفاهیم یکسان است و اگر منطق محاسبه را در یکی یاد بگیرید، انتقال به دیگری دشوار نخواهد بود. راهنمای آموزش کاربردی QGIS برای شروع مناسب است.

کاربرد Field Calculator در پروژه‌های واقعی

در پروژه‌های کاداستر و ممیزی املاک، کد نوسازی هر قطعه از ترکیب کد منطقه، بلوک و شماره ملک ساخته می‌شود و این کار برای ده‌ها هزار قطعه تنها با یک عبارت ترکیب متن انجام می‌گیرد. در مطالعات آمایش سرزمین، پس از هم‌پوشانی لایه‌های شیب، خاک و کاربری، توان هر واحد زمین با یک تابع شرطی چندمرحله‌ای تعیین می‌شود. در پروژه‌های شبکه آب و برق، طول هر خط لوله یا کابل محاسبه و بر اساس قطر یا ولتاژ دسته‌بندی می‌شود تا برآورد هزینه نگهداری ممکن شود.

در آماده‌سازی داده برای تحلیل‌های چندمعیاره نیز این ابزار نقش اصلی دارد. امتیازدهی به طبقات هر معیار، نرمال‌سازی مقادیر میان صفر و یک و محاسبه امتیاز نهایی از حاصل‌جمع وزنی چند فیلد، همگی عبارت‌هایی یک‌خطی هستند. برای نمونه، اگر سه فیلد امتیاز با وزن‌های متفاوت داشته باشید، امتیاز نهایی از ضرب هر فیلد در وزن خود و جمع آن‌ها به دست می‌آید. نوشتن این فرمول در جدول، به‌جای انتقال داده به اکسل و برگرداندن آن، هم سریع‌تر است و هم خطر جابه‌جایی رکوردها را از بین می‌برد.

اگر لازم است چند فیلد را هم‌زمان محاسبه کنید، ابزار Calculate Fields که به‌صورت جمع نوشته می‌شود، امکان تعریف چند عبارت برای چند فیلد را در یک اجرا می‌دهد. این ابزار برای جدول‌های بزرگ سریع‌تر عمل می‌کند، چون جدول فقط یک بار خوانده و نوشته می‌شود. در جدول‌های چندصدهزار رکوردی، خاموش کردن موقت نمایش لایه و اجرای محاسبه بیرون از حالت ویرایش نیز سرعت را بالا می‌برد. همچنین هر محاسبه در تاریخچه ژئوپراسسینگ پروژه ثبت می‌شود و می‌توانید بعدها آن را دوباره اجرا یا به‌عنوان قطعه کد پایتون کپی کنید؛ عادتی که مستندسازی روش کار را بسیار ساده می‌کند.

تمرین پیشنهادی

برای تثبیت مطالب، یک لایه پلیگونی از بخش‌ها یا دهستان‌های یک شهرستان بردارید و این مراحل را انجام دهید: یک فیلد عددی اعشاری بسازید و مساحت را به کیلومترمربع حساب کنید؛ فیلد دیگری برای تراکم جمعیت اضافه کنید؛ با Code Block تراکم را به سه طبقه کم، متوسط و زیاد تقسیم کنید؛ و در پایان یک کد شناسایی ترکیبی از کد شهرستان و شماره ردیف بسازید. انجام همین تمرین کوتاه، بیشتر دستورهای این مقاله را پوشش می‌دهد.

مستندسازی محاسبات جدول

هر محاسبه‌ای که در جدول انجام می‌دهید بخشی از روش کار شماست و باید قابل بازگویی باشد. شش ماه بعد، هنگامی که کارفرما یا داور می‌پرسد فیلد امتیاز نهایی چگونه به دست آمده، حافظه پاسخ‌گو نخواهد بود. برای هر فیلد محاسباتی، عبارت استفاده‌شده، تاریخ و هدف آن را در یک فایل متنی کنار پروژه یا در بخش توضیحات فیلد بنویسید. در ژئودیتابیس می‌توانید برای هر فیلد نام مستعار گویا تعریف کنید تا معنای آن برای دیگران روشن باشد؛ نامی مانند تراکم جمعیت در هکتار بسیار گویاتر از یک نام کوتاه‌شده مبهم است. اگر محاسبه چندمرحله‌ای است، آن را در ModelBuilder قرار دهید تا هم مستند تصویری داشته باشید و هم امکان اجرای دوباره. این عادت در کار تیمی اهمیت دوچندان دارد، زیرا همکار شما باید بتواند بدون پرسیدن از شما منطق جدول را بفهمد و کار را ادامه دهد. مستندسازی زمان اندکی می‌گیرد، اما از دوباره‌کاری‌های پرهزینه پیشگیری می‌کند.

پرسش‌های متداول

آیا می‌توان محاسبه را به حالت قبل برگرداند؟

اگر ویرایش‌ها را ذخیره نکرده باشید، در ArcGIS Pro با دکمه Undo امکان بازگشت وجود دارد. پس از ذخیره، بازگشت ممکن نیست؛ به همین دلیل تهیه نسخه پشتیبان همیشه توصیه می‌شود.

برای استفاده از Field Calculator باید پایتون بلد باشیم؟

برای محاسبات ساده خیر. اما دانستن مبانی پایتون، مانند رشته‌ها، شرط‌ها و توابع، توانایی شما را چند برابر می‌کند و مقدمه خوبی برای یادگیری ArcPy است.

تفاوت Calculate Field و Calculate Geometry چیست؟

Calculate Geometry Attributes فقط ویژگی‌های هندسی مانند مساحت، طول و مختصات را محاسبه می‌کند، در حالی که Calculate Field هر نوع عبارت متنی، عددی و منطقی را می‌پذیرد.

جمع‌بندی

تسلط بر Field Calculator سرعت و دقت کار با جدول توصیفی را دگرگون می‌کند. با همین پانزده دستور می‌توانید بیشتر نیازهای روزمره، از پاک‌سازی متن تا طبقه‌بندی شرطی و محاسبات هندسی، را پاسخ دهید. برای یادگیری پروژه‌محور این مبحث در کنار سایر مهارت‌های ArcGIS Pro و ثبت‌نام در دوره‌های آموزش GIS، با شماره ۰۹۱۲۰۴۳۸۸۷۴ تماس بگیرید.

مطالب مرتبط در GISLand

درباره نویسنده

این مقاله را دکتر سعید جوی زاده، مدرس و مشاور سیستم اطلاعات جغرافیایی در www.gisland.org نوشته است. برای دریافت مشاوره GIS، ثبت‌نام در دوره‌های آموزش GIS یا سفارش پروژه، همین حالا با شماره ۰۹۱۲۰۴۳۸۸۷۴ تماس بگیرید.

بدون دیدگاه

دیدگاهتان را بنویسید