کار با هندسه عوارض با پایتون -فصل 9
9.1معرفی
این فصل نحوه کار با هندسه ها را شرح می دهد، از جمله نحوه خواندن ویژگی های اجسام هندسی از ویژگی های موجود و نحوه ایجاد اشیاء هندسی جدید از اطلاعات مختصات. ویژگی های فردی مانند نقاط، چند خط و چند ضلعی ها را می توان به رئوس آنها تقسیم کرد. هندسه ها با ایجاد اشیاء هندسی از فهرست مختصات آن رئوس نوشته می شوند. توانایی خواندن و نوشتن هندسه ها، کنترل دقیق کلاس های ویژگی، ویژگی ها و بخش ها و رئوس هایی را که ویژگی ها را تشکیل می دهند، فراهم می کند.
9.2کار با اشیاء هندسی و نشانه ها
هر ویژگی در یک کلاس ویژگی از رئوس تشکیل شده است. راس یک جفت مختصات x,y است. این رئوس با استفاده از اشیاء هندسی مانند نقاط، چند خط و چند ضلعی قابل دسترسی است. میتوانید با تنظیم مکاننما در فیلد هندسه، که معمولاً Shape نام دارد، از یک کلاس ویژگی، با اشیاء هندسی و ویژگیهای آنها کار کنید. تنظیم مکان نما با استفاده از یک نشانه هندسی به جای نام فیلد انجام می شود. مثال زیر استفاده از مکان نما جستجو را برای خواندن اجسام هندسی یک کلاس ویژگی با استفاده از نشانه نشان می دهد.شکل@.
واردات کمان
fc = “C:/Data/roads.shp”
با arcpy.da.SearchCursor(fc, ” SHAPE@ “) به عنوان مکان نما:
<پردازش>
از فصل 8 به یاد بیاورید که با استفاده از aباهنگام کار با مکان نماها برای آزاد کردن قفل های احتمالی داده، بیانیه بهترین روش است. متناوبا، همان اسکریپت را می توان به صورت زیر نوشت:
واردات کمان
fc = “C:/Data/roads.shp”
مکان نما = arcpy.da.SearchCursor(fc, ” SHAPE@ “) به عنوان مکان نما:
<پردازش>
اگر یکبادستور استفاده نمی شود، شی مکان نما معمولاً در انتهای اسکریپت حذف می شود – به عنوان مثال،نشانگر-اگرچه حذف برای مکان نما جستجو لازم نیست زیرا منجر به قفل انحصاری نمی شود.
درشکل@توکن به شی هندسه کامل و تمام خصوصیات آن دسترسی می دهد. دسترسی به اجسام با هندسه کامل می تواند زمان بر باشد. در نتیجه، اسکریپت هایی که با اشیاء هندسی کامل مجموعه داده های بزرگ کار می کنند، می توانند نسبتا کند شوند. اگر فقط به ویژگی های خاصی از هندسه نیاز دارید، می توانید از نشانه های هندسی خاص به عنوان میانبر برای دسترسی به این ویژگی های هندسه استفاده کنید. مثلا،SHAPE@XYچند مختصات x,y را که مرکز مشخصه را نشان می دهد، برمی گرداندSHAPE@LENGTHطول ویژگی را برمی گرداند. استفاده از اینها به طور کلی سریعتر از استفاده استشکل@برای دسترسی به شی هندسه کامل مثال زیر طول ترکیبی همه ویژگیهای یک کلاس ویژگی چندخطی را تعیین میکند:
واردات کمان
fc = “C:/Data/roads.shp”
با arcpy.da.SearchCursor(fc, ” SHAPE@LENGTH “) به عنوان مکان نما
طول = 0
برای ردیف در مکان نما:
طول += ردیف[0]
چاپ (طول)
در این مثال، مکان نما جستجو ازSHAPE@LENGTHنشانه هندسه زمانی که فقط به ویژگی های خاصی نیاز باشد، استفاده از نشانه های هندسه کافی خواهد بود. شما می توانید نشانه های هندسی را به عنوان میانبرهایی برای ویژگی های خاص در نظر بگیرید. عملیات پیچیده تر، و همچنین ایجاد هندسه جدید، نیاز به استفاده از شی هندسه کامل با استفاده ازشکل@.
9.3درک اجسام هندسی
هر ویژگی در یک کلاس ویژگی از یک یا چند راس تشکیل شده است که ویژگی های نقطه، چند خط یا چند ضلعی را تعریف می کند. در مورد کلاس ویژگی نقطه ای، هر ویژگی نقطه ای از یک راس تشکیل شده است. ویژگی های چند خطی و چند ضلعی از چندین راس تشکیل شده است. هر رأس مکانی است که با یک جفت مختصات x,y تعریف شده است. شکل نشان می دهد که چگونه نقاط، چند خط و چند ضلعی توسط رئوس در فضای مختصات دکارتی تعریف می شوند. مثالها فقط مفهومی هستند و یک سیستم مختصات دنیای واقعی را نشان نمیدهند.
شرح
رئوس برای انواع ویژگی های مختلف. رئوس برای یک نقطه (2،4) است. برای چند خط (1،2)، (2،1)، و (4،1)؛ و برای چند ضلعی (4،4)، (6،4)، (6،3)، (5،2)، و (4،3).
ArcPy چندین کلاس برای کار با اشیاء هندسی دارد. اول، یک ژنریککمان.هندسهکلاس اشیاء هندسی ایجاد می کند. نحو کلی ازهندسهکلاس به شرح زیر است:
arcpy.Geometry(هندسه، ورودیها، {spatial_reference}،
{has_z}، {has_m})
درهندسهپارامتر نوع هندسه را به عنوان یک رشته مشخص می کند – یعنی نقطه، چند خط، چند ضلعی یا چند نقطه. درورودی هاپارامتر مختصات (یعنی رئوس) مورد استفاده برای ایجاد شی را نشان می دهد. این رئوس می توانند به صورت هر کدام باشندنقطهیاآرایهاشیاء، که در ادامه در این بخش توضیح داده شده است.
اشیاء هندسه اغلب برای انجام وظایف در حافظه به جای ایجاد یک کلاس ویژگی موقت جدید یا اصلاح کلاس های ویژگی موجود استفاده می شوند. کد مثال زیر را در نظر بگیرید که از کد استفاده می کندهندسهکلاس برای تعیین طول کل همه ویژگی های یک کلاس ویژگی:
واردات کمان
fc = “C:/Data/roads.shp”
geoms = arcpy.CopyFeatures_management(fc، arcpy.Geometry())
طول = 0
برای geom در geoms:
طول += geom.length
چاپ (طول)
چند مشاهده در مورد این مثال به ترتیب است. درهندسهکلاس دارای دو پارامتر مورد نیاز است، اما آنها به صراحت بیان نشده اند. در عوض، پارامترها به طور ضمنی ارائه می شوند زیراarcpy.Geometry()پارامتر خروجی یک ابزار ژئوپردازش است. در نتیجه، کد برای هر نوع هندسه کار می کند. این که یک کلاس ویژگی چند خطی به نام roads.shp یک ویژگی طولی دارد تا حدودی شهودی است، اما همان کد روی ویژگی های نقطه و چند ضلعی نیز کار می کند. در مورد چند ضلعی ها، نتیجه حاصل جمع محیط های ویژگی های چندضلعی است. در مورد امتیاز، نتیجه صفر است. همه اشیاء هندسی دارای ویژگیها و روشهای یکسانی هستند، اما برخی از آنها برای انواع خاصی از جمله مساحت و طول برای ویژگیهای نقطه اعمال نمیشوند.
اگرچه عمومی استهندسهکلاس می تواند هر نوع هندسه ای ایجاد کند، ArcPy چهار کلاس هندسه دیگر دارد:چند نقطه ای،هندسه نقطه ای،چند ضلعی، وپلی لاین. علاوه بر این، ArcPy از دو کلاس دیگر برای کمک به ساخت هندسه استفاده می کند:آرایهونقطه. رابطه بین این کلاس ها نیاز به کمی توضیح دارد.
اساسی ترین شیء استنقطهشی، که با استفاده ازنقطهکلاس این شی معادل یک راس واحد است و برای ایجاد تمام اشیاء هندسی دیگر استفاده می شود. نحو کلی ازنقطهکلاس است
arcpy.Point({X}، {Y}، {Z}، {M}، {ID})
هیچ یک از پارامترها مورد نیاز نیست، که به شما امکان می دهد یک خالی ایجاد کنیدنقطهشیء کنید و بعداً ویژگی های آن را پر کنید. اما منطقاً استفاده از a منطقی نخواهد بودنقطهشی مگر اینکه حداقل یک جفت مختصات x,y داشته باشید. مثال زیر یک تک ایجاد می کندنقطههدف – شی:
point = arcpy.Point(4.900160, 52.378424)
همانطور که مثال نشان می دهد، الفنقطهشی معمولاً بیش از یک جفت مختصات x,y نیست. در این مثال، مختصات نشان دهنده طول و عرض جغرافیایی ایستگاه مرکزی در آمستردام، هلند است، اما مهم است که بدانیم مرجع مکانی بخشی ازنقطهکلاس
آنقطهشی یک شی هندسی نیست، اما می توان از آن برای ساخت هندسه استفاده کرد. این کار را می توان با استفاده ازهندسه نقطه ایکلاس نحو کلی این کلاس است
arcpy.PointGeometry(ورودیها، {spatial_reference}، {has_z}، {has_m})
توجه داشته باشید که این نحو با نحو یکسان استهندسهکلاس به جز پارامتر geometry که در نوع شی هندسی برای این کلاس – یعنی یک ویژگی نقطه ای – ضمنی است. درهندسه نقطه ایکلاس یک پارامتر مرجع فضایی دارد. کد زیر نشان می دهد که چگونه aنقطهشی یک شی هندسی می سازد با استفاده ازهندسه نقطه ایکلاس:
point = arcpy.Point(4.900160, 52.378424)
pointgeo = arcpy.PointGeometry(point, 4326)
مرجع مکانی با کد کارخانه برای سیستم مختصات جغرافیایی (GCS) با داده سیستم جهانی ژئودتیک 1984 (WGS84) نشان داده می شود. به عنوان جایگزین، نام”GCS_WGS_1984″می تواند استفاده شود. هنگامی که شی هندسه ایجاد شد، می توان از آن در عملیات پردازش جغرافیایی یا برای ایجاد یک ویژگی جدید در یک کلاس ویژگی استفاده کرد. بخشهای 9.7 و 9.9 این مثالها را مورد بحث قرار میدهند.
مهم است که تفاوت بیننقطهوهندسه نقطه ایاشیاء. آنقطهشی از کمی بیشتر از یک جفت مختصات x,y تشکیل شده است و دارای تعداد محدودی ویژگی و روش است. به عنوان مثال، بدون توجه به ماهیت مختصات، مرجع مکانی ندارد. آهندسه نقطه ایشی یک شی هندسی است و در نتیجه دارای تعداد بسیار گستردهتری از ویژگیها و روشها، از جمله مرجع فضایی است.
ویژگی های چند خطی و چند ضلعی از چند رأس تشکیل شده و با استفاده از دو یا بیشتر ساخته می شوندنقطهاشیاء. برای تسهیل کار با چندیننقطهاشیاء، ArcPy ازآرایهکلاس این کلاس به طور خاص برای ساخت اشیاء هندسی چند خطی و چندضلعی ایجاد شده است. مثال زیر نشان می دهد که چگونه دونقطهاز اشیاء برای ایجاد یکی استفاده می شودپلی لاینهدف – شی:
point1 = arcpy.Point(0, 0)
point2 = arcpy.Point(100, 100)
آرایه = arcpy.Array([point1, point2])
polyline = arcpy.Polyline (آرایه)
چاپ (پلی خط. طول)
نتیجه چاپ می شود141.4213562373095.
در این مثال،آرایهشی با استفاده از یک لیست از دو ایجاد می شودنقطهاشیاء. از نظر مفهومی، یکآرایهشی مانند یک لیست است، اما به طور خاص برای ذخیره استفاده می شودنقطهاشیاء به جای دیگر انواع عناصر. درآرایهشی یک واحد ایجاد می کندپلی لاینهدف – شی. از آنجایی که یک شی هندسی است، می توانید با ویژگی های آن مانند طول کار کنید. از آنجا که هیچ مرجع مکانی تنظیم نشده است، واحدهای ویژگی length تعریف نشده اند.
شما می توانید چندین شی هندسی ایجاد کنید و آنها را مستقیماً با استفاده از روش های اجسام هندسی مقایسه کنید. به عنوان مثال، کد زیر دو را ایجاد می کندپلی لایناشیاء و تعیین می کند که آیا آنها از یکدیگر عبور می کنند:
واردات کمان
point1a = arcpy.Point(0,0)
point1b = arcpy.Point(100, 100)
point2a = arcpy.Point(100, 0)
point2b = arcpy.Point(0, 100)
array1 = arcpy.Array([point1a, point1b])
array2 = arcpy.Array([point2a, point2b])
polyline1 = arcpy.Polyline(array1)
polyline2 = arcpy.Polyline(array2)
چاپ (polyline1.crosses(polyline2))
نتیجه چاپ می شوددرست است، واقعیزیرا دو چند خط در محل (50، 50) تلاقی می کنند.
اگرچه این دو چند خط ساده هستند و از سیستم مختصات واقعی استفاده نمی کنند، اما تطبیق پذیری اجسام هندسی را نشان می دهند. خصوصیات هندسی و روابط بین اشیاء هندسی را می توان بدون نوشتن هیچ فایلی روی دیسک و بدون اجرای هیچ ابزار ژئوپردازش تعیین کرد.
نحو برای ایجادچند ضلعیاشیاء مشابه هستند، اما یک ویژگی چند ضلعی معنی دار حداقل به سه مورد نیاز داردنقطهاشیاء به شرح زیر
واردات کمان
point1 = arcpy.Point(0,0)
point2 = arcpy.Point(100, 0)
point3 = arcpy.Point(50, 50)
array = arcpy.Array([point1, point2, point3, point1])
چند ضلعی = کمان. چند ضلعی (آرایه)
چاپ (polygon.area)
درآرایهشی در این مثال از چهار مورد تشکیل شده استنقطهاشیاء زیرا راس شروع برای اطمینان از بسته شدن مناسب تکرار می شود. این شبیه به بستن یک چند ضلعی است که به صورت دستی یک ویژگی را در ArcGIS Pro ویرایش می کنید.
مثالهایی که تاکنون ارائه شدهاند از ویژگیهای ساده استفاده میکنند، اما نکات کلیدی اجسام هندسی را نشان میدهند. از مقادیر مختصات برای ایجاد رئوس به شکل استفاده می شودنقطهاشیاء. اینهانقطهاجسام برای ساخت اجسام هندسی با استفاده ازهندسه نقطه ایکلاس چندگانهنقطهاشیاء با استفاده از ترکیب ترکیب می شوندآرایهکلاس، که برای ساخت اجسام هندسی با استفاده ازپلی لاینوچند ضلعیکلاس ها. یک فرض سادهکننده تا کنون این است که اجسام هندسی فقط از یک بخش تشکیل شدهاند. بخش 9.5 اشیاء چند بخشی را مورد بحث قرار می دهد.
کار با اجسام هندسی چندین مزیت دارد. ابتدا، با ایجاد اشیاء هندسی، می توانید ویژگی ها را در یک کلاس ویژگی بنویسید. یک سناریوی معمولی ایجاد ویژگی ها از جدول مقادیر مختصات است. دوم، اشیاء هندسی را می توان در عملیات ژئوپردازش استفاده کرد. به جای ایجاد کلاسهای ویژگی موقت برای نگهداری هندسه، میتوانید اشیاء هندسه را در حافظه ایجاد کنید و مستقیماً از آنها در یک ابزار پردازش جغرافیایی استفاده کنید. بخش بعدی بررسی می کند که چگونه می توانید از درک خود از اجسام هندسی برای خواندن ویژگی های ویژگی های موجود استفاده کنید. پس از آن بخشی در مورد نحوه نوشتن هندسه های جدید برای کلاس های ویژگی ارائه می شود.
توجه داشته باشید:تمرکز در این فصل بر روی کار با اجسام هندسی با استفاده ازarcpy.daمکان نماها، که کار با رئوس ویژگی های فردی را ممکن می کند. این رویکرد کنترل دقیقی را برای خواندن و نوشتن هندسه ها فراهم می کند، اما می تواند دست و پا گیر باشد. شما همچنین می توانید با استفاده از فرمت های جایگزین با هندسه ها کار کنید. اشیاء هندسه دارای چندین ویژگی فقط خواندنی برای تبدیل هندسه به فرمت های مختلف هستند، از جمله JSON، باینری معروف (WKB) و متن معروف (WKT). این فرمت ها به طور گسترده توسط بسته های منبع باز پایتون برای کار با داده های مکانی استفاده می شود. با استفاده از این فرمت ها می توان هندسه ایجاد کرد.
9.4خواندن هندسه ها
درک شما از اجسام هندسی خواندن هندسه ها را تسهیل می کند. اشیاء هندسه (و رئوس آنها) یک کلاس ویژگی موجود را می توان با استفاده از مکان نما جستجو دسترسی داشت. مکان نما جستجو در فیلد هندسه تنظیم شده است و می توان از آن برای برگرداندن کل شیء هندسی استفاده کرد (به عنوان مثال،شکل@) یا یک ویژگی خاص از طریق یک نشانه هندسی (به عنوان مثال،SHAPE@LENGTH). هنگام استفاده از مکان نما جستجو، یک ویژگی نقطه ای را برمی گرداندهندسه نقطه ایشیء که از الف تشکیل شده استنقطههدف – شی. سایر انواع ویژگی (به عنوان مثال، چند خط و چند ضلعی) چندگانه را برمی گرداندنقطهاشیاء برای هر ویژگی سازمان اینهانقطهاشیاء به چند خط و چند ضلعی با این واقعیت که ویژگی ها می توانند چندین بخش داشته باشند تا حدودی پیچیده است.
در مثال زیر، مکان نما جستجو و aبرایتکرار حلقه روی ردیف های یک کلاس ویژگی نقطه ای. یک نشانه هندسی مختصات x,y ویژگی های نقطه را بازیابی می کند و سپس چاپ می شود. فیلمنامه به شرح زیر است:
واردات کمان
fc = “C:/Data/Demo.gdb/marinas”
با arcpy.da.SearchCursor(fc, [” SHAPE@XY “]) به عنوان مکان نما:
برای ردیف در مکان نما:
x، y = ردیف[0]
print(“{0}، {1}”.format(x,y))
توجه داشته باشید که در این مثال،SHAPE@XYتوکن چند مختصات را برمیگرداند و با استفاده از آن به متغیرهای x و y نسبت داده میشود.x، y = ردیف[0]. یک جایگزین این است که هنگام تنظیم مکان نما از دو نشانه جداگانه استفاده کنید—یعنی[” SHAPE@XY “، ” SHAPE@XY “]، و سپس استفاده کنیدx = ردیف[0]وy = ردیف[1].
کلاس ویژگی از ویژگی های نقطه ای تشکیل شده و در شکل نشان داده شده است. هر نقطه دارای یک جفت مختصات x,y است.
اجرای اسکریپت در کلاس ویژگی لیستی از جفت مختصات x,y را به شرح زیر برمی گرداند:
3069300.0599277616, 10129811.119859427
3047366.5099629313, 10121935.790137678
3047945.780129835, 10126083.489847511
3049913.8099864274, 10129118.71999751
3056989.9798891693, 10125885.980071917
3058335.0999023467, 10133584.949910179
…
کلاس های ویژگی نقطه نسبتا ساده هستند زیرا تنها یک واحد وجود داردنقطهشی برای هر ویژگی چند خط و چند ضلعی از چندین تشکیل شده استنقطهاشیاء برای هر ویژگی اینهانقطهاشیاء در یک سازماندهی می شوندآرایهشیء، همانطور که در بخش قبل مورد بحث قرار گرفت. برای کار با اینهاآرایهاشیاء، تکرارهای اضافی مورد نیاز است. در یک فیلمنامه معمولی، الفبرایحلقه روی ردیفهای جدول و یک ثانیه تکرار میشودبرایحلقه بر روی تکرار می شودنقطهاشیاء در هر شیء آرایه
در کد مثال زیر، aبرایحلقه روی ردیف ها در یک شکل فایل تکرار می شود. برای هر ردیف، مقدار فیلد شناسه منحصربهفرد چاپ میشود – بدون آن، نمیتوانید شروع و پایان هر ویژگی چند خطی را بگویید. برای هر ردیف، یک شی هندسی به دست می آید، وgetPart()روش آرایه ای ازنقطهاشیاء برای اولین (و تنها) بخش هندسه. بخش بعدی کار با چندین بخش را با جزئیات بیشتری مورد بحث قرار می دهد. آبرایحلقه روی همه تکرار می شودنقطهاشیاء درآرایهشی و مختصات x,y را چاپ می کند. کد به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data/Demo.gdb”
fc = “لوله”
با arcpy.da.SearchCursor(fc, [” OID@ “, ” SHAPE@ “]) به عنوان مکان نما:
برای ردیف در مکان نما:
print(“ویژگی {0}: “.format(row[0]))
برای نقطه در ردیف[1].getPart(0):
print(“{0}، {1}”.format(point.X، point.Y))
این کد مثال فرض می کند که هیچ ویژگی چند بخشی وجود ندارد.
همچنین به استفاده از رشته توجه کنید” OID@ “برای ارجاع به فیلد شناسه یکتا. این فیلد معمولاً برای شکل فایلها FID و برای کلاسهای ویژگی پایگاه دادههای جغرافیایی OBJECTID نامیده میشود. به جای تعیین فرمت داده مورد استفاده،” OID@ “رشته به عنوان نشانه ای برای اشاره به شناسه منحصر به فرد بدون توجه به نام فیلد عمل می کند. به عنوان مثال، اگر از رشته استفاده کنید”FID”برای کلاس ویژگی های پایگاه جغرافیایی، مکان نما جستجو خطا را برمی گرداندRuntimeError: ستونی مشخص شد که وجود ندارد. استفاده ازOID@کد را قوی تر می کند. تفاوت دیگر بین شیپ فایلها و کلاسهای ویژگی پایگاه جغرافیایی این است که مقادیر FID با مقدار 0 شروع میشوند در حالی که مقادیر OBJECTID با مقدار 1 شروع میشوند. بر اساس فرمت داده مورد استفاده
کلاس ویژگی لوله ها، که در شکل نشان داده شده است، دارای رئوس هایی است که برای تأکید نشان داده شده اند – این رئوس معمولاً برای ویژگی های چند خطی قابل مشاهده نیستند. کلاس ویژگی از سه چند خط تشکیل شده است که در یک مکان هندسه منطبق دارند.
هنگامی که اسکریپت قبلی روی کلاس ویژگی لوله ها اجرا می شود، لیست مختصات x,y رئوس در هر یک از سه ویژگی چاپ می شود. رئوس منطبق که تقاطع لوله ها را نشان می دهد برای تأکید به صورت زیر سایه می اندازند:
ویژگی 1:
3114489.914429754, 10071031.541552678
3114455.196651429, 10071041.880114675
ویژگی 2:
3114457.9210554212, 10071051.170778498
3114455.196651429, 10071041.880114675
ویژگی 3:
3114455.196651429, 10071041.880114675
3114435.4978719205, 10071047.747557
در مورد این فیلمنامه باید به چند نکته دیگر نیز اشاره کرد. اول،getPart()روش از شاخص صفر (0) استفاده می کند. این روش تنها قسمت اول شی هندسه را که دارای شاخص صفر (0) است، برمی گرداند. برای کلاس های ویژگی معمولی (یعنی تک قسمتی)، قسمت اول نیز تنها قسمت است. دوم، اسکریپت را می توان برای کلاس های ویژگی چند خطی و چندضلعی استفاده کرد، اما برای کلاس های ویژگی نقطه ای نه.
نمونه نهایی خواندن هندسه ها برای کلاس ویژگی چندضلعی است. این اسکریپت اساساً مشابه اسکریپت قبلی است زیرا برای کلاس های ویژگی چند خطی و چندضلعی کار می کند. تنها تغییر جزئی در قالب بندی (اختیاری) خروجی چاپ است:
واردات کمان
arcpy.env.workspace = “C:/Data/Demo.gdb”
fc = “بسته ها”
با arcpy.da.SearchCursor(fc, [” OID@ “, ” SHAPE@ “]) به عنوان مکان نما:
برای ردیف در مکان نما:
print(“ویژگی {0}: “.format(row[0]))
برای نقطه در ردیف[1].getPart(0):
print(“{0:.2f}, {1:.2f}”.format(point.X، point.Y))
قالب بندی چاپ از یک کد قالب برای تعیین دقت خروجی استفاده می کند. کدهای فرمت مورد استفاده در اینجا هستند(0:.2f)و(1:.2f)، جایی که2نشان دهنده ارقام دقت وfیک عدد ممیز شناور را نشان می دهد. این کد فرمت خروجی چاپ را به دو رقم اعشار محدود می کند تا خروجی را راحت تر خوانده شود.
کلاس ویژگی مورد استفاده در اسکریپت از یک بسته تشکیل شده است و در شکل با رئوس اضافه شده برای تاکید نشان داده شده است. راس شروع با رنگ دیگری نشان داده شده است.
هنگامی که اسکریپت در کلاس ویژگی بسته ها اجرا می شود، لیست مختصات x,y رئوس چاپ می شود.
ویژگی 1:
427837.21, 5450864.65
427837.80, 5450898.34
427842.31, 5450898.89
427846.84, 5450899.18
427851.39, 5450899.24
427859.98, 5450899.11
427859.42, 5450867.42
427837.21, 5450864.65
اولین و آخرین جفت مختصات x,y یکسان هستند. برای یک ویژگی چندضلعی، راس شروع و پایان بر هم منطبق است و بنابراین مختصات آنها یکسان است.
دو بخش بعدی به بررسی دو عارضه هنگام کار با هندسه ویژگی می پردازد: ویژگی های چند قسمتی و چند ضلعی با سوراخ.
9.5کار با ویژگی های چند قسمتی
ویژگیهای یک کلاس ویژگی میتوانند چندین بخش داشته باشند، که آنها را به ویژگیهای چند بخشی تبدیل میکند. چنین ویژگی هایی گاهی اوقات زمانی مورد نیاز است که چندین بخش فیزیکی در یک ویژگی وجود داشته باشد اما فقط یک مجموعه از ویژگی ها وجود داشته باشد. یک مثال کلاسیک از یک ویژگی چند قسمتی ایالت هاوایی است: هر یک از جزایر بخشی خاص خود است، اما برای اینکه هاوایی به عنوان یک رکورد واحد در جدول ویژگی ها نشان داده شود، این بخش ها باید یک ویژگی واحد را تشکیل دهند.
در مورد نقاط از این ویژگی ها به عنوان چند نقطه و در مورد چند خط و چند ضلعی به آنها چند قسمتی اطلاق می شود. برای تعیین اینکه آیا یک ویژگی چند بخشی است،چند قسمتی استاز ویژگی شی هندسی استفاده می شود. ویژگی مقداری ازدرست است، واقعیاگر تعداد قطعات بیش از یک باشد. درpartCountویژگی شی هندسی تعداد قسمت های هندسی یک ویژگی را برمی گرداند. با این حال، وقتی یک کلاس ویژگی شامل ویژگی های چند بخشی است، به این معنی نیست که هر ویژگی در کلاس ویژگی چند بخشی است. به همین دلیل است که خواصی مانندچند قسمتی استوpartCountویژگی های شی هندسه (یعنی هر ویژگی جداگانه) هستند، نه کل کلاس ویژگی.
نحو برای کار با هندسه های چند بخشی مانند نحو برای ویژگی های تک قسمتی است. تفاوت اصلی این است که برای ویژگی های چند بخشی، یک آرایه حاوی چندین آرایه ازنقطهاشیاء برای هر ویژگی به جای یک آرایه منفرد برگردانده می شودنقطهاشیاء برای ویژگی های تک قسمتی بنابراین، یک اسکریپت که با هندسه کار میکند، نه تنها باید روی ردیفهای جدول، بلکه روی قسمتهای هر شی هندسی نیز تکرار شود، و به دنبال آن یک تکرار روی آرایهنقطهاشیاء برای هر بخش هندسه
کد مثال زیر نشان می دهد که چگونه این تکرار برای کلاس های ویژگی چند خطی و چندضلعی انجام می شود:
واردات کمان
arcpy.env.workspace = “C:/Data/Demo.gdb”
fc = “multipart_features”
با arcpy.da.SearchCursor(fc, [” OID@ “, ” SHAPE@ “]) به عنوان مکان نما:
برای ردیف در مکان نما:
print(“ویژگی {0}: “.format(row[0]))
partnum = 1
برای قسمت در ردیف [1]:
print(“Part {0}:”.format(partnum))
برای نکته در بخشی:
print(“{0}، {1}”.format(point.X، point.Y))
partnum += 1
این اسکریپت برای هر دو ویژگی تک قسمتی و چند قسمتی کار می کند. برای ویژگی های تک قسمتی، تعداد قسمت ها یک قسمت و بلوک کد در قسمت دوم استبرایحلقه فقط یک بار برای هر شی هندسی اجرا می شود. برای ویژگی های چند قسمتی، بلوک کد در مرحله دومبرایحلقه برای هر قسمت تکرار می شود. این اسکریپت برای کلاس های ویژگی چند خطی و چندضلعی کار می کند، اما برای کلاس های ویژگی نقطه ای کار نمی کند.
به یاد بیاورید که از اسکریپت قبلی استفاده شده استgetPart (0)برای محدود کردن تکرارها فقط به دو مورد: تکرار اول روی چند خط یا چندضلعی ویژگیها (یا رکوردها) یک کلاس ویژگی، و تکرار دوم روی آرایه منفردنقطهاشیاء برای هر ویژگی این تکرار فقط با این فرض کار می کند که هیچ ویژگی چند بخشی وجود ندارد. با این حال، وقتی ویژگیهای چند قسمتی وجود دارد، اسکریپت باید روی قسمتهای هر ویژگی نیز تکرار شود.
هنگامی که برای کلاس ویژگی لوله های تک قسمتی استفاده شده در مثال قبلی استفاده می شود، خروجی به شرح زیر است:
ویژگی 1:
قسمت 1:
3114489.914429754, 10071031.541552678
3114455.196651429, 10071041.880114675
ویژگی 2:
قسمت 1:
3114457.9210554212, 10071051.170778498
3114455.196651429, 10071041.880114675
ویژگی 3:
قسمت 1:
3114455.196651429, 10071041.880114675
3114435.4978719205, 10071047.747557
اسکریپت شناسه ویژگی و شماره قطعه را چاپ می کند و رئوس هر قسمت را به دنبال دارد. برای ویژگی های تک قسمتی، شماره قسمت همیشه 1 خواهد بود. با این حال، وقتی اسکریپت روی ویژگی های چند قسمتی اجرا می شود، رئوس هر قسمت به طور جداگانه چاپ می شود. به عنوان مثال، هنگامی که اسکریپت به یک کلاس ویژگی از ایالت هاوایی اعمال می شود که در آن همه جزایر بخشی از یک ویژگی چند قسمتی هستند، خروجی به شرح زیر است:
ویژگی 1:
قسمت 1:
829161.2377500497, 2245088.4863696164
829562.0140070709, 2244825.5500601856
830272.0191802941, 2245082.653893076
…
قسمت 2:
757434.8462445247, 2276341.3831276996
757032.135862602, 2276024.285794495
756636.4266655683, 2276085.913662538
…
قسمت 3:
710001.6202032189, 2315999.2709145965
712130.1452008054, 2315404.376263119
712929.5685427614, 2315461.879625261
…
…
قسمت 11:
448104.910351872, 2455572.1504373224
449256.0443817233, 2455521.0768535445
449660.53156614857, 2456094.041689389
…
در کل کلاس ویژگی هاوایی از یک ویژگی و 11 قسمت تشکیل شده است.
توجه داشته باشید:یک ویژگی چند خطی یا چندضلعی میتواند رئوس زیادی داشته باشد، بنابراین مراقب اجرای اسکریپتها در کلاسهای ویژگی بزرگ باشید—چاپ همه راسها ممکن است زمان زیادی طول بکشد و ممکن است فقط چند رئوس را انتخاب کنید. با افزودن شمارنده به حلقه سوم و استفاده از an می توانید تعداد راس ها را محدود کنیداگربیانیه برای چاپ رئوس فقط تا رسیدن به یک عدد خاص. همچنین می توانید از a استفاده کنیددر حالی کهحلقه به جای aبرایحلقه، که کار با شمارش را تسهیل می کند.
9.6کار با چند ضلعی با سوراخ
علاوه بر ویژگیهای چند قسمتی، چند ضلعیهای دارای حفرهها چالشی منحصربهفرد هنگام کار با هندسهها ایجاد میکنند. اگر یک چند ضلعی دارای سوراخ باشد، شی هندسی از چندین حلقه تشکیل می شود: یک حلقه بیرونی و یک یا چند حلقه داخلی. حلقه یک مسیر بسته است که یک منطقه دو بعدی را مشخص می کند. مسیر مجموعه ای از رئوس با یک راس شروع (از) و یک راس پایانی (به) است. یک حلقه معتبر شامل یک مسیر معتبر است که در آن نقاط از و به مختصات x،y یکسانی دارند. حلقه بیرونی به عنوان حلقه در جهت عقربه های ساعت و حلقه داخلی به عنوان حلقه خلاف جهت عقربه های ساعت تعریف می شود. این قرارداد برای جدا نگه داشتن حلقه ها است، اما جهت معنای دیگری ندارد. این مشخصه چند خطوط مختلف است که در آنها از جهت برای تعیین ویژگی هایی مانند جهت جریان در یک شبکه استفاده می شود.
برای چند ضلعی با سوراخ، شی هندسی آرایه ای حاوینقطهاشیایی که رئوس حلقه بیرونی و تمام حلقه های داخلی را توصیف می کنند. حلقه بیرونی همیشه ابتدا و سپس حلقه های داخلی برگردانده می شود. یک نقطه صفر – یعنی الفنقطهشی بدون مقادیر – به عنوان جداکننده بین حلقه ها استفاده می شود.
یک اسکریپت برای خواندن هندسه چند ضلعی های دارای سوراخ مانند اسکریپت قسمت قبل برای ویژگی های چند قسمتی است. سومینبرایحلقه با یک بلوک کد جایگزین می شود که وجود یک نقطه تهی را بررسی می کند. در ادامه اسکریپت کامل آمده است.
واردات کمان
arcpy.env.workspace = “C:/Data/Demo.gdb”
fc = “چاله_چند ضلعی”
با arcpy.da.SearchCursor(fc, [” OID@ “, ” SHAPE@ “]) به عنوان مکان نما:
برای ردیف در مکان نما:
print(“ویژگی {0}: “.format(row[0]))
partnum = 1
برای قسمت در ردیف [1]:
print (“بخش {0}:”.format(partnum))
برای نکته در بخشی:
اگر نقطه:
print(“{0}، {1}”.format(point.Y، point.Y))
دیگر:
چاپ (“حلقه داخلی”)
partnum += 1
تنها افزودنی شامل یکاگر دیگریبیانیه. برای یک شی هندسی با حلقه، از نقاط پوچ به عنوان جداکننده بین حلقه ها استفاده می شود. بنابراین، اگر شی بعدی بعد از یک نقطه صفر، یک شی نقطه باشد، به این معنی است که یک حلقه داخلی وجود دارد. این بلوک کد برای هر جداکننده نقطه تهی اجرا می شود و در نتیجه رئوس هر حلقه داخلی به طور جداگانه فهرست می شود.
چند ضلعی های دارای سوراخ رایج هستند، به ویژه در کلاس های ویژگی که ویژگی های طبیعی را توصیف می کنند، مانند پوشش گیاهی و خاک. مثال در شکل یک چندضلعی خاک معمولی را نشان می دهد.
اجرای اسکریپت روی چند ضلعی خاک خروجی زیر را به همراه دارد. تنها یک ویژگی واحد (ویژگی 1) وجود دارد که دارای یک حلقه بیرونی (قسمت 1) و چندین حلقه داخلی است. در این مثال، حلقه ها شماره گذاری نشده اند. خروجی به صورت زیر است:
ویژگی 1:
قسمت 1:
549563.387926 1623728.65919
549615.387903 1623700.65924
…
حلقه داخلی
547042.700688 1625044.65659
546906.386611 1624984.65647
…
حلقه داخلی
548234.35805 1621938.65839
548210.169534 1621866.65838
…
حلقه داخلی
546255.274993 1623827.6562
546215.180853 1623815.65616
…
با در نظر گرفتن برخی از چالشهایی که تاکنون مورد بحث قرار گرفتهاند، یک اسکریپت برای خواندن هندسههای یک کلاس ویژگیها که تمام سناریوهای ممکن را مدیریت میکند، مفصل میشود. چنین اسکریپتی باید موارد زیر را در نظر بگیرد: (1) نوع هندسه-یعنی ویژگیهای نقطه در مقابل چند خط یا چندضلعی. (2) وجود ویژگی های چند بخشی. و (3) وجود چند ضلعی با سوراخ. این اسکریپت به چندین مورد نیاز دارداگر دیگریبیانیه ها، با بلوک های جداگانه کد برای رسیدگی به این چالش ها.
9.7نوشتن هندسه
همانطور که در بخش قبلی بحث شد، اشیاء هندسه را می توان با استفاده از کلاس های هندسه ArcPy ایجاد کرد. این بخش به نحوه نوشتن ویژگی های جدید با استفاده از این اشیاء هندسی می پردازد. در یک سناریوی معمولی، مختصات رئوس از یک فایل جداگانه به دست می آید.
ویژگی های جدید با استفاده ازدرج مکان نماکلاس ازarcpy.daمدول. این فرآیند مستلزم ایجاد یک شی هندسی و سپس ذخیره نتیجه به عنوان یک ویژگی با استفاده از آن استinsertRow()روش. این مراحل بر اساس بخشهای قبلی است که در مورد چگونگی ایجاد اجسام هندسی بحث شده است. مثال قبلی را برای ایجاد یک شی هندسی نقطه ای در نظر بگیرید:
point = arcpy.Point(4.900160, 52.378424)
pointgeo = arcpy.PointGeometry(point, 4326)
درهندسه نقطه ایکلاس در اینجا، تا حدی، برای اختصاص دادن مورد نیاز استنقطهشیء یک سیستم مختصات با این حال، هنگام کار با مکان نما، فرض ضمنی این است که یک کلاس ویژگی از قبل وجود دارد، وهندسه نقطه ایبنابراین کلاس ضروری نیست. اگر کلاس ویژگی وجود نداشته باشد،CreateFeatureclass()تابع می تواند یک کلاس ویژگی جدید و خالی ایجاد کند. سینتکس این تابع به صورت زیر است:
CreateFeatureclass(out_path، out_name، {geometry_type}، {template}،
{has_m}، {has_z}، {spatial_reference}،
{config_keyword}، {spatial_grid_1}،
{spatial_grid_2}، {spatial_grid_3})
تنها پارامترهای مورد نیاز مسیر برای مکان کلاس ویژگی جدید (پوشه یا پایگاه جغرافیایی) و نام کلاس ویژگی جدید است. مقدار پیش فرض هندسه Polygon است. هیچ پیشفرضی برای مرجع فضایی وجود ندارد، بنابراین اگر هیچ یک مشخص نشده باشد، سیستم مختصات “ناشناخته” است.
مثال کد زیر یک کلاس ویژگی خالی جدید ایجاد می کند و یک ویژگی نقطه جدید اضافه می کند:
واردات کمان
fgdb = “C:/Data/Demo.gdb”
arcpy.env.workspace = fgdb
fc = “نقاط جدید”
arcpy.CreateFeatureclass_management(fgdb, fc, “Point”,
“””، “””، 4326)
point = arcpy.Point(4.900160, 52.378424)
با arcpy.da.InsertCursor(fc، ” SHAPE@ “) به عنوان مکان نما:
cursor.insertRow([point])
درCreateFeatureclass()تابع یک کلاس ویژگی خالی جدید با نوع هندسه و سیستم مختصات درست ایجاد می کند. درهندسه نقطه ایبرای ایجاد یک شی هندسی از کلاس نیازی به کلاس نیستنقطهشی چون وقتی مکاننمای درج روی این کلاس ویژگی تنظیم میشود، مرجع فضایی ضمنی است. این رویکرد فقط برای ویژگی های نقطه ای کار می کند زیرا آنها نسبت به چند خط و چند ضلعی ساده هستند. هنگام ایجاد ویژگی های چند خطی یا چندضلعی جدید با استفاده از مکان نما، باید از آن استفاده کنیدپلی لاینیاچند ضلعیکلاس، به ترتیب، برای ایجاد یک شی هندسی.
هنگامی که مکان نما درج روی کلاس ویژگی جدید تنظیم شد، ویژگی نقطه جدید با فراخوانی ایجاد می شودinsertRow()روش شی مکان نما این تنها روش استدرج مکان نماکلاس اگر هیچ آرگومانی ارائه نشود، یک ردیف خالی بدون هندسه یا مقادیر ویژگی اضافه می شود. در اسکریپت مثال، آرگومان a استنقطهشی، که ویژگی نقطه جدید را ایجاد می کند. درنقطهشی باید به صورت لیست یا تاپل ارائه شود. هندسه در کلاس ویژگی نوشته می شود، اما اگر کلاس ویژگی دارای فیلدهای اضافی باشد، هیچ مقدار مشخصه به روز نمی شود. در نتیجه، تنها ویژگیهایی که پر میشوند فیلد OBJECTID (یعنی مقدار 1) و فیلد هندسه (یعنی Point) هستند.
از آنجا که ویژگی های نقطه نسبتا ساده هستند،SHAPE@XYبه جای شی geometry می توان از نشانه geometry استفاده کردشکل@. کد مثال قبلی به جز شی مکان نما یکسان است:
با arcpy.da.InsertCursor(fc، ” SHAPE@XY “) به عنوان مکان نما:
استفاده از این توکن هندسی دقیقاً همان نتیجه را ایجاد می کند و عملکرد را بهبود می بخشد. استفاده از نشانههای هندسه برای ایجاد هندسههای جدید یک گزینه فقط برای کار با ویژگیهای نقطهای است. ایجاد ویژگی های چند خطی یا چندضلعی جدید همیشه به کل شیء هندسی نیاز داردشکل@.
ایجاد ویژگی های جدید معمولاً با استفاده از مکان نما، همانطور که در مثال قبلی نشان داده شد، انجام می شود. راه حل های جایگزینی وجود دارد که نیازی به استفاده از مکان نما ندارند. مثال قبلی را در نظر بگیرید که در آن یک شی هندسی جدید در حافظه ایجاد می شود:
point = arcpy.Point(4.900160, 52.378424)
pointgeo = arcpy.PointGeometry(point, 4326)
از آنجا که اشیاء هندسی را می توان به عنوان ورودی برای عملیات ژئوپردازش استفاده کرد، اشیاء هندسی را می توان در ابزاری استفاده کرد که ورودی ها را در یک کلاس ویژگی جدید کپی می کند، مانند ابزار Copy Features. سینتکس کلی این ابزار به شرح زیر است:
CopyFeatures(in_features، out_feature_class، {config_keyword}،
{spatial_grid_1}، {spatial_grid_2}، {spatial_grid_3})
برای ایجاد ویژگی های جدید، شی یا اشیاء هندسه به عنوان ویژگی های ورودی استفاده می شود و این اشیاء در یک کلاس ویژگی خروجی جدید کپی می شوند. این رویکرد برای نوشتن هندسه نیازی به استفاده از مکان نما ندارد. کد این کار به صورت زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data/Demo.gdb”
point = arcpy.Point(4.900160, 52.378424)
pointgeo = arcpy.PointGeometry(point, 4326)
arcpy.CopyFeatures_management(pointgeo، “points”)
این کد روشی مختصر و ظریف برای ایجاد ویژگی های جدید است و از همین رویکرد می توان برای ویژگی های چند خطی و چند ضلعی استفاده کرد. کپی کردن اشیاء هندسی به این روش در مقایسه با استفاده از مکان نما دارای معایبی است. اول، شما نمی توانید ویژگی های ویژگی ها را هنگام کپی کردن هندسه ایجاد یا به روز کنید. بنابراین، اگر باید همزمان ویژگیها و مقادیر مشخصه جدیدی ایجاد کنید، باید از مکاننما استفاده کنید. دوم، ایجاد بسیاری از ویژگیها، بهویژه اگر از راسهای زیادی تشکیل شده باشند، ممکن است عملکرد را کاهش دهد زیرا تمام اشیاء هندسی باید به طور همزمان در حافظه بارگذاری شوند تا آنها را در یک کلاس ویژگی کپی کنیم. هنگام استفاده از مکان نما، می توانید هر ویژگی جدید را با هر تکرار روی شی مکان نما ایجاد کنید، که امکان عملکرد بهتر در هنگام مدیریت بسیاری از ویژگی ها را فراهم می کند.
هر دو رویکردی که تاکنون مورد بحث قرار گرفتهاند – یعنی کپی کردن اشیاء هندسه در یک کلاس ویژگی و استفاده از مکاننمای درج – برای ویژگیهای چند خطی و چندضلعی نیز کار میکنند. یک اسکریپت برای ایجاد یک ویژگی چندضلعی جدید از لیستی از جفت مختصات x,y در نظر بگیرید. از آنجا که مختصات به عنوان یک لیست ارائه می شود، اسکریپت باید روی لیست تکرار شود، a ایجاد کندنقطهبرای هر جفت مختصات شیء کنید و اینها را اضافه کنیدنقطهاشیاء به یکآرایههدف – شی. این فرآیند نیاز به راه اندازی یک خالی داردنقطهشی و خالیآرایهشی به شرح زیر است:
واردات کمان
point = arcpy.Point()
آرایه = arcpy.Array()
مختصات = [[3116036.11, 10071403.50]،
[3115768.36، 10071482.07]،
[3115847.82، 10071747.21]،
[3116114.23، 10071667.17]]
در مرحله بعد، کد روی لیست جفت مختصات تکرار می شود و یک کد جدید ایجاد می کندنقطهشی با هر تکرار. هر یکنقطهشی به اضافه می شودآرایههدف – شی:
برای هماهنگی در مختصات:
point.X = coord[0]
point.Y = coord[1]
array.add(point)
در نهایت، شیء هندسی با استفاده از عبارت ساخته می شودآرایهشی به عنوان ورودی و تنظیم مرجع فضایی:
چند ضلعی = arcpy.Polygon(آرایه، 2277)
اسکریپت تاکنون شیء هندسی را فقط در حافظه ایجاد کرده است. برای ایجاد یک ویژگی چندضلعی جدید در یک کلاس ویژگی، می توان از همان دو راه حلی که قبلا برای ویژگی های نقطه ای استفاده شده بود استفاده کرد. اولین راه حل استفاده از مکان نما است. این فرآیند مستلزم ایجاد یک کلاس ویژگی چندضلعی جدید، تنظیم مکان نما بر روی شی هندسی استشکل@، و نوشتن هندسه جدید با استفاده ازinsertRow()روش. راه حل کامل به شرح زیر است:
واردات کمان
fgdb = “C:/Data/Demo.gdb”
fc = “newpoly”
arcpy.env.workspace = fgdb
point = arcpy.Point()
آرایه = arcpy.Array()
مختصات = [[3116036.11, 10071403.50]،
[3115768.36، 10071482.07]،
[3115847.82، 10071747.21]،
[3116114.23، 10071667.17]]
برای هماهنگی در مختصات:
point.X = coord[0]
point.Y = coord[1]
array.add(point)
چند ضلعی = کمان. چند ضلعی (آرایه)
arcpy.CreateFeatureclass_management(fgdb, fc, “Polygon”,
“””، “””، 2277)
با arcpy.da.InsertCursor(fc، ” SHAPE@ “) به عنوان مکان نما:
cursor.insertRow([چند ضلعی])
توجه داشته باشید که در این راه حل، مرجع فضایی هنگام ایجاد کلاس ویژگی جدید تنظیم می شود و لازم نیست هنگام ایجاد شی هندسی تنظیم شود. نتیجه یک ویژگی چندضلعی جدید است، همانطور که در شکل با رئوس نشان داده شده برای تاکید نشان داده شده است.
راه حل دوم این است که شی هندسه را با استفاده از ابزار Copy Features بدون استفاده از مکان نما کپی کنید. راه حل کامل به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data/Demo.gdb”
fc = “newpoly”
point = arcpy.Point()
آرایه = arcpy.Array()
مختصات = [[3116036.11, 10071403.50]،
[3115768.36، 10071482.07]،
[3115847.82، 10071747.21]،
[3116114.23، 10071667.17]]
برای هماهنگی در مختصات:
point.X = coord[0]
point.Y = coord[1]
array.add(point)
چند ضلعی = arcpy.Polygon(آرایه، 2277)
arcpy.CopyFeatures_management(چند ضلعی، fc)
در این راه حل، مرجع فضایی باید برای شی هندسی تنظیم شود، و بنابراین بخشی از آرگومان ها هنگام ایجادچند ضلعیهدف – شی.
در مثالهایی که تاکنون ارائه شده، اطلاعات مختصات به صورت سخت در اسکریپت کدگذاری شده است. یک سناریوی رایج این است که مختصات در یک فایل جداگانه مانند جدول پایگاه داده یا فایل متنی قرار گیرند. مثال زیر مختصات را از یک فایل متنی می خواند. فایل متنی 21 نقطه را فهرست می کند که هر کدام با یک شماره شناسه و سپس یک مختصات x و یک مختصات y شروع می شود. این سه مقدار با یک فاصله از هم جدا می شوند. این مختصات در یک فایل متنی ساده به نام points.txt ذخیره می شوند.
این مختصات برای ایجاد یک چند ضلعی جدید استفاده خواهد شد – توجه داشته باشید که مختصات اولین نقطه و آخرین نقطه در لیست یکسان هستند:1 542935 1619969و21 542935 1619969.
راه حل اسکریپت برای این کار شبیه مثال قبلی برای ایجاد یک چند ضلعی است اما از آن استفاده می کندورودی فایلماژول برای خواندن محتویات فایل متنی. قسمت اول اسکریپت شبیه نمونه قبلی است، به شرح زیر:
واردات کمان
وارد کردن ورودی فایل
fgdb = “C:/Data/Demo.gdb”
textfile = “C:/Data/points.txt”
fc = “دریاچه”
sr = arcpy.SpatialReference(2236)
arcpy.env.workspace = fgdb
arcpy.CreateFeatureclass_management(fgdb, fc, “Polygon”,
“، “”، “”، sr)
با arcpy.da.InsertCursor(fc, [” SHAPE@ “]) به عنوان مکان نما:
آرایه = arcpy.Array()
point = arcpy.Point()
تنها افزودنی ها واردات هستندورودی فایلماژول، به فایل متنی ورودی اشاره می کند و سیستم مختصات را به عنوان یک متغیر تنظیم می کند.
بعد، خواص ازنقطهاشیاء باید با استفاده از مقادیر موجود در فایل متنی تنظیم شوند. این مرحله مستلزمورودی فایلماژول برای خواندن فایل متنی وشکاف()روشی برای تجزیه متن به رشته های جداگانه برای شماره شناسه نقطه، مختصات x و مختصات y. اسکریپت باید روی خطوط فایل متنی ورودی تکرار شود، a ایجاد کنیدنقطهبرای هر خط شیء کنید و هر کدام را اضافه کنیدنقطهاعتراض بهآرایههدف – شی. این خطوط کد به شرح زیر است:
برای خط در fileinput.input(textfile):
point.ID، point.X، point.Y = line.split()
array.add(point)
درشکاف()متد لیستی از رشته ها را با استفاده از آرگومان متد به عنوان جداکننده برمی گرداند. هنگامی که هیچ آرگومانی مشخص نشده است (همانطور که در اینجا وجود دارد)،شکاف()روش از فضاهای متوالی به عنوان جداکننده استفاده می کند. برای هر خط،شکاف()متد لیستی از سه رشته را برمی گرداند. سپس این مقادیر به ویژگی های ID، X و Y نسبت داده می شودنقطههدف – شی.
خطوط نهایی کد را ایجاد می کندچند ضلعیشی از آرایهنقطهاشیاء و ایجاد ویژگی چند ضلعی. برای جلوگیری از قفل شدن داده ها، فایل متنی به شرح زیر بسته می شود:
چند ضلعی = کمان. چند ضلعی (آرایه)
cursor.insertRow([چند ضلعی])
fileinput.close()
نتیجه اسکریپت یک کلاس ویژگی جدید به نام “دریاچه” با یک ویژگی چند ضلعی است، همانطور که در شکل نشان داده شده است.
راه حل اسکریپت از یک مکان نما برای ایجاد ویژگی چند ضلعی جدید استفاده می کند، اما راه حل جایگزینی که شی هندسه را در یک کلاس ویژگی جدید کپی می کند، به همان اندازه معتبر است.
9.8استفاده از نشانگر برای تنظیم مرجع فضایی
مرجع فضایی برای یک کلاس ویژگی، سیستم مختصات، حوزه فضایی و دقت را توصیف می کند. همانطور که در مثال های قبلی نشان داده شد، معمولاً وقتی کلاس ویژگی ایجاد می شود، مرجع مکانی تنظیم می شود. با این حال، تعیین یک مرجع مکانی مورد نیاز نیست، و زمانی که هیچ یک مشخص نشده باشد، منجر به یک سیستم مختصات “ناشناخته” می شود. در این حالت می توان از ابزار Define Projection برای ثبت اطلاعات سیستم مختصات کلاس ویژگی پس از ایجاد آن استفاده کرد.
یک مرجع فضایی برای تمام ویژگی های یک کلاس ویژگی اعمال می شود. بهطور پیشفرض، مرجع مکانی هندسه شیای که از مکاننما برگردانده میشود، بنابراین همان مرجع فضایی کلاس ویژگی است که توسط مکاننما باز میشود. با این حال، در شرایط خاصی، ممکن است با هندسههایی کار کنید که مرجع مکانی متفاوتی از کلاس ویژگی دارند – برای مثال، اگر یک کلاس ویژگی در سیستم مختصات صفحه حالت دارید و میخواهید ویژگیهای جدیدی را با استفاده از یک فایل متنی وارد کنید. که دارای مختصات جهانی عرضی Mercator (UTM) است. در این مورد، می توانید مرجع مکانی را روی مکان نما درج کنید تا از تبدیل های مناسب اطمینان حاصل کنید. شما یک مکان نما را در کلاس ویژگی باز می کنید و مرجع مکانی مکان نما را روی UTM تنظیم می کنید.
همچنین می توانید مرجع مکانی مکان نما جستجو را تنظیم کنید. تعیین یک مرجع فضایی که با مرجع فضایی کلاس ویژگی متفاوت است منجر به هندسه هایی می شود که به مرجع مکانی مکان نما تبدیل می شوند.
مثال استفاده از یک کلاس ویژگی نقطه در مختصات صفحه حالت و نوشتن یک اسکریپت که جفت مختصات x,y از ویژگی های نقطه را در درجه اعشار صادر می کند را در نظر بگیرید. درجستجوی مکان نماclass یک مکان نما فقط خواندنی روی مختصات صفحه حالت کلاس ویژگی ایجاد می کند، اما مرجع مکانی این مکان نما به سیستم مختصات جغرافیایی مورد نظر، در درجه اعشار تنظیم می شود. تنظیم مرجع مکانی با استفاده از کد زیر انجام می شود:
واردات کمان
arcpy.env.workspace = “C:/Data”
mytext = “C:/Data/result.txt”
fc = “hospitals.shp”
prjfile = “C:/Projections/GCS_NAD_1983.prj”
sr = arcpy.SpatialReference(prjfile)
با arcpy.da.SearchCursor(fc, [” SHAPE@ “]، “”، sr) به عنوان مکان نما:
سپس یک فایل خروجی با استفاده ازباز کن()عملکرد. این تابع فایل را در حالت نوشتن باز می کند (“w”) تا بتوان خطوط جدیدی از متن را به صورت زیر روی آن نوشت:
output = open (“result.txt”، “w”)
مرحله بعدی تکرار روی ردیف ها، ایجاد یک شی هندسی برای هر ردیف و نوشتن مختصات x,y در فایل خروجی با استفاده ازنوشتن()روش. این قسمت از کد به شرح زیر است:
برای ردیف در مکان نما:
نقطه = ردیف[0]
output.write(f”{point.X} {point.Y}\n”)
مختصات به صورت درجه اعشار در یک رشته، با فاصله ای که مختصات ویژگی های نقطه را از هم جدا می کند، و با یک شکست خط (\n) برای شروع هر جفت مختصات در یک خط جدید نوشته می شود. آخرین مرحله بستن فایل خروجی با استفاده ازبستن()روش. کد کامل به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data”
mytext = “C:/Data/result.txt”
fc = “hospitals.shp”
prjfile = “C:/Projections/GCS_NAD_1983.prj”
sr = arcpy.SpatialReference(prjfile)
با arcpy.da.SearchCursor(fc, [” SHAPE@ “]، “”، sr) به عنوان مکان نما:
خروجی = باز (متن متن، “w”)
برای ردیف در مکان نما:
نقطه = ردیف[0]
output.write(f”{point.X} {point.Y}\n”)
output.close()
در این مثال، مرجع فضایی با استفاده از یک فایل پیشبینی موجود (prj.) تنظیم میشود، اما همچنین میتوان آن را از یک کلاس ویژگی موجود یا با استفاده از یک کد کارخانه به دست آورد.
توجه داشته باشید:
اگرچه تنظیم مرجع مکانی روی مکان نما می تواند برای تبدیل هندسه از یک سیستم مختصات به سیستم دیگر استفاده شود، اما قوی نیست. تنظیم هرگونه تبدیل داده ضروری به طور خودکار در نظر گرفته نمی شود و باید در اسکریپت به عنوان بخشی از محیط ها تنظیم شود.
9.9استفاده از اشیاء هندسه برای کار با ابزارهای ژئوپردازش
ورودیهای ابزارهای پردازش جغرافیایی اغلب از کلاسهای ویژگی تشکیل شدهاند. با این حال، گاهی اوقات، این کلاس های ویژگی هنوز وجود ندارند و باید از اطلاعات هندسه ایجاد شوند. در این حالت، می توانید یک کلاس ویژگی جدید ایجاد کنید، کلاس ویژگی را با استفاده از مکان نما پر کنید و سپس از کلاس ویژگی در ابزارهای پردازش جغرافیایی استفاده کنید. با این حال، این گردش کار می تواند دست و پا گیر شود. همانطور که قبلا در این فصل بحث شد، یک جایگزین استفاده از اشیاء هندسه به جای کلاسهای ویژگی موقت برای سادهتر کردن ژئوپردازش است. این بخش این جایگزین را با جزئیات بیشتری بررسی می کند.
به عنوان مثال، کد زیر فهرستی از اشیاء هندسه را از لیست مختصات ایجاد می کند و سپس از اشیاء هندسه به عنوان ورودی ابزار Buffer به شرح زیر استفاده می کند:
واردات کمان
arcpy.env.workspace = “C:/Data”
coordlist = [[523017.4, 4260650.0]،
[523125.8، 4260732.6]،
[523084.1، 4260787.2]]
لیست امتیاز = []
sr = arcpy.SpatialReference (“NAD 1983 UTM Zone 10N”)
برای x، y در فهرست هماهنگ:
point = arcpy.Point(x,y)
pointgeometry = arcpy.PointGeometry(point, sr)
pointlist.append(نقطه هندسه)
arcpy.Buffer_analysis(pointlist، “buffer.shp”، “10 METERS”)
در کد مثال، اشیاء هندسه به صورت لیستی از ایجاد می شوندنقطهاشیاء. ابتدا یک لیست خالی با استفاده از آن ایجاد می شودلیست امتیاز = []برای ذخیره اجسام هندسی دربرایحلقه، لیستی از جفت مختصات برای ایجاد استفاده می شودنقطهاشیاء با استفاده ازنقطهکلاس این اشیاء توسطهندسه نقطه ایکلاس برای ایجاد اشیاء هندسی با یک مرجع فضایی، که به لیست اضافه می شوند. این لیست از اشیاء هندسی به ورودی ابزار Buffer تبدیل می شود. یک جایگزین این است که ابتدا یک کلاس ویژگی بر اساس لیست مختصات ایجاد کنید، اما اگر این کلاس ویژگی برای چیز دیگری ضروری نباشد، استفاده از اشیاء هندسه منجر به کد کارآمدتر می شود. هیچ فایلی به جز نتیجه نهایی مورد نظر در خروجی نوشته نمی شود.
اشیاء هندسی همچنین می توانند مستقیماً به عنوان خروجی ابزارهای پردازش جغرافیایی ایجاد شوند. به عنوان مثال، کد زیر از اشیاء هندسی به عنوان خروجی ابزار Copy Features استفاده می کند. نتیجه لیستی از اجسام هندسی است که می توان از آنها برای تعیین ویژگی های خاص استفاده کرد، به شرح زیر:
واردات کمان
fc = “C:/Data/roads.shp”
geolist = arcpy.CopyFeatures_management(fc، arcpy.Geometry())
طول = 0
برای هندسه در زمین شناس:
طول += هندسه.طول
چاپ (f”طول کل: {length}”)
استفاده از اشیاء هندسه می تواند کارایی کد شما را بهبود بخشد زیرا از مراحل ایجاد کلاس های ویژگی موقت و استفاده از مکان نما برای خواندن همه ویژگی ها جلوگیری می کند.
نکاتی که باید به خاطر بسپارید
- نقاط، چند خط و چند ضلعی نمونه هایی از اجسام هندسی هستند. با تنظیم مکان نما در قسمت Shape یک کلاس ویژگی می توانید با اشیاء هندسی و ویژگی های آنها کار کنید. شما می توانید با شی هندسه کامل کار کنید (یعنیشکل@) شامل تمام خصوصیات آن مانند طول و مساحت است، اما می توانید از نشانه های هندسه نیز استفاده کنید (مثلاًSHAPE@XY) به عنوان میانبر برای ویژگی های خاص.
- اشیاء هندسه اغلب برای انجام وظایف در حافظه به جای ایجاد یک کلاس ویژگی موقت جدید یا اصلاح کلاس های ویژگی موجود استفاده می شوند.
- خواندن هندسه ها را می توان با استفاده از مکان نما جستجو انجام داد. رویکردهای خاصی برای خواندن ویژگی های ویژگی های چند قسمتی و چند ضلعی های دارای سوراخ ضروری است.
- ArcPy شامل چندین کلاس برای کار با اشیاء هندسی است. اساسی ترین آن استنقطهکلاس، که معادل یک راس واحد است و برای ایجاد تمام اشیاء هندسی دیگر استفاده می شود. ویژگی های چند خطی و چند ضلعی از چند رأس تشکیل شده و با استفاده از دو یا بیشتر ساخته می شوندنقطهاشیاء.
- ویژگی های جدید را می توان با استفاده از یک مکان نما در یک کلاس ویژگی یا با استفاده از یک ابزار پردازش جغرافیایی برای کپی کردن اشیاء هندسه در یک کلاس ویژگی جدید ایجاد کرد. ویژگی ها از رئوس ساخته می شوند که با استفاده از آنها ایجاد می شوندنقطهاشیاء. مختصات را می توان مستقیماً در یک اسکریپت وارد کرد یا از یک فایل برای ایجاد خواندن خواندنقطهاشیاء. برای ایجاد ویژگی های چند خطی و چند ضلعی، چندگانهنقطهاشیاء در یک ترکیب می شوندآرایههدف – شی.
- مرجع فضایی را می توان روی مکان نماها تنظیم کرد تا با هندسه ها در یک سیستم مختصات متفاوت از کلاس ویژگی کار کند.
شرایط کلیدی
- حلقه بیرونی
- کد قالب
- شیء هندسی
- نشانه هندسه
- حلقه داخلی
- ویژگی چند قسمتی
- ویژگی چند نقطه ای
- نقطه پوچ
- مسیر
- چند ضلعی با سوراخ
- حلقه
- ویژگی تک قسمتی
- راس
سوالات را مرور کنید
- توضیح دهید که چه زمانی از شی هندسه کامل استفاده می کنید (یعنی،شکل@) و زمانی که هنگام کار با مکان نما از یک نشانه هندسی متفاوت استفاده می کنید.
- چه تفاوتی بیننقطهوهندسه نقطه ایکلاس در ArcPy؟
- مراحل مربوط به خواندن هندسه ویژگی های موجود و چاپ مختصات رئوس را شرح دهید.
- ویژگی های چند قسمتی و چند ضلعی های دارای سوراخ چگونه بر نحوه کار شما با اجسام هندسی تأثیر می گذارند؟
- مراحل ایجاد ویژگی های جدید با استفاده از اشیاء هندسی را بر اساس فهرستی از مقادیر مختصات شرح دهید.
- چه هدفی داردآرایهکلاس در سرویس ArcPy، و چه زمانی از آن استفاده می کنید؟
بدون دیدگاه