ترسیم داده های جغرافیایی در پایتون – راهنمای جامع


۱. فایلهای دارای فرمت Shapefiles
Shapefiles یک فرمت محبوب دادههای بردار جغرافیایی برای نرمافزارهای «سیستمهای اطلاعات جغرافیایی» (Geographic Information System | GIS است. این فرمت توسط «مؤسسه پژوهش سامانههای زیستمحیطی | اِرزی» (Environmental Systems Research Institute | Esri) به عنوان یک «استاندارد باز» (Open Standard) برای قابلیت همکاری دادهای میان اِرزی و دیگر محصولات نرمافزاری سیستمهای اطلاعات جغرافیایی تولید شده است.
- shp.: فرمت شکل؛ هندسه خود ویژگی
- shx.: فرمت اندیس شکل؛ یک اندیس موقعیتی برای هندسه ویژگی به منظور پذیرش دنبال کردن رو به جلو و رو به عقب به طور سریع
- dbf.: قالب خصیصه؛ خصیصههای ستونی برای هر شکل، در قالب dBase IV
۲. نصب کتابخانه پایتون Shapefile به نام PyShp
برای نصب pyshp، باید کد زیر را در ترمینال اجرا کرد.
۳. ایمپورت کردن و مقداردهی اولیه کتابخانههای اصلی پایتون
مقداردهی اولیه مجموعه بصریسازی
۴. باز کردن یک نقشه برداری
همانطور که پیشتر بیان شد، یک نقشه بردار، گروهی از چندین نوع فایل است که shp. اصلیترین آنها محسوب میشود، و در واقع جایی است که ویژگیهای جغرافیایی ذخیره شدهاند. شایان توجه است که سایر فایلها به صورت «name.dbf» ،«name.shx» و دیگر موارد باید در پوشه مشابهی باشند.
در این راهنما، با نقشههای مربوط به شهرها (Comunas) که در کنار هم «منطقه مادرشهری سانتیاگو» (Santiago Metropolitan Region) را میسازند کار میشود. در «موسسه آمار ملی شیلی» (Chilean National Institute of Statistics | INE) امکان دانلود گروهی از shapefileهای مرتبط با نقشهها که در آخرین سرشماری ملی سال ۲۰۱۷ ساخته شد وجود دارد.
- Comuna.cpg
- Comuna.shp
- Comuna.dbf
- Comuna.shp.xml
- Comuna.prj
- Comuna.shx
- Comuna.sbn
- Comuna.sbx
اکنون میتوان بررسی کرد که چه تعداد «شکل» (shape) متفاوت توسط تابع shp.Reader ایمپورت شده است.
نتیجه برابر با ۵۲ است. این یعنی ۵۲ شکل روی فایلهای shape وجود دارند و این به لحاظ مفهومی نیز صحیح است زیرا منطقه مادری (کلانشهری) دارای ۵۲ شهر (comunas) است که در نقشه زیر نمایش داده شدهاند (پیش از پایان این مطلب، چگونگی ساخت نقشهای مانند آنچه در شکل زیر مشاهده میشود، آموزش داده خواهد شد).

اکنون و با استفاده از کد زیر یکی از اشکال (یا رکوردها) جستوجو میشود.
نتیجه خروجی یک آرایه با ۶ عنصر است.
Out: ['13', '131', '13115', 'REGIÓN METROPOLITANA DE SANTIAGO', 'SANTIAGO', 'LO BARNECHEA']
عنصر [5] نام شهر (comuna) و برای این مورد «LO BARNECHEA» است. این شهر در بخش شرقی شهر قرار دارد که کوههای «Andes» واقع شدهاند. میتوان نام شهر را به طور مستقیم به صورت زیر دریافت کرد.
مرکزیترین بخش شهر «منطقه مادری سانتیاگو»، دقیقا «Comuna of Santiago» است که «کلیسای جامع مکزیکوسیتی» (Metropolitan Catedral)، «کاخ ریاست جمهوری لا موندا» (La Moneda Presidential Palace) و خانه «پابلو نرودا» (Pablo Neruda) در آن قرار دارند.

اکنون، با بهرهگیری از کد زیر، نگاهی به ساختار داده سانتیاگو میشود.
خروجی:
Out: [‘13’, ‘131’, ‘13101’, ‘REGIÓN METROPOLITANA DE SANTIAGO’, ‘SANTIAGO’, ‘SANTIAGO’]
می توان مشاهده کرد که برخی از دادهها تغییر کردهاند و مهمتر آنکه نام شهر اکنون «SANTIAGO» است.
5. تبدیل دادههای shapefile در دیتافریم Pandas
در مثال آخر، نگارنده این مطلب از پیش میدانسته که ID شهر سانتیاگو برابر با ۲۵ است.
اما چگونه میتوان این id را با شروع از نام آن شهر به دست آورد؟ ابتدا باید یک تابع مفید برای تبدیل فرمت «shapefile» به یک فرمت متداولتر Pandas پیدا کرد.
اکنون، باید دادههای sf را روی یک دیتافریم تبدیل، و بررسی کرد که چگونه به نظر میرسد.
دیتا فریم دارای شکل (52, 7) است. این یعنی ۷ ویژگی متفاوت (ستون) برای هر خط (comuna) وجود دارد. شایان توجه است که پیشتر، ۶ مورد از آنها مشاهده شدند. به نظر میرسد یک مورد دیگر اکنون اضافه شده است. در ادامه نمونهای ارائه شده:

ستون آخر مختصاتها، طول و عرض جغرافیایی هر نقطه هستند که برای ساخت یک شکل خاص از نقشه مورد استفاده قرار میگیرد. اگر مساله گیج کننده به نظر میرسد جای نگرانی وجود ندارد چون در ادامه به طور کامل تشریح خواهد شد.
چگونه میتوان ID شهر Santiago را به دست آورد؟ با استفاده از کتابخانه Pandas این کار بسیار آسان است.
میتوان به سادگی مشاهده کرد که ۲۵ دقیقا اندیس دیتافریم و جایی که شهر در آن قرار گرفته است. با دستور سادهای از Pandas میتوان اندیس (یا ID) را همراه با نام شهر دریافت کرد.
خروجی:
Out: 0 LAS CONDES 1 LO BARNECHEA 2 VITACURA 3 HUECHURABA 4 PUDAHUEL … 49 ALHUÉ 50 LAMPA 51 TILTIL
۶. ترسیم یک شکل خاص
در نهایت، میتوان مشاهده کرد که shape دقیقا چیست. برای این کار، باید تابعی برای ترسیم آن ساخت.
از کتابخانه پایتون MatPlotLib برای انجام این کار استفاده میشود.
تابع بالا دو کار انجام میدهد:
- ترسیم شکل (چندضلعی) بر پایه مختصاتهای شهرها
- محاسبه و بازگرداندن «نقطه متوسط» (Medium Point) آن شکل خاص (x0, y0)
این نقطه متوسط، همچنین برای تعریف جایی که نام شهر چاپ شود استفاده میشود. برای مثال، این کار برای شهر معروف سانتیاگو به صورت زیر انجام میشود.

لازم به توجه است که برای ترسیم یک شکل، باید ID آن را دانست. البته در کد بالا، از نام شهر (SANTIAGO) برای انجام این کار استفاده شد. استفاده از Pandas برای محاسبه ID کار سادهای بود که پیشتر توضیح داده شد و میتوان خط دوم کد بالا را با کد مربوط به این کار جایگزین کرد.
۷. ترسیم یک نقشه کامل
ترسیم یک شکل تنها اساسا به منظور کار کردن با بخش کوچکی از کد است.
اکنون، باید همه اشکالی که در دیتافریم موجود هستند در تصویر مشابهی ترسیم شوند.
تابع بالا، به طور پیشفرض، همه اشکال روی فایل df را به همراه ID هر شکل در میان آن ترسیم میکند. همچنین، میتوان یک نقشه بزرگنمایی شده را ترسیم کرد. میتوان کد را به گونهای تغییر داد که IDها را پرینت کند یا نکند.
ترسیم یک نقشه کامل

ترسیم یک نقشه بزرگنمایی شده:

۸. ترسیم یک شکل در نمودار کامل
میتوان دو تابع پیشین را «ادغام» (merge) و یک شکل تنها را درون نمودار کامل «ترسیم» (plot) کرد.
بدین منظور، باید یک تابع جدید نوشت که شماره محل در آن پارامتر ورودی است.
ترسیم شهر سانتیاگو به رنگ قرمز:

برای «پُر» (fill) کردن یک شکل کامل با یک رنگ خاص میتوان از plt.fill استفاده کرد. تابع را میتوان به صورت زیر بازنویسی کرد.
ترسیم شهر Las Condes (که ID = 0) به رنگ سبز (g) با استفاده از قطعه کد زیر انجام میشود.

۹. ترسیم چندین شکل روی یک نقشه کامل
گام بعدی در «سفر دشوار ترسیم نقشه»، ساخت چندین شکل انتخابی است. برای این کار، به جای داشتن یک ID به عنوان پارامتر ورودی، لیستی از IDها وجود دارد و یک حلقه for برای پر کردن هر یک از آنها با رنگ استفاده میشود.
تابع ویرایش شده به صورت زیر است.
در تابع بالا، «comuna» (شهر) اکنون لیستی از IDها است.

با استفاده از فرصتی که دیتافریم Pandas پیشین فراهم کرده، میتوان تابع سادهای ساخت که ورودی آن نام comuna است به جای آنکه ID آن باشد.
ترسیم «شهرهای جنوبی» (southern comunes) از Santiago Metropolitan Region با استفاده از کدهای زیر انجام میشود.

۱۰. ساخت نقشههای گرمایی
یک نوع بسیار پر کاربرد از نقشه، پر کردن شکل خاص یا یک رنگ به صورتی است که «شدت» آن متناسب با یک مقداری معین است. در این راستا، میتوان یک رویکرد کلی روی توزیع دادهها در یک ناحیه جغرافیایی -برای مثال توزیع جمعیت - داشت. انجام این کار، با داشتن یک چشمانداز کلی پیرامون توزیع دادهها روی یک ناحیه جغرافیایی مشخص است.
در این راستا، ابتدا تابعی ساخته میشود که با دریافت لیست داده، آنها را به «ردههایی» (bins) تقسیم میکند. به هر یک از این ردهها یک رنگ خاص تخصیص داده میشود. بر اساس تجربه، معمولا داشتن ۵ الی ۷ رده برای داشتن حس خوبی از توزیع دادهها مناسب است. در اینجا از ۶ رده و ۴ پالت رنگ متفاوت مرتبط با ردهها استفاده میشود. در زمان باید یکی از این ردهها انتخاب شوند.
هر دو تابع ()plot_comunas و plot_map_fill_multiples_ids باید برای استفاده از مزایای این طرح رنگی سازگار شوند.
و:
به منظور ارزیابی تابع جدید، لیست قبلی اشکال برای نواحی جنوبی سانتیاگو دریافت میشود، یک مقدار عمومی به هر یک از آنها تخصیص داده میشود. از «('color pallete #1 ('Purples» در این راستا استفاده میشود.

۱۱. ترسیم دادههای واقعی
برای پایان راهنمای چگونگی ترسیم نقشه در پایتون، از دادههای واقعی مربوط به آخرین سرشماری سال ۲۰۱۷ شیلی استفاده و تابعهای ساخته شده در بخش پیشین روی آن اعمال میشوند.
خواندن مجموعه داده
مجموعه داده دارای ۵۲ خط است و هنگامی معنا میدهد که هر خط شامل دادههای مرتبط با هر یک از شهرهای سانتیاگو باشد.

برای مثال، ستون «PERSONAS» مرتبط با تعداد افرادی است که در هر شهر زندگی میکنند. «TOTAL_VIV» تعداد کل خانهها در آن شهر است.
ترسیم نمودار
اکنون تابعهای نقشه برای تحلیل چگونگی توزیع جمعیت در ناحیه Santiago Metropolitan مورد استفاده قرار میگیرند.

میتوان مشاهده کرد که جمعیت به شدت حول محور ناحیه مرکزی Metropolitan توزیع شده. به سمت شرق (سمت راست روی نقشه) جمعیت تُنُک است و این موضوع با توجه به اینکه در آن منطقه کوههای Andes واقع شده منطقی محسوب میشود. به سمت غرب و جنوب نواحی کشاورزی قرار دارند. یک گام دیگر ترسیم درصد مهاجرتکنندگان نسبت به کل جمعیت Metropolitan Region در سانتیاگو است.

۱۲. نتیجهگیری
در پایان میتوان فهمید که ساخت نقشه با استفاده از سه تابع توسعه داده شده در این راهنما، تنها با یک خط از کد امکانپذیر است.
که میتوان آن را ترسیم کرد:

اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- مجموعه آموزشهای برنامهنویسی پایتون
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- مجموعه آموزشهای هوش محاسباتی
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- آموزش برنامهنویسی R و نرمافزار R Studio
- مجموعه آموزشهای برنامه نویسی متلب (MATLAB)
- معرفی منابع آموزش ویدئویی هوش مصنوعی به زبان فارسی و انگلیسی
- تبدیل دادههای بدون ساختار به ساختیافته با پایتون و API نقشه گوگل — راهنمای کامل
^^
مطالب مجله فرادرس را در جستجوی گوگل سریعتر ببینید













