دستکاری داده های مکانی و جدولی -فصل 8
8.1معرفی
این فصل نگاهی دقیق تر به ماژول دسترسی به داده ArcPy داردarcpy.daبرای کار با داده ها این ماژول امکان کنترل جلسه ویرایش، عملیات ویرایش، پشتیبانی مکان نما، توابع تبدیل جداول و کلاس های ویژگی به و از آرایه های NumPy برای پردازش اضافی، و پشتیبانی از نسخه سازی و جریان های کاری مشابه را می دهد. این فصل بر مکان نماها تمرکز دارد که برای تکرار روی ردیف ها در جدول استفاده می شود. انواع مختلف مکان نما به جستجوی سوابق، اضافه کردن رکوردهای جدید و ایجاد تغییرات در رکوردهای موجود میپردازند. مکان نماهای جستجو عبارات پرس و جوی SQL را در پایتون انجام می دهند. این فصل همچنین اعتبار متن و نام فیلدها را پوشش می دهد.
8.2استفاده از مکان نما برای دسترسی به داده ها
در فصل 6، دیدید که چگونه می توان از توابع لیست برای تکرار بر روی مجموعه ای از مقادیر در یک لیست، از جمله کلاس های ویژگی، جداول، و فیلدها استفاده کرد. رویکرد مشابهی را می توان با مکان نما برای کار با ردیف های یک جدول استفاده کرد. مکان نما یک اصطلاح فناوری پایگاه داده برای دسترسی به مجموعه ای از رکوردها در یک جدول است. از نظر مفهومی، به روشی کار می کند که توابع لیست کار می کنند، جایی که مکان نما برای دستکاری لیستی از رکوردها استفاده می شود. از مکان نما می توان برای تکرار روی رکوردهای جدول یا درج رکوردهای جدید در جدول استفاده کرد. رکوردهای یک جدول به عنوان ردیف نامیده می شوند. در ArcGIS Pro، مکان نماها همچنین می توانند برای خواندن و نوشتن هندسه ها به و از رکوردها، ردیف به ردیف استفاده شوند.
سه نوع مکان نما وجود دارد: جستجو، درج و به روز رسانی. این نشانگرها دارای ویژگی های زیر هستند:
- مکان نما جستجو ردیف ها را بازیابی می کند. این نوع مکان نما، رکوردهای خاصی را بر اساس مقادیر مشخصه، مشابه انجام یک پرس و جو، پیدا می کند، و همچنین هندسه و مقادیر ویژگی همه رکوردها را می خواند.
- مکان نما درج ردیف ها را درج می کند. این نوع مکاننما، ردیفهای جدیدی را به جدول اضافه میکند، که سپس میتوان آن را با مقادیر ویژگیهای جدید و هندسه جدید پر کرد.
- مکان نما به روز رسانی ردیف ها را به روز می کند و حذف می کند. این نوع مکان نما مقادیر مشخصه موجود را تغییر می دهد یا ردیف هایی را از جدول حذف می کند.
هر نوع مکان نما توسط کلاس مربوطه ایجاد می شودarcpy.daمدول:arcpy.da.SearchCursor،arcpy.da.InsertCursor، وarcpy.da.UpdateCursor. هر سه مکان نما می توانند روی یک جدول، یک نمای جدول، یک کلاس ویژگی یا یک لایه ویژگی کار کنند. جدول 8.1 روش های مکان نما هر کلاس را توضیح می دهد. هر سه کلاس مکان نما یک شی مکان نما ایجاد می کنند که می تواند برای دسترسی به اشیاء ردیف استفاده شود. روش های پشتیبانی شده توسط شی مکان نما به نوع مکان نما ایجاد شده بستگی دارد.
کلاس مکان نما | روش | شرح |
da.SearchCursor | تنظیم مجدد () | مکان نما را به ردیف اول بازنشانی می کند |
da.InsertCursor | درج ردیف (ردیف) | یک شی ردیف را در جدول درج می کند |
da.UpdateCursor | deleteRow() | ردیف را از جدول حذف می کند |
تنظیم مجدد () | مکان نما را به ردیف اول بازنشانی می کند | |
updateRow (ردیف) | ردیف فعلی را با یک شی ردیف اصلاح شده به روز می کند |
توجه داشته باشید:علاوه بر کلاس های مکان نما که بخشی از ماژول دسترسی به داده ها هستند، ArcPy دارای توابع مکان نما نیز می باشدarcpy.SearchCursor()،arcpy.UpdateCursor()، وarcpy.InsertCursor(). کلاس های مکان نما در ماژول دسترسی به داده عملکرد بسیار بهتری نسبت به این توابع مکان نما ارائه می دهند که برای مجموعه داده های بزرگتر قابل توجه است. حتی اگر این توابع نشانگر ArcPy قدیمی هنوز کاربردی و معتبر هستند، استفاده از آنها ممنوع است. آنها فقط برای پشتیبانی از سازگاری عقب ارائه شده اند. توجه داشته باشید که این مکان نماهای قدیمی دارای نام یکسانی هستند که می تواند منجر به سردرگمی شود. کد شما باید از کلاس های مکان نما استفاده کندarcpy.daماژول (مثلاarcpy.da.SearchCursor، و نه توابع مکان نما ArcPy (به عنوان مثال،arcpy.SearchCursor()).
نشانگرها فقط در جهت رو به جلو حرکت می کنند. اگر یک اسکریپت باید چندین بار از طریق تکرار از داده ها عبور کند، مکان نما باید بازنشانی شود. نشانگرها میتوانند روی رکوردهای یک جدول با استفاده از a تکرار کنندبرایحلقه یا aدر حالی کهحلقه
توجه داشته باشید:در پایتون 2،جستجوی مکان نماوUpdateCursorکلاس ها نیز پشتیبانی می کنند.بعد()روشی برای بازیابی ردیف بعدی در خارج از یک حلقه. معادل آن در پایتون 3 داخلی پایتون استبعد()عملکرد. با این حال، هنگامی که از یک حلقه استفاده می کنید، نیازی به تنظیم تکرار با استفاده از این تابع نیست، زیرا هنگام استفاده از یک حلقه، این امر ضمنی است.
هر سه مکان نما دارای دو آرگومان لازم هستند: یک جدول ورودی و یک لیست (یا چند تایی) از نام فیلدها. مکان نماهای جستجو و به روز رسانی نیز چندین آرگومان اختیاری دارند. نحو کلی برای هر مکان نما به شرح زیر است:
arcpy.da.InsertCursor(in_table, field_names)
arcpy.da.SearchCursor(in_table, field_names, {where_clause},
{spatial_reference}، {explore_to_points}
{sql_clause})
arcpy.da.UpdateCursor(in_table, field_names, {where_clause},
{spatial_reference}، {explore_to_points}
{sql_clause})
هر سطر بازیابی شده از جدول با استفاده از مکان نما، به عنوان یک لیست (یا چند تایی) از مقادیر فیلد، به همان ترتیبی که توسطفیلد_نام هابحث و جدل. منطق زیربنایی این است که یک مکان نما تنظیم می شود تا روی تمام رکوردهای یک جدول تکرار شود اما فقط از چند فیلد خاص که برای یک کار خاص مورد نیاز است استفاده می کند. این ویژگی میزان پردازش مورد نیاز هنگام استفاده از مکان نما را محدود می کند.
در زیر نمونه ای از استفاده از مکان نما جستجو برای تکرار روی ردیف های جدول آورده شده است. در کد مثال،جستجوی مکان نماشیء ردیف های جدول را بازیابی می کند. آبرایحلقه روی ردیفهای جدول تکرار میشود و مقادیر مشخصه را برای یک فیلد مشخص چاپ میکند.
واردات کمان
fc = “C:/Data/study.gdb/roads”
مکان نما = arcpy.da.SearchCursor(fc، “STREET_NAME”)
برای ردیف در مکان نما:
print(“نام خیابان = {0}”.format(row[0]))
درفیلد_نام هاپارامتر ازجستجوی مکان نماکلاس به عنوان یک لیست یا چند نام فیلد به عنوان رشته مشخص می شود. با این حال، اگر فقط از یک فیلد استفاده شود، همانطور که در اینجا وجود دارد، می توان به جای آن از یک رشته استفاده کرد. بنابراین، هر دو”نام خیابان”و[“نام خیابان”]درست هستند. برای بیش از یک فیلد، استفاده از یک لیست (یا چند تایی) مورد نیاز است – به عنوان مثال،[“STREET_NAME”، “STREET_TYPE”].
یک لحظه فکر کنید چراردیف[0]در اینجا استفاده می شود و نه فقطردیف، حتی اگر فقط از یک فیلد برای تنظیم مکان نما استفاده شود. دلیل آن این است کهجستجوی مکان نماشی چندین مقدار را برمی گرداند. بنابراین، باید از شاخص صفر [0] برای به دست آوردن اولین (و تنها) عنصر تاپل استفاده کنید.
جدول ویژگی های کلاس ویژگی جاده ها در شکل نشان داده شده است.
نتیجه اسکریپت یک پرینت است که به شرح زیر است:
نام خیابان = قطره شبنم
نام خیابان = LION
نام خیابان = HARRIER MARSH
نام خیابان = POWELL
نام خیابان = WEST
نام خیابان = CLEAR LAKE
نام خیابان = MARC TAYLOR
…
کار با این مقادیر بعداً در این فصل مورد بررسی قرار می گیرد.
نشانگرها نیز پشتیبانی می کنندبابیانیه. آبابیانیه این مزیت را دارد که بسته شدن را تضمین می کند، قفل های داده را آزاد می کند و تکرار را بازنشانی می کند، صرف نظر از اینکه مکان نما با موفقیت کار کرد یا خیر. قفل های داده بعداً در این بخش مورد بررسی قرار می گیرند.
مثال قبلی با استفاده از aبابیانیه به صورت زیر کدگذاری می شود:
واردات کمان
fc = “C:/Data/study.gdb/roads”
با arcpy.da.SearchCursor (fc، “STREET_NAME”) به عنوان مکان نما:
برای ردیف در مکان نما:
print(“نام خیابان = {0}”.format(row[0]))
توجه داشته باشید:استفاده از aبابیانیه هنگام کار با مکان نما توصیه می شود و بیشتر نمونه های این کتاب از این روش استفاده می کنند.
کد زیر نحوه درج یک ردیف جدید را نشان می دهد. یک شی مکان نما با استفاده ازدرج مکان نماکلاس پس از ایجاد مکان نما،insertRow()متد برای درج مقادیری که سطر جدید شامل می شود استفاده می شود. کد به شرح زیر است:
واردات کمان
fc = “C:/Data/study.gdb/roads”
با arcpy.da.InsertCursor (fc، “STREET_NAME”) به عنوان مکان نما:
cursor.insertRow([“خیابان جدید”])
مقادیر جدید باید به صورت یک لیست یا چند تایی مشخص شوند، حتی اگر فقط از یک مقدار استفاده شود.
می توانید چندین ردیف را با استفاده از یک حلقه وارد کنید، به شرح زیر:
با arcpy.da.InsertCursor (fc، “STREET_NAME”) به عنوان مکان نما:
x = 1
در حالی که x <= 5:
cursor.insertRow([“خیابان جدید”])
x += 1
به طور پیش فرض، ردیف های جدید در پایین جدول درج می شوند. فیلدهایی در جدول که در مکان نما گنجانده نشده اند، مقدار پیش فرض فیلد را به خود اختصاص می دهند. به طور معمول، این مقدار “تهی” خواهد بود، اما این مقدار با فرمت پایگاه داده متفاوت است و هر مقدار پیش فرض تنظیم شده با استفاده از دامنه ها نیز اعمال خواهد شد.
توجه داشته باشید که در این حالت مکان نما درج ردیف های جدیدی اضافه می کند و مقادیر ویژگی های جدید را در فیلد مشخص شده می نویسد، اما هندسه جدیدی ایجاد نمی شود. فصل 9 به هندسه های نوشتاری می پردازد.
مکان نما به روز رسانی ردیف را در موقعیت فعلی مکان نما به روز می کند یا حذف می کند. درupdateRow()روش ردیف را به روز می کند. پس از بازیابی شی ردیف از مکان نما، ردیف در صورت نیاز اصلاح می شود و ردیف اصلاح شده با فراخوانی به جدول ارسال می شود.updateRow()روش.
در مثال زیر، شی مکان نما با استفاده ازUpdateCursorکلاس دربرایحلقه، مقادیر یک فیلد (Acres) در ردیف با استفاده از مقادیر یک فیلد دیگر (Shape_Area) به روز می شود. اگر قسمت Shape_Area بر حسب فوت مربع باشد، مقدار باید بر 43560 تقسیم شود تا مساحت بر حسب هکتار به دست آید. ردیف با استفاده از به روز رسانی می شودupdateRow()متد روی شی ردیف
واردات کمان
fc = “C:/Data/study.gdb/zones”
با arcpy.da.UpdateCursor(fc, [“ACRES”, “SHAPE_AREA”]) به عنوان مکان نما:
برای ردیف در مکان نما:
ردیف[0] = ردیف[1] / 43560
cursor.updateRow(ردیف)
در اینجا هنگام تنظیم شی مکان نما از دو فیلد استفاده می شود. در کد مثال،ردیف[0]به فیلد اول اشاره دارد (“هکتار“)وردیف[1]به فیلد دوم اشاره دارد (“SHAPE_AREA“). ارزش جدید ازردیف[0]با استفاده از مقدار موجود محاسبه می شودردیف[1]. هر مقدار موجود در فیلد Acres بازنویسی خواهد شد.
توجه داشته باشید:همین نتایج را می توان با استفاده از ابزار Calculate Field به دست آورد که نیازی به استفاده از مکان نما ندارد. کد مثال به سادگی استفاده از مکان نما به روز رسانی را برای کار با چندین فیلد نشان می دهد، که می تواند در سناریوهای دیگری اعمال شود که در آنها محاسبه فیلد ممکن است کافی نباشد.
درdeleteRow()متد ردیف را در موقعیت فعلی حذف می کندUpdateCursor. پس از اینکه مکان نما شی ردیف را بازیابی کرد، آن را فراخوانی کردdeleteRow()متد ردیف را به صورت زیر حذف می کند:
واردات کمان
fc = “C:/Data/study.gdb/roads”
با arcpy.da.UpdateCursor (fc، “STREET_NAME”) به عنوان مکان نما:
برای ردیف در مکان نما:
if row[0] == “MAIN ST”:
cursor.deleteRow()
درج و به روز رسانی مکان نماها از عملیات ویرایش پشتیبانی می کند و در نتیجه، هنگام ایجاد شی مکان نما، یک قفل روی جدول تنظیم می شود. قفل داده ها از تغییر همزمان چندین فرآیند در یک جدول در دو برنامه مختلف جلوگیری می کند. دو نوع قفل وجود دارد: مشترک و انحصاری. زمانی که به جدول یا مجموعه داده دسترسی پیدا می شود، قفل مشترک اعمال می شود. به عنوان مثال، باز کردن یک کلاس ویژگی در ArcGIS Pro و انجام یک پرس و جو منجر به یک قفل مشترک در مجموعه داده می شود. چندین قفل مشترک می توانند وجود داشته باشند، اما اگر قفل مشترکی وجود داشته باشد، هیچ قفل انحصاری مجاز نیست. یک قفل انحصاری زمانی اعمال می شود که تغییراتی در جدول یا مجموعه داده ایجاد می شود. به عنوان مثال می توان به ویرایش و ذخیره یک کلاس ویژگی در ArcGIS Pro، تغییر طرح یک جدول یا کلاس ویژگی در ArcGIS Pro، و استفاده از مکان نما یا به روز رسانی مکان نما در کلاس ویژگی در پایتون اشاره کرد.
درج و بهروزرسانی مکاننماها، یک قفل انحصاری را برای یک جدول یا کلاس ویژگی اعمال میکند و از ایجاد تغییرات در سایر فرآیندها جلوگیری میکند. علاوه بر این، در صورت وجود یک قفل انحصاری، نمیتوان مکاننماها را درج و بهروزرسانی کرد. به عنوان مثال، دو اسکریپت نمی توانند به طور همزمان یک مکان نما را در یک مجموعه داده ایجاد کنند یا به روز کنند.
هنگامی که یک اسکریپت یک قفل انحصاری ایجاد می کند، قفل ادامه می یابد تا زمانی که اسکریپت قفل را آزاد کند. قفل را می توان به چند روش آزاد کرد:
گزینه 1: با استفاده از مکان نما در داخل aبابیانیه ای که بسته شدن و آزادسازی قفل های پایگاه داده را تضمین می کند. این رویکرد توصیه شده است.
گزینه 2: حذف مکان نما به صراحت با استفاده از aدلبیانیه.
گزینه 3: فراخوانیتنظیم مجدد ()روش بر روی مکان نما، که برایجستجوی مکان نماوUpdateCursorکلاس هایarcpy.da.
هر یک از این رویکردها با مثال هایی نشان داده شده است. در اینجا مثال قبلی با استفاده از a استبابیانیه:
واردات کمان
fc = “C:/Data/study.gdb/roads”
با arcpy.da.InsertCursor (fc، “STREET_NAME”) به عنوان مکان نما:
cursor.insertRow([“خیابان جدید”])
همین مثال با استفاده از aدلبیانیه به شرح زیر است:
واردات کمان
fc = “C:/Data/study.gdb/roads”
مکان نما = arcpy.da.InsertCursor(fc، “STREET_NAME”)
cursor.insertRow([“خیابان جدید”])
نشانگر
بدوندلدر بیانیه، یک قفل می تواند بدون نیاز به سایر برنامه ها یا اسکریپت ها دسترسی به مجموعه داده را مسدود کند. دردلهنگامی که مکان نما در داخل a استفاده می شود، دستور لازم نیستبابیانیه.
یک خطای رایج این است که شامل شوددلعبارت داخل یک تکرار قبلی، که متغیر را قبل از تکمیل تکرار روی تمام سطرها حذف می کند. به مثال زیر توجه کنید:
واردات کمان
fc = “C:/Data/study.gdb/roads”
مکان نما = arcpy.da.UpdateCursor(fc، “STREET_NAME”)
برای ردیف در مکان نما:
if row[0] == “MAIN ST”:
cursor.deleteRow()
نشانگر
در این مثال،دلعبارت تورفتگی دارد و بنابراین متغیر مکان نما پس از اولین تکرار حذف می شود. اسکریپت صحیح به شرح زیر است:
واردات کمان
fc = “C:/Data/study.gdb/roads”
مکان نما = arcpy.da.UpdateCursor(fc، “STREET_NAME”)
برای ردیف در مکان نما:
if row[0] == “MAIN ST”:
cursor.deleteRow()
نشانگر
توجه داشته باشید:اگر از a استفاده نمی کنیدبابیانیه، فراموش کردن استفاده ازدلعبارت در انتهای یک اسکریپت می تواند منجر به خطا شود، بنابراین مطمئن شوید که آن را پس از استفاده از مکان نماها درج و به روز کنید. با استفاده ازدلبعد از استفاده از مکان نماهای جستجو نیازی به بیانیه نیست زیرا منجر به قفل انحصاری نمی شود.
همان مثال با استفاده ازتنظیم مجدد ()روش به شرح زیر است:
واردات کمان
fc = “C:/Data/study.gdb/roads”
مکان نما = arcpy.da.UpdateCursor(fc، “STREET_NAME”)
برای ردیف در مکان نما:
if row[0] == “MAIN ST”:
cursor.deleteRow()
cursor.reset()
درتنظیم مجدد ()روش فقط برای جستجو و بهروزرسانی مکاننماهای موجود استarcpy.da. مکان نما را به ردیف اول بازنشانی می کند. این تنظیم مجدد امکان انجام یک تکرار دوم را با استفاده از مکان نما مشابه فراهم می کند. این کار رایج نیست زیرا بیشتر کارها فقط به یک تکرار نیاز دارند.
8.3استفاده از عبارات SQL در پایتون
یکی از رایج ترین مراحل پردازش در ژئوپردازش، اعمال یک پرس و جو با استفاده از زبان پرس و جو ساخت یافته (SQL) است. SQL یک یا چند معیار را بر اساس ویژگی ها، عملگرها و محاسبات تعریف می کند. به عنوان مثال، SQL در ابزارهای geoprocessing ArcGIS Pro مانند ابزار Select و ابزار Select Layer By Attributes استفاده می شود.
توجه داشته باشید:فرض بر این است که شما با نوشتن عبارات SQL در ArcGIS Pro آشنا هستید. عبارات SQL برای ایجاد پرس و جوهای انتخاب در ArcGIS Pro استفاده می شود. اصول کار با SQL را می توان در صفحات راهنما ArcGIS Pro، تحت عناوین “Write a Query in Query Builder” و “SQL Reference for Query Expressions مورد استفاده در ArcGIS” یافت.
پرس و جوهای SQL را می توان در پایتون با استفاده ازجستجوی مکان نماکلاس نحو برایجستجوی مکان نماکلاس به شرح زیر است:
arcpy.da.SearchCursor(in_table, field_names {where_clause},
{spatial_reference}، {fields}،
{explode_to_points}، {sql_clause})
اختیاریWhere_clauseپارامتر از یک عبارت SQL تشکیل شده است. نحو SQL بسته به نوع مجموعه داده مورد پرسش میتواند کمی متفاوت باشد و زمانی که SQL در پارامترهای مکاننما جستجو استفاده میشود، قوانین نحوی مشابه اعمال میشود.
توجه داشته باشید:عبارات SQL به مکان نماهای جستجو محدود نمی شود و در ابزارهایی مانند Select استفاده می شود. مثال های این بخش در مورد نحوه نوشتن عبارات SQL را می توان با هر ابزاری که از a استفاده می کند استفاده کردWhere_clauseپارامتر.
کد زیر نمونه ای از استفاده از عبارت SQL را نشان می دهد:
واردات کمان
fc = “C:/Data/study.gdb/roads”
با arcpy.da.SearchCursor(fc، [“STREET_NAME”، “CLASSCODE”]،
‘”CLASSCODE” = 1′) به عنوان مکان نما:
برای ردیف در مکان نما:
چاپ (ردیف[0])
توجه داشته باشید کهWhere_clauseپارامتر است'”CLASSCODE” = 1’. بند واقعی SQL WHERE است”CLASSCODE” = 1، که از دو نقل قول در اطراف نام فیلد استفاده می کند. اماWhere_clauseپارامتر مکان نماهای جستجو باید رشته باشد. بنابراین نقل قول های تک در اطراف کل عبارت SQL WHERE قرار می گیرند.
جداکنندههای فیلد بسته به قالب دادهها متفاوت است، که میتواند منبع سردرگمی باشد. به عنوان مثال، اگرچه پایگاههای جغرافیایی و فایلهای شکل فایل از دو نقل قول استفاده میکنند (“کلاس کد”)، پایگاه های جغرافیایی سازمانی از هیچ جداکننده فیلد استفاده نمی کنند (کلاس کد). برای جلوگیری از سردرگمی، ازarcpy .AddFieldDelimiters()عملکرد. نحو این تابع است
arcpy.AddFieldDelimiters (منبع داده، فیلد)
این تابع نوع مجموعه داده مورد استفاده را شناسایی می کند، مانند فایل شیپ یا پایگاه جغرافیایی سازمانی، و جداکننده های صحیح را اضافه می کند. در کد مثال زیر، ابتدا نام فیلد به یک متغیر اختصاص داده شده استAddFieldDelimiters()تابع قبل از استفاده از آن در عبارت SQL، جداکننده های صحیح را به نام فیلد اضافه می کند. برای بهبود خوانایی، یک متغیر نیز برایWhere_clauseپارامتر:
واردات کمان
fc = “C:/Data/zipcodes.shp”
نام فیلد = “CITY”
delimfield = arcpy.AddFieldDelimiters (fc، نام فیلد)
sqlwhere = delimfield + ” = ‘LONGWOOD'”
با arcpy.da.SearchCursor(fc، [“NAME”، “CLASSCODE”]،
sqlwhere) به عنوان مکان نما:
برای ردیف در مکان نما:
چاپ (ردیف[0])
یادداشتی کوتاه در موردWhere_clauseبه ترتیب است. بند واقعی SQL WHERE در اینجا خواهد بود”CITY” = “LONGWOOD”. در این بیانیه،”شهر”نام فیلد در دو گیومه است و”LONGWOOD”ارزش بهره است از آنجایی که مقدار یک رشته است، باید به عنوان بخشی از نحو SQL در یک نقل قول باشد. سپس برای استفاده از بند به عنوانWhere_clauseپارامتر، کل عبارت باید یک رشته باشد. این نیاز یک مشکل را ایجاد می کند زیرا هر دو نوع علامت نقل قول منجر به یک مشکل نحوی می شود. نه نه””CITY” = “LONGWOOD””یا”CITY” = “LONGWOOD”به دلیل استفاده ناسازگار از علامت نقل قول، رشته درستی به دست می آید. یک راه حل استفاده از کاراکتر فرار است (\) برای اطمینان از درست خواندن گیومه ها. رشته صحیح است
sqlwhere = “\”CITY\” = “LONGWOOD””
در این کد، کاراکتر escape تضمین می کند”شهر”به عنوان نام فیلد به درستی خوانده می شود. درAddFieldDelimiters()تابع استفاده از کاراکترهای فرار را غیر ضروری می کند و باعث می شود نوشتنWhere_clauseپارامترها تا حدودی کمتر گیج کننده هستند.
یک جایگزین استفاده از نقل قول های سه گانه در پایتون است. عبارت اصلی”CITY” = “LONGWOOD”توسط نقل قول های سه گانه احاطه شده است، که همچنین باعث می شود که عبارت به عنوان یک رشته خوانده شود:
sqlwhere = “”””CITY” = “LONGWOOD””””
نقل قول های سه گانه همچنین در پایتون برای سازماندهی رشته های طولانی در چندین خط، از جمله برای رشته های مستندسازی (رشته های اسناد) در داخل یک اسکریپت استفاده می شود، اما این عملکرد در اینجا برای اعمال استفاده از یک رشته استفاده می شود، صرف نظر از اینکه کدام علامت نقل قول در بین آنها استفاده می شود. جفت نقل قول سه گانه نقل قول های سه گانه می توانند از نقل قول های دوتایی استفاده کنند (“”” “””) یا نقل قول های تکی (”””). چه از کاراکترهای فرار استفاده کنید (\) یا نقل قول های سه گانه عمدتاً یک اولویت است.
SQL معمولاً در توابع ابزار نیز استفاده می شود – به عنوان مثال، در ابزار Select. نحو عمومی ابزار Select است
انتخاب کنید (in_features، out_feature_class، {where_clause})
درWhere_clauseپارامتر یک عبارت SQL است و برای جلوگیری از سردرگمی در مورد جداکنندههای فیلد مناسب، کد مثال زیر ازAddFieldDelimiters()عملکرد:
واردات کمان
infc = “C:/Data/zipcodes.shp”
نام فیلد = “CITY”
outfc = “C:/Data/zip_select.shp”
delimfield = arcpy.AddFieldDelimiters (infc، نام فیلد)
arcpy.Select_analysis(infc، outfc، delimfield + ” = ‘LONGWOOD'”)
علاوه بر یک بند SQL WHERE، می توانید از تعداد محدودی از بندهای SQL دیگر نیز استفاده کنید. هر دوجستجوی مکان نماوUpdateCursorکلاس ها اختیاری دارندsql_clauseپارامتر. بندهای پشتیبانی شده عبارتند از DISTINCT، GROUP BY، ORDER و TOP. این بندها به شما کنترل بیشتری بر نتایج می دهد. برای استفاده موثر از این کلمات کلیدی SQL، نگاهی کوتاه به نحوه نگارش عبارات SQL لازم است. ساختار اصلی یک دستور SQL مورد استفاده در ArcGIS Pro است
SELECT * FROM <table> WHERE <condition>
این ساختار اساسی رکوردها را از جدول پایگاه داده انتخاب می کند. علامت * به این معنی است که تمام فیلدها به طور پیش فرض گنجانده شده اند و شرط عبارت WHERE است. کلمات کلیدی اضافی را می توان به این عبارت اضافه کرد – برای مثال، ORDER BY. این کلمه کلیدی SQL به شما امکان می دهد نتایج را به ترتیب صعودی به صورت زیر مرتب کنید:
SELECT * FROM <table> WHERE <condition> ORDER BY <فیلد>
این عبارت نتیجه را بر اساس مقادیر موجود در یک فیلد خاص مرتب می کند. کلمه کلیدی ORDER BY بعد از عبارت WHERE قرار می گیرد و به عنوان عبارت postfix شناخته می شود.
مثال دیگری از کلمه کلیدی SQL TOP است که به شما امکان می دهد تعداد خاصی از رکوردها را به شرح زیر انتخاب کنید:
SELECT TOP 5 * FROM <table> WHERE <condition>
این عبارت فقط پنج رکورد اول را انتخاب می کند که شرایط را برآورده می کند. کلمه کلیدی TOP قبل از عبارت WHERE قرار می گیرد و به عنوان پیشوند بند نامیده می شود.
با بازگشت به Python و ArcPy، کلاس های مکان نما تنها تعداد محدودی از کلمات کلیدی SQL را پشتیبانی می کنند. DISTINCT و TOP عبارتهای پیشوندی هستند و ORDER BY و GROUP BY عبارتهای پسوند هستند. درsql_clauseپارامتر شامل یک جفت عبارت SQL پیشوند و پسوند است که در یک لیست یا تاپل سازماندهی شده اند. اگر می خواهید فقط از یک بند استفاده کنید، یکی دیگر به صورت مشخص می شودهیچ یک.
به عنوان مثال، کد زیر از کلمه کلیدی ORDER BY برای مرتب کردن نتایج به ترتیب صعودی استفاده می کند:
واردات کمان
fc = “C:/Data/study.gdb/roads””
فیلدها = “STREET_NAME”
sql = (هیچ، “سفارش از طریق STREET_NAME”)
با arcpy.da.SearchCursor(fc، فیلدها، sql_clause=sql) به عنوان مکان نما:
برای ردیف در مکان نما:
چاپ (ردیف[0])
نتیجه نام خیابان ها را به ترتیب صعودی چاپ می کند:
خانه پرنده
خانه پرنده
CEDAR BEND
دریاچه پاک
دریاچه پاک
دریاچه پاک
کومانچی
قطره شبنم
لانه عقاب
…
کلمه کلیدی DISTINCT فقط مقادیر متمایز (یعنی منحصر به فرد) را انتخاب می کند و هر گونه تکراری را حذف می کند. DISTINCT یک عبارت پیشوندی است که می تواند در ترکیب با یک بند پسوند به شرح زیر استفاده شود:
sql = (“متمایز”، “سفارش توسط STREET_NAME”)
نتیجه نام خیابان ها را به ترتیب صعودی چاپ می کند اما موارد تکراری حذف شده است:
خانه پرنده
CEDAR BEND
دریاچه پاک
کومانچی
قطره شبنم
لانه عقاب
…
استفاده ازsql_clauseپارامتر استفاده ازWhere_clauseپارامترها به طور همزمان شما می توانید بند SQL WHERE را با هر ترکیبی از پیشوند و پسوند SQL در یک مکان نما ترکیب کنید.
محدودیت هایی در استفاده از این کلمات کلیدی وجود دارد. اول، همه فرمت های داده از آنها پشتیبانی نمی کنند. DISTINCT و ORDER BY فقط در پایگاههای جغرافیایی پشتیبانی میشوند، نه در قالبهایی مانند شکل فایلها و جداول DBF. TOP فقط توسط پایگاه داده های SQL Server پشتیبانی می شود. دوم، شما میتوانید در هر زمان فقط از یک پیشوند و یک عبارت پسوند استفاده کنید، زیرا پارامتر باید از یک جفت مقدار در یک لیست یا تاپل تشکیل شده باشد.
اگرچه بندهای SQL عملکردهای اضافی را ارائه می دهند، اما تنها بخش کوچکی از کلمات کلیدی موجود در SQL را نشان می دهند. ArcPy به شما امکان دسترسی کامل به عملکرد SQL را از طریق مکان نما نمی دهد. از سوی دیگر، کلمات کلیدی عملکردی را ارائه می دهند که از طریق گزینه های معمولی SQL در ابزارهای پردازش جغرافیایی در ArcGIS Pro در دسترس نیست.
در نهایت، لازم به ذکر است که بسیاری از قابلیت های ارائه شده توسطsql_clauseپارامتر را می توان با استفاده از توابع پایتون انجام داد. به عنوان مثال، اگر مقادیر را به عنوان یک لیست پایتون بخوانید، می توانید از توابع مرتب سازی داخلی استفاده کنید. کد زیر نشان می دهد که چگونه این کار انجام می شود:
واردات کمان
fc = “C:/Data/study.gdb/roads””
فیلدها = “STREET_NAME”
mylist = []
با arcpy.da.SearchCursor(fc، فیلدها) به عنوان مکان نما:
برای ردیف در مکان نما:
mylist.append(ردیف[0])
mylist.sort()
چاپ (mylist)
اسکریپت یک لیست خالی جدید ایجاد می کند و دربرایحلقه، مقادیر هر رکورد با استفاده از علامت به لیست اضافه می شودضمیمه ()روش. سپس لیست با استفاده ازمرتب سازی()روش. رویکردهای مشابهی را می توان برای تکرار عملکرد سایر کلمات کلیدی SQL استفاده کرد.
8.4کار با نام جدول و فیلد
هنگام کار با مجموعه دادههای مختلف، تعیین اینکه آیا جداول و فیلدها دارای نام معتبر و منحصربهفرد هستند یا خیر، مهم است. این امر به ویژه هنگام ایجاد داده در یک پایگاه جغرافیایی برای جلوگیری از بازنویسی تصادفی داده ها مهم است. دروجود دارد()تابع پوشش داده شده در فصل 6 می تواند تعیین کند که آیا یک جدول خاص برای یک فضای کاری خاص منحصر به فرد است یا خیر، اما چندین عملکرد دیگر می توانند یکپارچگی پایگاه داده را تضمین کنند.
جداول باید دارای یک نام معتبر باشند، به این معنی که نام نمی تواند دارای یک کاراکتر نامعتبر (مانند یک فاصله) یا یک کاراکتر شروع نامعتبر (مانند یک عدد) باشد. درarcpy .ValidateTableName()تابع یک نام جدول معتبر برای یک فضای کاری خاص به دست می آورد. نحو این تابع است
arcpy.ValidateTableName(name, {workspace})
تابع یک نام جدول و یک فضای کاری می گیرد و یک نام جدول معتبر برای فضای کاری برمی گرداند. اگر نام جدول از قبل معتبر باشد، تابع رشته ای را برمی گرداند که همان ورودی است. اگر نام ورودی حاوی نویسههای نامعتبر باشد، آنها با زیرخط (_) جایگزین میشوند. پایگاههای اطلاعاتی خاص نیز ممکن است دارای کلماتی باشند که رزرو شدهاند و نمیتوانند در نام جدول استفاده شوند (مانند خود کلمه “جدول”).
به عنوان مثال، اسکریپت زیر تعیین می کند که آیاجاده های جدیدیک نام جدول معتبر برای یک پایگاه جغرافیایی فایل است:
واردات کمان
tablename = arcpy.ValidateTableName(“جاده های جدید”، “C:/Data/study.gdb”)
چاپ (نام جدول)
در این مثال، مقدارجاده های جدیدبرای نام جدول برگردانده می شود. زیرخط اضافه می شود زیرا نام جدول نمی تواند حاوی فاصله باشد. نام جداول معمولاً هنگام انتقال داده ها از یک فضای کاری به فضای کاری دیگر تأیید می شود. به عنوان مثال، کد زیر از ابزار Copy Features برای کپی کردن تمام فایل های شکل از یک پوشه به یک پایگاه داده جغرافیایی استفاده می کند. پسوند فایل .shp با استفاده از نام فایل حذف می شودنام پایهویژگی، و نامها قبل از کپی کردن فایلهای شکل در کلاسهای ویژگی، به شرح زیر اعتبارسنجی میشوند:
واردات کمان
واردات سیستم عامل
arcpy.env.workspace = “C:/Data”
outworkspace = “C:/Data/study.gdb”
fclist = arcpy.ListFeatureClasses()
برای shapefile در fclist:
fcname = arcpy.Describe(shapefile).baseName
newfcname = arcpy.ValidateTableName(fcname، outworkspace)
outfc = os.path.join(Outworkspace، newfcname)
arcpy.CopyFeatures_management(shapefile، outfc)
نکته ای که در مورد این مثال باید به آن توجه کرد این است که اسکریپت به طور موثر از دو فضای کاری استفاده می کند. اولین فضای کاری با استفاده از C:\Data تنظیم شده استarcpy.env.workspace. این فضای کاری امکان فهرست کردن تمام کلاسهای ویژگی را در این پوشه فراهم میکند. با این حال، مکان مورد نظر برای کپی کردن یک پایگاه داده جغرافیایی است – یعنی C:\Data\study.gdb که دومین فضای کاری است. امکان استفاده همزمان از دو فضای کاری متفاوت وجود نداردarcpy.env.workspace، بنابراین برای جلوگیری از کدگذاری سخت مسیر کامل فضای کاری دوم، مسیر به یک متغیر اختصاص داده می شود. همچنین توجه داشته باشید که فضای کاری دوم برای پارامتر دوم استفاده می شودValidateTableName()برای اطمینان از نوع صحیح فضای کاری (یعنی پایگاه جغرافیایی) برای تأیید نام جدول.
یک رویکرد جایگزین استفاده استarcpy.env.workspaceبرای تنظیم دومین فضای کاری پس از اولین فضای کاری دیگر نیازی نیست—یعنی پس از ایجاد لیست کلاس های ویژگی (یعنی شکل فایل ها). راه حل جایگزین به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data”
fclist = arcpy.ListFeatureClasses()
arcpy.env.workspace = “C:/Data/study.gdb”
برای shapefile در fclist:
fcname = arcpy.Describe(shapefile).baseName
outfc = arcpy.ValidateTableName(fcname)
arcpy.CopyFeatures_management(shapefile، outfc)
مثال های کد نیز این را نشان می دهدValidateTableName()بر روی کلاس های ویژگی کار می کند، نه تنها بر روی جداول مستقل همانطور که از نام ممکن است نشان دهد.
رویکرد مشابهی را می توان برای نام فیلدها با استفاده ازarcpy.ValidateFieldName()عملکرد. فیلدها را نمیتوان اضافه کرد مگر اینکه نام آنها معتبر باشد، بنابراین مگر اینکه ابتدا نام فیلدها تأیید شود، ممکن است یک اسکریپت در حین اجرا خراب شود. نحو این تابع است
arcpy.ValidateFieldName(name, {workspace})
درValidateFieldName()تابع یک نام فیلد و یک فضای کاری می گیرد و یک نام فیلد معتبر برای فضای کاری برمی گرداند. نویسه های نامعتبر با خط زیر جایگزین می شوند. کد زیر نام یک فیلد جدید را تأیید می کند و سپس از مقدار بازگشتی برای اضافه کردن فیلد جدید با استفاده از ابزار Add Field استفاده می کند:
واردات کمان
واردات سیستم عامل
fc = “C:/Data/roads.shp”
fieldname = arcpy.ValidateFieldName(“NEW%^”، os.path.dirname(fc)))
arcpy.AddField_management(fc، نام فیلد، “TEXT”، “”،”، 12)
در این مثال، رشته”% جدید^”جایگزین می شود”جدید__”.
توجه داشته باشید:هر کاراکتر نامعتبر با یک زیرخط جایگزین می شود، بنابراین این رشته نمونه دارای دو خط زیر خط است.
مانندValidateTableName()تابع،ValidateFieldName()تابع تعیین نمی کند که آیا نام فیلد وجود دارد یا خیر، بنابراین یک اسکریپت همچنان ممکن است شکست بخورد، یا یک فیلد موجود همچنان بازنویسی شود. برای تعیین اینکه آیا نام فیلد وجود دارد یا خیر،ListFields()تابع فهرستی از فیلدهای یک جدول یا کلاس ویژگی ایجاد می کند و نام فیلد جدید را می توان با این لیست مقایسه کرد.
یک جایگزین برای تعیین اینکه آیا نام جدول وجود دارد یا نه استفاده از آن استarcpy .CreateUniqueName()عملکرد. این تابع با اضافه کردن یک عدد به نام ورودی، یک نام منحصر به فرد در فضای کاری مشخص شده ایجاد می کند. این تعداد تا زمانی که نام منحصر به فرد شود افزایش می یابد. برای مثال، اگر نام «کلیپ» از قبل وجود داشته باشد،CreateUniqueName()تابع آن را به “Clip0” تغییر می دهد. اگر این نام نیز وجود داشته باشد، تابع نام را به “Clip1” و غیره تغییر می دهد. این تابع فقط می تواند نام جدول منحصر به فرد را در یک فضای کاری ایجاد کند. برای نام فیلدها کار نمی کند. مثلا:
واردات کمان
arcpy.env.workspace = “C:/Data”
unique_name = arcpy.CreateUniqueName(“buffer.shp”)
arcpy.Buffer_analysis(“roads.shp”، unique_name، “100 FEET”)
هنگامی که این کد برای اولین بار اجرا می شود و فایل buffer.shp وجود ندارد، کلاس ویژگی حاصل buffer.shp نامیده می شود. هنگامی که کد برای بار دوم اجرا می شود، کلاس ویژگی حاصل buffer0.shp نامیده می شود. این تابع جایگزینی برای بازنویسی فایل های موجود با استفاده ازرونویسی خروجیدارایی ازenvکلاس
ممکن است متوجه شوید که اکثر کادرهای محاورهای ابزارهای پردازش جغرافیایی در ArcGIS Pro از رویکردی مشابه برای ارائه نامهای پیشفرض برای مجموعه دادههای خروجی استفاده میکنند. به عنوان مثال، هنگامی که ابزار Clip بر روی یک کلاس ویژگی اجرا می شود، خروجی، به طور پیش فرض، نام کلاس ویژگی ورودی و به دنبال آن _Clip است، مانند rivers_Clip. هنگامی که ابزار Clip دوباره در همان کلاس ویژگی اجرا می شود و فضای کاری تغییر نکرده است، نام پیش فرض rivers_Clip1 می شود.
8.5تجزیه جدول و نام فیلدها
محیط geoprocessing ArcGIS Pro همیشه از نامهای کاملاً واجد شرایط برای کلاسها و جداول ویژگی استفاده میکند. به عنوان مثال، برای پردازش یک کلاس ویژگی به نام roads، یک ابزار ژئوپردازش نه تنها باید نام، بلکه مسیر، نام پایگاه داده و صاحب داده ها را نیز بداند. این اطلاعات هنگام کار با پایگاه های جغرافیایی ضروری است. تقسیم نام کاملاً واجد شرایط برای یک مجموعه داده به اجزای آن معمولاً تجزیه نامیده می شود. درarcpy.ParseTableName()تابع را می توان برای این کار استفاده کرد. نحو این تابع است
arcpy.ParseTableName(name, {workspace})
درParseTableNameتابع یک رشته را با نام پایگاه داده، نام مالک و نام جدول برمی گرداند که هر کدام با کاما از هم جدا شده اند. برای مثال کد زیر از کد زیر استفاده می کندParseTableName()برای به دست آوردن اجزای نام کاملاً واجد شرایط، در لیستی از کلاس های ویژگی عمل می کند و سپس این مؤلفه ها را به یک لیست تقسیم می کند:
واردات کمان
arcpy.env.workspace = “C:/Data/study.gdb”
fcs = arcpy.ListFeatureClasses()
برای fc در fcs:
نام کامل = arcpy.ParseTableName(fc)
namelist = fullname.split(“)
نام پایگاه داده = فهرست نام[0]
نام مالک = فهرست نام[1]
fcname = لیست نام[2]
چاپ (نام پایگاه داده)
چاپ (نام مالک)
چاپ (fcname)
رویکرد مشابهی را می توان برای تقسیم نام کاملاً واجد شرایط یک فیلد در جدول به اجزای آن با استفاده از استفاده کردarcpy.ParseFieldName()عملکرد. این تابع یک رشته را با نام پایگاه داده، نام مالک، نام جدول و نام فیلد برمی گرداند که هر کدام با کاما از هم جدا شده اند.
توجه داشته باشید:تجزیه همچنین با استفاده از توابع تجزیه داخلی در پایتون امکان پذیر است. با این حال، توابع تجزیه در پایتون یک نحو خاص را در نظر می گیرند که ممکن است برای یک مجموعه داده متفاوت تغییر کند. به عنوان مثال، نحو تجزیه برای هر نوع پایگاه داده جغرافیایی (فایل، سازمانی) متفاوت است. توابع تجزیه ArcPy به طور خاص برای کار با پایگاه های جغرافیایی طراحی شده اند و بنابراین قوی تر هستند.
8.6عبارات پایتون برای محاسبات فیلد
علاوه بر استفاده از ArcPy برای نوشتن اسکریپت برای کارهایی مانند geoprocessing و سایر گردشهای کاری، Python در بخشهای دیگر ArcGIS Pro نیز استفاده میشود. چندین ابزار از پایتون برای نوشتن عبارات به عنوان یکی از پارامترهای ابزار استفاده می کنند. این ابزارها عبارتند از Calculate Field، Calculate Fields و Calculate Value.
توجه داشته باشید:ابزار Calculate Value یک ابزار فقط ModelBuilder است. مقداری بر اساس عبارت پایتون برمیگرداند، اما برای استفاده در اسکریپتنویسی پایتون در نظر گرفته نشده است.
مثال ابزار Calculate Field را در نظر بگیرید، یکی از پرکاربردترین ابزارها در گردش کار معمولی GIS.
ابزار Calculate Field برای محاسبه مقادیر یک فیلد در جدول استفاده می شود. میتواند از یک مقدار واحد تشکیل شده باشد که برای هر رکورد یکسان است، یا میتواند بر اساس مقادیر فیلدهای دیگر، از جمله چندین عملگر مختلف باشد. یک «محاسبه» در این زمینه، شامل چیزی فراتر از دستکاری مقادیر عددی است و شامل انواع دیگر دادهها مانند رشتهها، تاریخها و هندسه میشود.
ابزار Calculate Field از سه نوع عبارت پشتیبانی می کند: Python 3، Arcade و SQL. پایتون 3 پیش فرض است و بیشترین استفاده را دارد. Arcade یک زبان عبارت است که به طور خاص توسط Esri برای استفاده در پلت فرم ArcGIS نوشته شده است. Arcade برخی از عملکردهای مشابه سایر زبان های برنامه نویسی مانند Python و JavaScript را دارد، اما آسیب پذیری های امنیتی کمتری دارد. از آنجا که Arcade برای تعداد کمی از وظایف خاص در مقایسه با یک زبان برنامه نویسی همه منظوره استفاده می شود، همچنین نسبتا ساده است. نمونه ای از استفاده از عبارت Arcade در اسکریپت پایتون در انتهای این بخش گنجانده شده است. عبارات SQL فقط توسط سرویس های ویژگی میزبانی شده در ArcGIS Online پشتیبانی می شوند و در اینجا مورد بحث قرار نمی گیرند.
توجه داشته باشید:نوع عبارت Python 3 به نسخه 3 Python اشاره نمی کند، بلکه به سادگی اشاره ای به این واقعیت است که این سومین نسخه از انواع عبارت Python در ArcGIS Pro است (به دنبال انواع عبارت به نام Python و Python _9.3 در نسخه های قبلی نرم افزار Esri ). پایتون 3 از نحو منظم پایتون پیروی می کند، اما از آنجایی که کد در یک زمینه خاص استفاده می شود، برخی تغییرات لازم است، همانطور که در مثال های بعدی توضیح داده شده است. همچنین توجه داشته باشید که عبارات SQL در این زمینه از زیرمجموعه متفاوتی از زبان SQL در مقایسه با عبارت WHERE استفاده شده در کوئری های SQL استفاده می کنند.
هنگام استفاده از ابزار Calculate Field، فیلدی که باید محاسبه شود باید وجود داشته باشد و مقادیر موجود بازنویسی شوند.
ساده ترین مثال یک عبارت، وارد کردن مقدار یکسان برای هر رکورد است. به عنوان مثال، برای نوشتن یک رشته در یک فیلد، عبارت از یک رشته پایتون تشکیل شده است:
TEXTFIELD = “متن نمونه”
می توان از هر دو نقل قول و نقل قول استفاده کرد. یک رشته بدون علامت نقل قول منجر به خطا می شود. کادر محاوره ای ابزار تکمیل شده در شکل نشان داده شده است.
در کادر محاورهای ابزار تکمیلشده، فیلد مورد علاقه را به عنوان پارامتر نام فیلد انتخاب میکنید – به عنوان مثال، TEXTFIELD. پس از انتخاب یک فیلد، نام فیلد در بالای کادر عبارت نشان داده می شود – یعنی TEXTFIELD =. سپس می توانید عبارت زیر را تایپ کنید. مثلا برای وارد کردن عبارتTEXTFIELD = “متن نمونه”، فقط وارد می شوید”متن نمونه”به عنوان عبارت زیراTEXTFIELD =بخش در حال حاضر بخشی از جعبه محاوره ابزار است. در مثال های زیر، عبارت کامل برای نشان دادن نام فیلد گنجانده شده است.
برای نوشتن یک عدد در یک فیلد، عبارت از یک عدد صحیح یا شناور تشکیل شده است:
NUMFIELD = 123.456
نوع داده فیلد مهم است زیرا تعیین می کند که کدام مقادیر معتبر هستند. به عنوان مثال، یک فیلد TEXT میتواند شامل رشتهها و اعداد (به عنوان رشته) باشد، اما یک فیلد عددی (SHORT، LONG، FLOAT، DOUBLE) نمیتواند شامل رشتهها باشد. درک انواع داده ها مرتبط است زیرا اعتبار سنجی داخلی ابزار Calculate Field نوع داده فیلد را در نظر نمی گیرد. هنگامی که روی نماد تأیید (علامت تیک سبز) کلیک می کنید، عبارت بدون در نظر گرفتن نوع داده فیلد تأیید می شود. بنابراین، عبارت ممکن است معتبر باشد (یعنی از نحو صحیح پایتون استفاده کنید)، اما ابزار به دلیل معنی دار نبودن نوع داده منجر به خطا می شود. به عنوان مثال، نوشتن یک رشته در یک فیلد عددی را در نظر بگیرید:
NUMFIELD = “TEST”
عبارت معتبر در نظر گرفته می شود، اما اجرای ابزار با شکست مواجه می شود و یک خطا را گزارش می دهد:
در ورودی OID 1 ناموفق بود، نمیتوان مقدار «TEST» را در فیلد خروجی NUMFIELD نوشت.
بسیاری از عبارات از یک مقدار برای هر رکورد تشکیل نمیشوند، بلکه از مقادیر فیلدهای دیگر استفاده میکنند. به عنوان مثال، می توانید مقادیر یک فیلد موجود را بدون ایجاد هیچ تغییری کپی کنید. فیلدهای جدول باید با استفاده از نام فیلد احاطه شده با علامت تعجب به شرح زیر ارجاع داده شوند:
TEXTFIELD = !CODE!
عبارت مقادیر فیلد CODE را در فیلد انتخاب شده در ابزار کپی می کند – یعنی TEXTFIELD.
استفاده از علامت تعجب کمی به عادت کردن نیاز دارد زیرا منحصر به فرد است که چگونه فیلدها در این عبارات ارجاع داده می شوند. شما در حال نوشتن کد پایتون هستید، اما برای اینکه کد از فیلدهای موجود استفاده کند، باید از علامت تعجب استفاده کنید. این سینتکس در یک IDE معمولی پایتون کار نخواهد کرد.
توجه داشته باشید:
نام فیلدها در این عبارت ها به حروف بزرگ و کوچک حساس نیستند، بنابراین می توانید از !Code استفاده کنید! یا !کد! به جای !CODE!.
با استفاده از عملگر می توانید محاسبات را انجام دهید. فیلدی به نام ACRES را در نظر بگیرید که با استفاده از مقادیر فیلد Shape_Area بر حسب فوت مربع محاسبه می شود. تبدیل به صورت زیر محاسبه می شود:
ACRES = !Shape_Area! / 43560
همه عملگرهای معمولی پایتون، از جمله افزودن (+)، منها کردن (-)، ضرب (*، تقسیم (/، تقسیم طبقه (//)، مدول (%، و توان (**). میتوانید برای بهبود خوانایی فاصلهها اضافه کنید، اما فاصلهها بر بیان تأثیر نمیگذارند. به جز برای استفاده از علامت تعجب برای ارجاع به نام فیلدهای موجود، نحو معمولی پایتون اعمال می شود.
هنگام کار با رشته ها، می توانید از روش های رشته ای برای دستکاری مقادیر استفاده کنید. متدهای رشته ای از منظم پایتون استفاده می کنند<object>.<روش>نماد نقطه، که در آن شی فیلد مرجع است. به عنوان مثال، کد زیر یک رشته با حروف کوچک از مقادیر فیلد مرجع ایجاد می کند:
TEXTFIELD = !CODE!.lower()
همچنین می توان از نمایه سازی و برش استفاده کرد. مثال زیر فقط سه کاراکتر اول یک رشته موجود را کپی می کند:
TEXTFIELD = !CODE![:3]
همچنین می توانید از چندین توابع داخلی پایتون از جمله استفاده کنیدحداکثر ()،دقیقه ()،گرد()، وجمع (). مثال زیر حداکثر مقدار را از لیستی از فیلدها محاسبه می کند:
حداکثر ([!NUM1!، !NUM2!، !NUM3!])
ماژول های داخلی پایتون را می توان به طور مستقیم استفاده کرد، از جملهریاضی. یک فیلد موجود به نام VALUE را در نظر بگیرید، که اعداد آن باید به صورت log تبدیل شوند، یا به مقادیر لگاریتمی خود تبدیل شوند، و اعداد جدید باید در فیلدی به نام LOG_VALUE نوشته شوند:
LOG_VALUE = math.log(!VALUE!)
بسیاری از دیگر ماژول های داخلی پایتون برای ایجاد عبارات مفید هستند، از جملهوقت قرار،تصادفی،زمان، و چندین مورد دیگر. نیازی نیست ابتدا این ماژول ها را وارد کنید تا از آنها در یک عبارت استفاده کنید، همانطور که باید در یک اسکریپت انجام دهید.
علاوه بر کار با مقادیر فیلدهای موجود در جدول، می توانید از ویژگی های شی هندسه نیز استفاده کنید. این شبیه به استفاده ازشکل@نشانه هنگام استفاده از مکان نما همانطور که در فصل 9 با جزئیات بیشتر توضیح داده شد. برای مثال، عبارت زیر از عبارت استفاده می کندحوزهویژگی برای نوشتن مساحت هر ویژگی در فیلدی به نام AREA:
AREA = !Shape.area!
توجه داشته باشید که این نسخه با !Shape_Area! قبلی متفاوت است، که به فیلدی به نام Shape_Area اشاره می کند که بخشی از فیلدهای هر کلاس ویژگی پایگاه جغرافیایی چند ضلعی است. عبارت قبلی از طریق فیلد Shape به شی هندسی ارجاع می دهد و سپس از ویژگی برای ناحیه استفاده می کند.
تبدیل واحدها داخلی هستند که راحت است. کد زیر مساحت را مستقیماً به هکتار محاسبه می کند:
ACRES = !Shape.area@acres !
سایر خواص عبارتند ازنوع،وسعت،نقطه مرکزی،نقطه اول،آخرین نقطه،طول،چند قسمتی است، وpartCount. برای مثال عبارت زیر تعداد قسمت های هر ویژگی را مشخص می کند و این عدد را در فیلدی به نام PCOUNT می نویسد:
PCOUNT = !Shape.partCount!
بسیاری از عبارات معمولی را می توان به صورت یک خط کد نوشت. عبارات پیچیده تری را می توان با استفاده از بلوک کد ساخت. این ویژگی به شما اجازه می دهد تا یک تابع سفارشی در پایتون بنویسید تا محاسبات دقیق تری انجام دهید.
مثال زیر نحوه نوشتن این نوع تابع را نشان می دهد. عبارت تابع را فراخوانی می کند و آرگومان را ارسال می کند. در مثال زیر، تابع سفارشی m2_to_ft2 نامیده می شود و آرگومان مساحت ویژگی (به متر مربع) به عنوان یک عدد ممیز شناور است. تابع مساحت را از متر مربع به فوت مربع تبدیل می کند.
Area_SQFT = m2_to_ft2((!Shape.area!)
این تابع از ماژول ریاضی استفاده می کند، بنابراین این ماژول باید به صورت زیر در بلوک کد وارد شود:
واردات ریاضی
تابع سفارشی در بلوک کد با استفاده از تعریف شده استدفکلمه کلیدی به دنبال نام تابع و آرگومان (در صورت وجود) در پرانتز. در این مورد، آرگومان ناحیه ویژگی است. این متغیر در مثال زیر “مساحت” نامیده می شود، اما می توان آن را چیز دیگری نامید:
def m2_to_ft2 (مساحت):
خط کد بادفدستور با یک دونقطه به پایان می رسد، و آنچه در زیر می آید یک بلوک تورفتگی از کد برای انجام خود تابع است. در این مثال، مساحت متر مربع به فوت مربع تبدیل می شود. این مقدار باید از تابع با استفاده از a برگردانده شودبرگشتبیانیه به شرح زیر
بازگشت math.pow(3.2808, 2) * ناحیه
عبارت تکمیل شده و بلوک کد در شکل نشان داده شده است.
تعیین مساحت بر حسب فوت مربع نیز می تواند با استفاده از یک عبارت تک خطی انجام شود، اما این مثال نحوه عملکرد یک بلوک کد را نشان می دهد.
مثال مفصلتری در ادامه آمده است که از مقادیر یک فیلد متنی موجود برای تخصیص کدهای عددی استفاده میکند. این مانند یک طبقه بندی مجدد در شطرنجی است اما اکنون برای مقادیر یک جدول اعمال می شود. در مثال، به دستههای کاربری منحصر به فرد زمین با استفاده از یک مقدار صحیح اختصاص داده میشوداگر دیگریساختار عبارت به فیلد متنی LU_TXT موجود اشاره می کند که شامل دسته های توصیفی است و مقادیر عددی در فیلد LU_NUM نوشته می شود. بیان این است
LU_NUM = طبقه بندی مجدد (!LU_TXT!)
و بلوک کد به صورت زیر است:
def reclass (استفاده از زمین):
اگر (کاربری زمین == “دولت”):
بازگشت 1
elif (استفاده از زمین == “سازمان”):
بازگشت 2
دیگر:
بازگشت 3
در بیشتر موارد، اجرای کد در عبارت یا در بلوک کد همان نتیجه را ایجاد می کند. یک استثنا در هنگام کار با اعداد تصادفی است. کد پایتون را برای ایجاد یک عدد تصادفی بین 0 تا 100 در نظر بگیرید:
random.random() * 100
می توانید این کد را به عنوان یک عبارت برای نوشتن نتایج در یک فیلد اجرا کنید:
RAND100 = random.random() * 100
اگرچه این کد یک عدد تصادفی تولید میکند، اما نتیجه برای هر رکورد از تاریخ یکسان استتصادفی()عملکرد ازتصادفیماژول فقط یک بار فراخوانی می شود. چگونه برای هر رکورد یک عدد تصادفی متفاوت بدست آوریم؟ این به یک تابع سفارشی نیاز دارد. بیان این است
RAND100 = rand()
این عبارت یک تابع سفارشی را فراخوانی می کندrand()اما هیچ استدلالی را تصویب نمی کند. بلوک کد به شرح زیر است:
واردات تصادفی
def rand():
بازگشت random.random() * 1000
کد به نظر یکسان است، اما با استفاده از یک تابع سفارشی،تصادفی()تابع برای هر رکورد در جدول فراخوانی می شود.
این بلوک های کد می توانند پیچیده شوند. میتوانید کد را به یک فایل cal صادر کنید و این فایلهای cal را میتوانید بعداً دوباره وارد کنید. یک فایل .cal یک فایل متنی است که محتویات عبارت و بلوک کد برای وارد کردن فرمت شده است. اگرچه یک فایل .cal یک فایل اسکریپت پایتون نیست، می توانید آن را به عنوان یک فایل متنی باز کنید و با کد پایتون کار کنید.
نمونه های قبلی قبلاً نشان داده اند که می توانید با اشیاء هندسی در عبارات کار کنید. نه تنها می توانید خواص را بخوانید، بلکه می توانید آنها را نیز تغییر دهید. مثال زیر نحوه استفاده از بلوک کد برای جابجایی مختصات x یک ویژگی نقطه را با فاصله معینی نشان می دهد.
برای کار با اشیاء هندسی، نام فیلد باید روی فیلد Shape تنظیم شود. این نحو با تنظیم مکان نما با استفاده از آن قابل مقایسه استشکل@. عبارت یک تابع سفارشی را فراخوانی می کند:
شکل = تغییر (!شکل!)
توجه داشته باشید:به عنوان یادآوری، نام فیلدها در این عبارات به حروف بزرگ و کوچک حساس نیستند، بنابراین می توانید از !shape!، !Shape!، یا !SHAPE! استفاده کنید.
بلوک کد یک تابع سفارشی را تعریف می کند که مختصات x را 25 واحد (از سیستم مختصات) جابجا می کند:
def shift(شکل):
point = shape.getPart(0)
نقطه.X += 25
نقطه بازگشت
این کد نیاز به کمی توضیح دارد. ابتدا از فیلد Shape استفاده می شود، به این معنی که به شی هندسه واقعی، به جای یک ویژگی، ارجاع داده می شود. ارجاع به شی هندسی مورد نیاز است زیرا هندسه ویژگی در حال تغییر است. دوم، شی هندسی به تابع ارسال می شود. سوم، در تئوری، این ویژگی می تواند از چندین بخش تشکیل شده باشد، بنابراینgetPart()روش استفاده می شود باشاخص صفر (0)برای بدست آوردن اولین (و تنها) قسمت هندسه که یک نقطه است. در نهایت، مختصات x ویژگی نقطه جابجا شده و نقطه جدید برگردانده می شود.
از آنجایی که ابزار Calculate Field تغییراتی در دادهها ایجاد میکند، ویرایشهای هندسه به روشی مشابه برای مقادیر مشخصه در کلاس ویژگی نوشته میشوند.
این بلوک کد نسبتاً پیچیده است و همین کار را می توان با استفاده از مکان نما انجام داد. فصل 9 استفاده از مکان نما برای خواندن و نوشتن هندسه ها را با عمق بیشتری مرور می کند.
چندین عنصر مفید برای کمک به نوشتن عبارات و بلوک های کد در ابزار Calculate Field در قسمت Helpers جعبه گفتگوی ابزار تعبیه شده است. این بخش عناصر کد رایج مورد استفاده مانند توابع ماژول ریاضی را فهرست می کند (به عنوان مثال،math.log()) و متدهایی برای اشیاء رشته ای (مثلاًپایین تر ()). همچنین عناصری برای کمک به نوشتن بلوک های کد وجود دارد، از جملهاگر دیگری،برای،در حالی که، و دیگران، و همچنین الگوهایی برای کارهای رایج. به عنوان مثال، یک الگوی بلوک کد برای ایجاد یک شماره ترتیبی وجود دارد. عبارت یک تابع سفارشی را به صورت زیر فراخوانی می کند:
NEWID = SequentialNumber()
بلوک کد یک تابع سفارشی را به شرح زیر تعریف می کند:
rec = 0
def SequentialNumber():
ثبت جهانی
pStart = 1
pInterval = 1
اگر (rec == 0):
rec = pStart
دیگر:
rec = rec + pInterval
بازگشت rec
کد ازجهانیکلمه کلیدی، که تغییر یک متغیر را خارج از محدوده فعلی ممکن می کند. با تعریف متغیر rec به عنوان یک متغیر سراسری در داخل تابع، می توان از متغیر خارج از تابع استفاده کرد.
توجه داشته باشید:کد مثال از سبک پیشنهادی برای نام متغیرها با حروف کوچک از راهنمای سبک برای پایتون استفاده نمی کند. با این حال، به دلیل اینکه کد مستقیماً از مثالهای موجود در ابزار Calculate Field گرفته شده است، کد بدون تغییر باقی میماند.
نتیجه در شکل نشان داده شده است.
نمونههای اضافی را میتوانید در صفحات راهنمای ArcGIS Pro تحت عنوان «محاسبه مثالهای پایتون فیلد» پیدا کنید.
مثالهایی که تاکنون ارائه شده، نحوه نوشتن عبارت Python را در جعبه محاورهای ابزار ابزار Calculate Field نشان دادهاند. از آنجا که این یک ابزار geoprocessing معمولی است، در ArcPy نیز یک تابع است. سینتکس ابزار به صورت زیر است:
CalculateField(in_table، فیلد، عبارت، {expression_type}،
{code_block})
نحو دقیقاً از طراحی جعبه محاوره ابزار پیروی نمی کند زیرا نوع عبارت بعد از عبارت در نحو فهرست شده است، اما قبل از عبارت در جعبه محاوره ابزار نشان داده شده است. این به این دلیل است که نوع عبارت دارای یک پیشفرض است – یعنی پایتون 3. توجه داشته باشید که نوع عبارت در کادر محاورهای ابزار به عنوان Python 3 نامیده میشود، اما هنگام استفاده از تابع در یک اسکریپت، نوع عبارت صحیح به صورت نوشته میشود.پایتون 3. چون پیش فرض است، معمولاً نیازی به استفاده از آن نیست.
مثال قبلی را در نظر بگیرید که در آن مقادیر از یک فیلد به فیلد دیگر کپی می شوند. اسکریپت زیر یک فیلد متنی جدید را به یک کلاس ویژگی اضافه می کند و از ابزار Calculate Field برای کپی کردن مقادیر از فیلد موجود CODE در فیلد جدید به شرح زیر استفاده می کند:
واردات کمان
arcpy.env.workspace = “C:/Demo/City.gdb”
fc = “بسته ها”
arcpy.AddField_management(fc، “NEWCODE”، “TEXT”، “”، “20”)
arcpy.CalculateField_management(fc، “NEWCODE”، “!CODE!”)
هر یک از عباراتی که قبلا بحث شد نیز می تواند مورد استفاده قرار گیرد. با این حال، کار با بلوک های کد کمی متفاوت است زیرا یک بلوک کد از چندین خط تشکیل شده است. راه حل این است که از یک متغیر رشته ای استفاده کنید که در چندین خط با استفاده از نقل قول های سه گانه، به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Demo/City.gdb”
fc = “بسته ها”
arcpy.AddField_management(fc، “LU_NUM”، “SHORT”)
express = “reclass(!LU_TXT!)”
بلوک کد = “””
def reclass (استفاده از زمین):
اگر (کاربری زمین == “دولت”):
بازگشت 1
elif (استفاده از زمین == “سازمان”):
بازگشت 2
دیگر:
بازگشت 3″””
arcpy.CalculateField_management(fc، “LU_NUM”، عبارت، “”،
بلوک کد)
اگرچه مقادیر فیلد را می توان با استفاده از ابزار Calculate Field به روز کرد، یک راه حل جایگزین استفاده از مکان نما به روز رسانی است. به عنوان مثال، در مثال قبلی که در آن فیلد LU_NUM بر اساس مقادیر فیلد LU_TXT به روز می شود، مکان نما به روز رسانی را روی این دو فیلد تنظیم کرده و سپس از یک مشابه استفاده می کنید.اگر دیگریساختار برای تخصیص مقدار جدید.
برای مقایسه، راه حل کد با استفاده از مکان نما به روز رسانی به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Demo/City.gdb”
fc = “بسته ها”
arcpy.AddField_management(fc، “LU_NUM”، “SHORT”)
با arcpy.da.UpdateCursor(fc, [“LU_TXT”, “LU_NUM”]) به عنوان مکان نما:
برای ردیف در مکان نما:
if row[0] == “GOVERNMENT”:
ردیف [1] = 1
elif row[0] == “سازماني”:
ردیف [1] = 2
دیگر:
ردیف [1] = 3
cursor.updateRow(ردیف)
هر دو راه حل به یک اندازه معتبر هستند، اگرچه راه حل با استفاده از مکان نما به روز رسانی کوتاه تر است زیرا نیازی به ایجاد عملکرد سفارشی ندارد.
ذکر مختصری از Arcade مناسب است زیرا عبارات Arcade را می توان در اسکریپت پایتون استفاده کرد. مثال قبلی را در نظر بگیرید که در آن یک فیلد به صورت log تبدیل شده است. این کار را می توان با استفاده از عبارت Python زیر در ابزار Calculate Field انجام داد:
LOG_VALUE = math.log(!VALUE!)
عبارات Arcade نیز به نام فیلدها اشاره دارند، اما قبل از نام فیلد آمده استویژگی $. Arcade عملکردهای داخلی زیادی دارد، از جملهورود به سیستم (). عبارت Arcade برای انجام همان محاسبه به صورت زیر است:
LOG_VALUE = گزارش ($feature.VALUE)
علاوه بر تفاوت در نحو، هنگام نوشتن عبارات Arcade در ابزار Calculate Field، به جای ورودی های جداگانه برای یک عبارت و یک بلوک کد، فقط یک بلوک کد وجود دارد. در کادر محاورهای ابزار، این کد مانند شکل است.
همچنین میتوانید از یک عبارت Arcade در یک اسکریپت به صورت زیر استفاده کنید:
واردات کمان
arcpy.env.workspace = “C:/Demo/City.gdb”
fc = “بسته ها”
arcpy.AddField_management(fc، “LOG_VALUE”، “DOUBLE”)
express = “log($feature.VALUE)”
arcpy.CalculateField_management(fc، “LOG_VALUE”، عبارت،
“گذرگاه طاقدار”)
استفاده از عبارات Arcade در اسکریپت پایتون فایده چندانی ندارد و به راحتی می توان آنها را با تغییرات جزئی در پایتون بازنویسی کرد. اما این ویژگی امکان استفاده مجدد از عبارات Arcade موجود و پیچیده تر را فراهم می کند.
8.7کار با فایل های متنی
تاکنون بیشتر داده هایی که در این کتاب با آنها کار کرده اید، مانند مسیرها، مقادیر، فهرست مقادیر و غیره، در داخل خود اسکریپت یا داخل فایل های داده با فرمت GIS، مانند فایل های شکل، پایگاه های جغرافیایی و پایگاه داده قرار دارند. جداول با این حال، در بسیاری از موارد، داده ها در فایل های متنی ساده یا سایر فرمت های داده های جدولی نیز قرار دارند. پایتون چندین توابع برای کار با فرمت های مختلف دارد. در بسیاری از موارد، این فایلها از برنامههای کاربردی دیگر میآیند و از پایتون میتوان برای دستکاری این فایلها برای استفاده در ArcGIS Pro استفاده کرد. این بخش استفاده از فایل های متنی ساده (txt.) را بررسی می کند.
می توانید فایل های متنی را با استفاده ازباز کن()تابع، که دارای نحو زیر است:
open(name, {mode}, {buffering})
تنها آرگومان مورد نیاز یک نام فایل است و تابع یک شی فایل را برمی گرداند. به عنوان مثال، کد زیر یک فایل متنی موجود را از دیسک باز می کند:
f = open (“C:/Data/sample.txt”)
فقط استفاده از نام فایل به عنوان پارامتر، شی فایلی را که می توانید از آن بخوانید، برمی گرداند. اگر می خواهید کار دیگری مانند نوشتن در فایل انجام دهید، باید به صراحت با تعیین یک حالت بیان شود. رایج ترین مقادیر برای حالت به شرح زیر است:
r: حالت خواندنw: حالت نوشتن+: حالت خواندن/نوشتن (به حالت دیگری اضافه شده است)ب: حالت باینری (اضافه شده به حالت دیگری مانند rb، wb و موارد دیگر)آ: حالت ضمیمه
اگر آرگومان حالت ارائه نشده باشد، حالت خواندن به طور پیش فرض استفاده می شود. حالت نوشتن به شما امکان می دهد در فایل بنویسید. حالت خواندن/نوشتن را می توان به هر یک از حالت های دیگر اضافه کرد تا نشان دهد که خواندن و نوشتن مجاز است. حالت باینری به شما این امکان را می دهد که نحوه مدیریت یک فایل را تغییر دهید. بهطور پیشفرض، پایتون فرض میکند که با فایلهای متنی سروکار دارید که حاوی کاراکتر هستند. اگر با نوع دیگری از فایل مانند تصویر کار می کنید، می توانید اضافه کنیدببه حالت – برای مثال،”رب”. حالت افزودن به این معنی است که هر داده ای که روی فایل نوشته می شود به طور خودکار به انتهای فایل اضافه می شود.
پارامتر بافر، بافر کردن فایل ها را کنترل می کند. هنگامی که از بافر استفاده می شود، پایتون ممکن است از حافظه به جای فضای دیسک برای بهبود عملکرد استفاده کند. برای اندازههای متوسط فایل، معمولاً به بافر نیازی نیست.
برای ایجاد یک فایل متنی جدید، می توانید ازباز کن()عملکرد و حالت نوشتن را مشخص کنید:
f = open (“C:/Data/mytext.txt”، “w”)
چندین روش فایل برای دستکاری محتوای یک فایل متنی وجود دارد، از جملهنوشتن()،خواندن()، وبستن(). به مثال زیر توجه کنید:
f = open (“C:/Data/mytext.txt”، “w”)
f.write (“سیستم های اطلاعات جغرافیایی”)
f.close()
اجرای این کد یک شی فایل جدید ایجاد می کند. اگر فایل mytext.txt از قبل وجود داشته باشد، فایل موجود رونویسی می شود، پس مراقب باشید. اگر فایلهایی را به این روش در اسکریپتهایی ایجاد میکنید که قرار است توسط دیگران استفاده شود، ممکن است لازم باشد برای تعیین اینکه آیا فایلها از قبل وجود دارند، یک بررسی اضافه کنید. درنوشتن()متد یک رشته در فایل می نویسد وبستن()متد فایل را می بندد (و محتویات آن را ذخیره می کند).
کد خواندن یک فایل به صورت زیر است:
f = open (“C:/Data/mytext.txt”)
f.read()
نتیجه این است
“سیستم های اطلاعات جغرافیایی”
توجه داشته باشید:مثالهای کد در این بخش فرض میکنند که شما کد را در مفسر تعاملی اجرا میکنید. می توانید با افزودن پیام های چاپی به نتایج مشابهی با یک اسکریپت برسید.
هنگام باز کردن یک فایل فقط برای خواندن محتویات آن، نیازی به تعیین حالت نیست زیرا حالت خواندن پیش فرض است. درخواندن()روش برای خواندن محتویات فایل متنی استفاده می شود. زمانی که هیچ آرگومانی مشخص نشده باشد، اسکریپت کل محتویات فایل را می خواند. یک آرگومان اختیاری می تواند برای نشان دادن تعداد کاراکترهای خوانده شده ارائه شود.
اکثر فایل های متنی از چندین خط تشکیل شده اند و چندین روش فایل برای کار با خطوط وجود دارد. شما می توانید یک خط را با استفاده ازreadline()روش. برای خواندن تمام خطوط یک فایل و بازگرداندن آنها به عنوان یک لیست، می توانید از آن استفاده کنیدReadlines()روش.
در مرحله بعد، چند نمونه را در نظر بگیرید. همانطور که در شکل نشان داده شده است، فایل متنی را در نظر بگیرید.
خواندن محتویات این فایل را میتوان به روشهای مختلفی انجام داد که از آن شروع میشودخواندن()روش، به شرح زیر:
f = open (“C:/Data/sqltext.txt”)
f.read()
نتیجه این است
“ساختارمند\nپرسش\nزبان”
توجه داشته باشید کهخواندن()متد تمام خطوط را می خواند و نتیجه را به صورت یک رشته برمی گرداند. جداکننده های خط در فایل متنی برگشتی، کاراکترهای \n هستند.
بعدی استreadline()روش. مثلا:
f = open (“C:/Data/sqltext.txt”)
f.readline()
نتیجه این است
“ساختارمند\n”
و دوباره بدوید:
f.readline()
نتیجه این است
‘پرس و جو\n’
و دوباره بدوید:
f.readline()
نتیجه این است
“زبان”
درreadline()متد خط بعدی را از فایل متنی می خواند و آن را به صورت رشته ای برمی گرداند. ادامه استفاده ازreadline()متد خطوط زیر را برمی گرداند. جداکننده های خط (\n) نیز برگردانده می شوند.
در نهایت،Readlines()متد تمام خطوط فایل ها را می خواند و نتیجه را به صورت لیست برمی گرداند. مثلا:
f = open (“C:/Data/sqltext.txt”)
f.readlines()
نتیجه این است
[‘ساختار\n’، ‘پرسش\n’، ‘زبان’]
نوشتن یک فایل با چند خط می تواند با استفاده ازنوشتن()وWritlines()مواد و روش ها. برای افزودن خطوط جدید، باید از جداکننده خط (\n) استفاده شود. مثلا:
f = open (“C:/Data/tintext.txt”، “w”)
f.write (“مثلثی\nنامنظم\nگره”)
f.close()
با اجرای این کد یک فایل متنی جدید با سه خط همانطور که در شکل نشان داده شده است ایجاد می شود.
درWritlines()روش را می توان برای تغییر رشته برای یک خط استفاده کرد. مثلا:
f = open (“C:/Data/tintext.txt”)
lines = f.readlines()
f.close()
خطوط[2] = “شبکه”
f = open (“C:/Data/tintext.txt”، “w”)
f.writelines (خطوط)
f.close()
در این مثال،Readlines()روش برای برگرداندن محتویات فایل متنی به صورت لیست استفاده می شود. سپس فایل بسته می شود و یک مقدار جدید به یکی از عناصر موجود در لیست اختصاص می یابد. فایل دوباره در حالت نوشتن باز می شود وWritlines()متد برای به روز رسانی مقدار رشته آن خط استفاده می شود. اجرای این کد منجر به فایل متنی می شود که در شکل نشان داده شده است.
به خاطر داشته باشید که خطوط جدید به طور خودکار اضافه نمی شوند، به این معنی که باید خودتان آنها را با استفاده از جداکننده خطوط (\n) اضافه کنید.
به طور معمول، شما باید فایل های خود را با تماس گرفتن ببندیدبستن()روش. هنگامی که یک فایل را در حالت خواندن باز می کنید، فراخوانی این روش حیاتی نیست زیرا وقتی از برنامه با استفاده از فایل خارج می شوید، شی فایل به طور خودکار بسته می شود.
هنگام کار با فایل ها، منطقاً اولین کاری که انجام می دهید این است که آنها را باز کنید. همانطور که در مثال های قبلی نشان داده شد، باز کردن بیشتر با استفاده از داخلی انجام می شودباز کن()عملکرد. نکته بعدی که باید یاد بگیرید این است که چگونه فایل ها را به درستی ببندید. به طور معمول، هنگامی که یک اسکریپت خاتمه می یابد، فایلی که باز شده است به طور خودکار بسته می شود، اما هیچ راه مطمئنی برای دانستن اینکه دقیقا چه زمانی این اتفاق می افتد وجود ندارد. این حالت نامطمئن می تواند منجر به رفتار نامطلوب شود. بستن فایل های شما همچنین از قفل شدن بی مورد فایل ها جلوگیری می کند. هنگام نوشتن روی یک فایل، همیشه باید وقتی کارتان تمام شد آن را ببندید، زیرا ممکن است پایتون دادههایی را که نوشتهاید در حافظه بافر کند و اگر برنامه از کار بیفتد، ممکن است اصلاً دادهها نوشته نشود. بنابراین، بستن صحیح فایل به عنوان بخشی از اسکریپت تمرین خوبی است.
یک روش جایگزین برای بستن یک فایل استفاده از a استبابیانیه ای که به شکل زیر است:
با open(<file>) به عنوان <variable>:
<کد برای پردازش فایل>
دربابیانیه یک بار به طور خودکار فایل را می بنددبابلوک کد تکمیل می شود، حتی در صورت خطا. نیازی به استفاده ازبستن()روش در این مورد در نتیجه، استفاده ازبابیانیه ها هنگام باز کردن فایل ها به شدت توصیه می شود. منجر به کد پاکتر میشود و رسیدگی به خطاها را تسهیل میکند. بر اساس مثال قبلی، کد زیر از a استفاده می کندباعبارت برای ایجاد یک فایل متنی خالی جدید و نوشتن متنی:
با open(“C:/Data/with.txt”، “w”) به صورت f:
f.write (“بیشتر با دستورات استفاده کنید.”)
یک فایل را می توان با استفاده ازبستن()روش، همانطور که در مثال های قبلی نشان داده شده است. این رویکرد را می توان با استفاده از a قوی تر کردتلاش کن در نهایتساختار مثلا:
f = open (“mytext.txt”)
تلاش كردن:
<کد برای پردازش فایل>
سرانجام:
f.close()
استفاده ازتلاش کن در نهایتساختار تضمین می کند که فایل بدون توجه به هر گونه خطا در خطوط قبلی کد بسته می شود.
توجه داشته باشید:استفاده ازبابیانیه ها بهترین عملکرد را نشان می دهد و بنابراین بیش از استفاده از آن توصیه می شودبستن()روش.
در مثال های قبلی، نحوه نوشتن یک مقدار جدید در یک خط خاص را دیدید. اصلاح یک فایل متنی با استفاده از پایتون یک تکنیک رایج است. بسیاری از فایل های داده از برنامه های کاربردی دیگر در قالب متن هستند اما به طور مستقیم توسط ArcGIS Pro قابل استفاده نیستند. به جای دستکاری دستی فایل متنی، می توانید از پایتون برای خودکارسازی این کار استفاده کنید. در مثال قبلی، یک تغییر در یک مکان خاص انجام شد. با این حال، بسیار رایجتر است که جستجوی «یافتن و جایگزینی» را انجام دهیم که در صورت لزوم، متن را تغییر میدهد.
مثال زیر را از یک فایل متنی که حاوی مختصات جغرافیایی است در نظر بگیرید:
شناسه: 1، عرض جغرافیایی: 35.099722، طول جغرافیایی: -106.527550
شناسه: 2، عرض جغرافیایی: 35.133015، طول جغرافیایی: -106.583581
شناسه: 3، عرض جغرافیایی: 35.137142، طول جغرافیایی: -106.650632
شناسه: 4، عرض جغرافیایی: 35.093650، طول جغرافیایی: -106.573590
برای سهولت استفاده از فایل، میخواهید به شکل زیر باشد:
1 35.099722 -106.527550
2 35.133015 -106.583581
3 35.137142 -106.650632
4 35.093650 -106.573590
یک روش باز کردن فایل در یک ویرایشگر متن و انجام جستجوی Find-and-Replace است. با این حال، همین کار را می توان به طور مستقیم در پایتون انجام داد. لازم است که روی محتویات یک فایل تکرار کنید و همین کار را مکررا انجام دهید. چندین روش برای تکرار وجود دارد. در بیشتر موارد، میتوانید از یک رویکرد استفاده کنید، اما دانستن برخی از گزینههای مختلف، بهویژه زمانی که سعی در درک کد شخص دیگری دارید، مفید است.
اگرچه تکرار بر روی کاراکترهای فردی می تواند مفید باشد، تکرار روی خطوط در یک فایل متنی رایج تر است. چندین روش برای تکرار روی خطوط متن وجود دارد.
اول، فایلهای موجود در پایتون را میتوان مستقیماً در a استفاده کردبرایحلقه برای تکرار روی خطوط آنها. کد به شرح زیر است:
با open(“C:/Data/mytext.txt”) به صورت f:
برای خط در f:
<پردازش>
این کد شاید زیباترین نسخه تکرار روی خطوط متن باشد زیرا کد کوتاه است و مستقیماً از این واقعیت استفاده می کند که می توانید روی خطوط فایل تکرار کنید.
تکرار همچنین می تواند با استفاده ازReadlines()روش. مثلا:
با open(“C:/Data/mytext.txt”) به صورت f:
در حالی که درست است:
line = f.readline()
اگر خط نیست:
زنگ تفريح
<پردازش>
برای فایلهای نسبتاً کوچک، میتوانید کل فایل را در یک مرحله با استفاده از آن بخوانیدخواندن()روش (برای خواندن کل فایل به صورت رشته ای) یاReadlines()روش (برای خواندن فایل در لیست رشته ها). مثلا:
با open(“C:/Data/mytext.txt”) به صورت f:
برای خط در f.readlines():
<پردازش>
خواندن کل فایل با استفاده ازخواندن()روش یاReadlines()روش می تواند از حافظه بیش از حد استفاده کند. یک جایگزین استفاده از a استدر حالی کهحلقه باreadline()روش. جایگزین دوم استفاده ازورودی فایلماژول به جایباز کن()عملکرد. این ماژول به شما این امکان را می دهد که یک شی ایجاد کنید که بتوانید آن را در یک تکرار کنیدبرایحلقه مثال زیر ازورودی()عملکرد ازورودی فایلماژول، که شبیه به استفاده از مکان نما هنگام استفاده از ArcPy برای کار با کلاس ها و توابع ویژگی است:
وارد کردن ورودی فایل
با fileinput.input (“C:/Data/mytext.txt”) به صورت f:
برای خط در f:
<پردازش>
رویکردی که شما استفاده می کنید تا حد زیادی یک موضوع ترجیحی است، اماورودی فایلاغلب زمانی استفاده می شود که فایل ها احتمالاً بزرگ هستند.
اکنون که ساختار کلی تکرار در خطوط را مشاهده کردید، وقت آن است که به یک مثال واقعی نگاه کنید و فایل متنی را که استفاده میکردیم، به نام koordinates.txt، که در شکل نشان داده شده است، دوباره بررسی کنید.
فرض کنید می خواهید آن را به یک فایل متنی کاهش دهید که فقط شامل مقادیر مشخصه مربوطه جدا شده با یک فاصله است، بدون نام فیلدها (ID، Latitude، Longitude). می توانید این کار را با تکرار روی خطوط و استفاده از آن انجام دهیدجایگزین کردن()روش برای رشته ها هنگام دستکاری فایل های متنی، تمرین خوبی است که نتیجه خود را در یک فایل جدید ذخیره کنید. به این ترتیب اگر کد دقیقاً مطابق انتظار عمل نکند، هیچ یک از داده های اصلی خود را از دست نخواهید داد.
اسکریپت زیر یک فایل موجود را در آن باز می کندخواندن()حالت و یک فایل خروجی جدید در آن ایجاد می کندنوشتن()حالت آبرایحلقه برای تکرار روی خطوط در فایل ورودی استفاده می شود. در بلوک کد زیر،جایگزین کردن()روش سه بار برای حذف رشته های خاص از هر خط استفاده می شود. رشته به دست آمده در فایل خروجی نوشته می شود. کد به شرح زیر است:
با open(“C:/Data/coordinates.txt”) به عنوان ورودی:
با open(“C:/Data/coordinates_clean.txt”، “w”) به عنوان خروجی:
برای خط ورودی:
mystr = line.replace(“ID:”، “”)
mystr = mystr.replace(“، Latitude:”، “”)
mystr = mystr.replace(“، طول:”، “”)
output.write(mystr)
این مثال همچنین استفاده از تودرتو را نشان می دهدباعبارات – اولی برای خواندن فایل متنی موجود و دومی برای نوشتن در یک فایل متنی خالی جدید. جایگزینی برای استفاده از تو در توبادستورات به این صورت است که آنها را در یک دستور ترکیبی در یک خط کد به صورت زیر قرار دهیم:
با open(“C:/Data/coordinates.txt”) به عنوان ورودی، open(
“C:/Data/coordinates_clean.txt”، “w”) به عنوان خروجی:
استفاده از دستور ترکیبی نیاز به سطح اضافی تورفتگی را کاهش می دهد، اما خط کد می تواند طولانی و پیچیده شود.
اجرای این کد منجر به فایل متنی می شود که در شکل نشان داده شده است.
فصل 9 نشان می دهد که چگونه می توان از یک فایل متنی مانند این برای ایجاد هندسه های جدید استفاده کرد.
8.8کار با فایل های CSV
اگرچه فایل های متنی به طور گسترده مورد استفاده قرار می گیرند، اغلب فاقد قالب بندی استاندارد هستند. برای مثال، اگر باید فایلهای متنی را به جدول پایگاه داده تبدیل کنید، معمولاً باید هر فایل متنی را باز کنید تا مشخص کنید چه نوع پاکسازی لازم است. به عنوان جایگزین، یکی دیگر از فرمت های پرکاربرد، مقادیر جدا شده با کاما (CSV) است. همانطور که از نام آن پیداست، یک فایل CSV از متن ساده و بدون قالب بندی تشکیل شده است، اما مقادیر مورد علاقه با کاما از هم جدا می شوند.
شکل همراه نمونه فایل CSV را نشان می دهد.
فایل شبیه یک فایل متنی ساده است، اما مقادیر مورد علاقه با کاما از هم جدا می شوند. هیچ فضای خالی بین مقادیر وجود ندارد. فایلهای CSV با ذخیره یک فایل متنی موجود با پسوند فایل csv. یا با صادر کردن یک فایل از صفحه گسترده یا برنامه پایگاه داده ایجاد میشوند.
اگر از مایکروسافت آفیس استفاده میکنید، نگاه کردن به فایلهای CSV در سیستمعامل ویندوز میتواند گمراهکننده باشد، زیرا بهعنوان فایلهای Microsoft Excel CSV ظاهر میشوند. این یک ارتباط نوع فایل است که توسط مایکروسافت آفیس استفاده میشود و فایلهای CSV مانند فایلهای عادی اکسل نیستند. با این حال، هنگامی که روی یک فایل CSV در File Explorer در ویندوز دوبار کلیک می کنید، فایل به گونه ای باز می شود که گویی یک کاربرگ اکسل است.
فایل های CSV را می توان در اسکریپت های پایتون با استفاده از داخلی استفاده کردcsvمدول. درcsvماژول شامل تمام قابلیت های لازم برای کار با فایل های CSV، به ویژهcsv.reader()عملکرد.
برای خواندن محتوای یک فایل CSV مثال زیر را در نظر بگیرید:
وارد کردن csv
با open(“C:/Data/csv_example.csv”) به صورت f:
خواننده = csv.reader(f)
برای ردیف در خواننده:
چاپ (ردیف)
این منجر به موارد زیر می شود:
[‘ID’، ‘POINT_X’، ‘POINT_Y’]
[‘1’, ‘510812.53’, ‘3899995.64’]
[‘2’, ‘510594.00’, ‘3899400.97’]
[‘3’، ‘509414.30’، ‘3898450.97’]
…
شما ابتدا وارد کنیدcsvماژول و فایل CSV را با استفاده ازباز کن()عملکرد در یکبابیانیه. بعد،csv.reader()تابع محتویات فایل را خط به خط یا سطر به ردیف می خواند. این شبیه به تنظیم مکان نما است، اگرچه ArcPy از کلاس های مکان نما استفاده می کند وcsv.reader()یک تابع است.
درcsv.reader()تابع امکان تکرار روی خطوط را فراهم می کند و برای هر خط (یا ردیف)، تابع لیستی از مقادیر را برمی گرداند. از آنجا که نتیجه یک لیست است، دستکاری آن راحت است. به عنوان مثال، می توانید مقادیر ID را با استفاده از یک شاخص بدست آورید:
چاپ (ردیف[0])
به روشی مشابه، می توانید مختصات را به متغیرها اختصاص دهید. یک مشکل جزئی وجود دارد که خط اول این فایل CSV خاص است. خط اول شامل یک هدر است که شامل نام فیلدها می شود. اگرچه این اطلاعات مرتبط است، اما برای ایجاد جدولی از جفت مختصات به این مقادیر نیاز ندارید. شما می توانید خط اول را با استفاده از داخلی پایتون رد کنیدبعد()عملکرد قبل از تکرار این تابع تضمین می کند که تکرار از خط دوم، جایی که اطلاعات مختصات شروع می شود، شروع می شود.
کد زیر فایل CSV را می خواند، خط اول را رد می کند و شماره شناسه و مختصات را به متغیرها اختصاص می دهد:
وارد کردن csv
با open(“C:/Data/csv_example.csv”) به صورت f:
خواننده = csv.reader(f)
بعدی (خواننده)
برای ردیف در خواننده:
شناسه = ردیف[0]
xcoord = ردیف[1]
ycoord = ردیف[2]
چاپ (ID، xcoord، ycoord)
فقط برای تایید، مقادیر به صورت زیر چاپ می شوند:
1 510812.53 3899995.64
2 510594.00 3899400.97
3 509414.30 3898450.97
4 510486.66 3898251.44
…
چاپ فقط به عنوان یک مکان نگهدار موقت برای کار دیگری مانند ایجاد ویژگی های جدید با استفاده از مختصات عمل می کند. فصل 9 این وظیفه را پوشش می دهد.
اگرچه محتویات فایلهای CSV را میتوان مستقیماً با استفاده از پایتون دستکاری کرد، ابزارهای پردازش جغرافیایی که از جدول بهعنوان پارامتر ورودی استفاده میکنند، معمولاً یک فایل CSV را به عنوان ورودی معتبر میپذیرند. به عنوان مثال، ابزار XY Table to Point یک کلاس ویژگی نقطه جدید را بر اساس مختصات x,y در یک جدول ایجاد می کند و این جدول می تواند با فرمت CSV باشد. کد زیر نمونه ای از ابزار XY Table to Point را نشان می دهد:
واردات کمان
arcpy.env.workspace = “C:/Data”
csvfile = “csv_example.csv”
outfc = “testpoints.shp”
arcpy.XYTableToPoint_management(csvfile، outfc، “POINT_X”، “POINT_Y”)
اگرچه برخی از ابزارهای پردازش جغرافیایی فایلهای CSV را به عنوان ورودی میپذیرند، اما توانایی خواندن و دستکاری فایلهای CSV به طور مستقیم در پایتون، گزینههای بیشتری را برای تمیز کردن و پردازش محتویات آنها فراهم میکند.
نکاتی که باید به خاطر بسپارید
- ماژول دسترسی به داده ArcPy،da، از ویرایش و کار با مکان نما برای دستکاری داده ها پشتیبانی می کند.
- نشانگرها می توانند روی ردیف های جدول تکرار شوند. تکرار معمولاً با استفاده از a انجام می شودبرایحلقه یا aبابیانیه.
- مکان نماهای جستجو روی رکوردها تکرار می شوند و ویژگی های مورد علاقه را پیدا می کنند. درج نشانگرها رکوردهای جدید را اضافه می کند و ویژگی های جدیدی ایجاد می کند. نشانگرهای بهروزرسانی تغییراتی را ایجاد میکنند، از جمله تغییر مقادیر ویژگی و حذف رکوردها.
- عبارات SQL در پایتون می توانند داده ها را با استفاده از مکان نماهای جستجو جستجو کنند. کوئری هایی که با استفاده از SQL در پایتون انجام می شوند از عبارت WHERE استفاده می کنند. نحو مناسب پرس و جوها با استفاده ازAddFieldDelimiters()عملکرد. سایر بندهای SQL پشتیبانی شده عبارتند از DISTINCT، GROUP BY، ORDER و TOP.
- نام جدول و فیلد را می توان با استفاده ازValidateTableName()وValidateFieldName()توابع، به ترتیب. این توابع همه کاراکترهای نامعتبر را به خط زیر (_) تبدیل می کنند. درCreateUniqueName()تابع می تواند با افزودن یک عدد به نام موجود، یک نام منحصر به فرد ایجاد کند.
- نام جداول و فیلدها را می توان با استفاده از توابع تجزیه ArcPy به عناصر جداگانه تجزیه کردParseTableName()وParseFieldName().
- پایتون همچنین برای نوشتن عبارات در ابزار Calculate Field استفاده می شود. این شامل عبارات اساسی برای محاسبه مقادیر فیلد بر اساس یک فیلد موجود دیگر، و همچنین محاسبات پیچیده تر با استفاده از توابع سفارشی در یک بلوک کد است.
- محتویات فایل های متنی را می توان در پایتون دستکاری کرد. درباز کن()تابع یک شی فایل ایجاد می کند و از چندین روش می توان برای خواندن و نوشتن متن استفاده کرد، از جملهخواندن()،readline()،Readlines()،نوشتن()، وWritlines(). یکی از متداولترین عملیات روی فایلها، تکرار روی خطوط آنها برای انجام مکرر دستکاریهای مشابه، مانند جایگزینی رشتهها برای قابل استفادهتر کردن فایلهای متنی است.
- فایلهای CSV یک جایگزین پرکاربرد برای فایلهای متنی هنگام کار با دادههای جدولی هستند. پایتون داخلیcsvماژول را می توان برای خواندن محتویات فایل های CSV استفاده کرد.
شرایط کلیدی
- مکان نما
- مقادیر جدا شده با کاما (CSV)
- عملکرد سفارشی
- قفل داده
- شخصیت فرار
- قفل اختصاصی
- درج مکان نما
- جداکننده خط
- حالت
- تجزیه
- بند پسوند
- بند پیشوند
- ردیف
- مکان نما جستجو
- قفل مشترک
- بند SQL
- بیان SQL
- کلمه کلیدی SQL
- بیانیه SQL
- زبان جستجوی ساختاریافته (SQL)
- نقل قول های سه گانه
- به روز رسانی مکان نما
سوالات را مرور کنید
- سه مکاننمای مختلف کدامند و هر کدام چه هدفی را دنبال میکنند؟
- نحوه ایجاد قفل داده و نحوه حذف آنها را توضیح دهید.
- هنگام نوشتن عبارات SQL، چرا علامت نقل قول گاهی اوقات مشکل ساز است؟ راهکارهای مقابله با این موضوع را توضیح دهید.
- کدام بندهای SQL هنگام نوشتن پرس و جو برای استفاده در توابع ArcPy پشتیبانی می شوند؟
- مثال هایی از استفاده از توابع ArcPy برای اعتبارسنجی نام مجموعه داده ها ارائه دهید.
- استفاده از یک تابع سفارشی را برای انجام محاسبات میدانی با استفاده از ابزار Calculate Field توضیح دهید.
- مراحل خواندن داده ها از یک فایل متنی یا یک فایل CSV را در یک اسکریپت شرح دهید.
بدون دیدگاه