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


یکی از مسائل مهم در کار «علم داده» (Data Science)، بصریسازی دادهها در یک نقشه جغرافیایی است و برای انجام این کار، «بستههای» (Packages) گوناگونی برای «زبان برنامهنویسی پایتون» (Python Programming Language) قابل استفاده هستند که از جمله آنها میتوان به «جئوپانداس» (GeoPandas) (+) اشاره کرد. اما گاهی نیز نصب این بستهها، متناسب با محیطی که کاربر استفاده میکند ممکن است کار دشواری باشد. راهکار دیگر، استفاده از کدهایی است که توسط خود کاربر نوشته میشوند. در این مطلب «راه سخت» چگونگی ساخت «توابع نقشههای جغرافیایی» با استفاده از «Shapefiles» و کتابخانههای پایهای پایتون آموزش داده خواهد شد. پس از مطالعه این راهنما کاربر قادر به ترسیم داده های جغرافیایی در پایتون است.
۱. فایلهای دارای فرمت Shapefiles
Shapefiles یک فرمت محبوب دادههای بردار جغرافیایی برای نرمافزارهای «سیستمهای اطلاعات جغرافیایی» (Geographic Information System | GIS است. این فرمت توسط «مؤسسه پژوهش سامانههای زیستمحیطی | اِرزی» (Environmental Systems Research Institute | Esri) به عنوان یک «استاندارد باز» (Open Standard) برای قابلیت همکاری دادهای میان اِرزی و دیگر محصولات نرمافزاری سیستمهای اطلاعات جغرافیایی تولید شده است.
فرمت فایل Shapefiles به طور فضایی هندسه را با «نقاط»، «چندخطیها» یا «چندضلعیها» توصیف میکند. در «OpenStreetMap» این موارد را میتوان به ترتیب به عنوان «گره» (Node)، «راهها» (ways) و «راههای بسته» (Closed Ways) در نظر گرفت. هر هندسه دارای مجموعهای از خصیصههای مرتبط است. به طور کلی این موارد چیزی شبیه تگهای OSM (+) هستند. فایل shapefile در حقیقت یک گروهبندی از چندین فایل است که قالببندی شدهاند تا جنبههای گوناگون از دادههای جغرافیایی را نمایش دهند. این موارد در ادامه بیان شدهاند.
- shp.: فرمت شکل؛ هندسه خود ویژگی
- shx.: فرمت اندیس شکل؛ یک اندیس موقعیتی برای هندسه ویژگی به منظور پذیرش دنبال کردن رو به جلو و رو به عقب به طور سریع
- dbf.: قالب خصیصه؛ خصیصههای ستونی برای هر شکل، در قالب dBase IV
چندین فایل اختیاری (قابل انتخاب) در فرمت shapefile وجود دارند. قابل توجهترین این موارد فایل prj. است که سیستم مختصات و اطلاعات طرحریزی را توصیف میکند. اگرچه فایل lyr. بخشی از استاندارد shapefile نیست، اما شامل آن میشود زیرا دارای مشخصههای چگونگی نمایش داده (رنگ، برچست و دیگر موارد) در نرمافزار «ArcGIS» (+) است.
۲. نصب کتابخانه پایتون Shapefile به نام PyShp
کتابخانه Shapefile پایتون به نام pyshp، از خواندن و نوشتن برای فرمت Shapefile اِرزی پشتیبانی میکند. فرمت Shapefile، یک فرمت داده برداری برای سیستمهای اطلاعات جغرافیایی محبوب است که توسط اِرزی (+) تولید شده.
برای نصب pyshp، باید کد زیر را در ترمینال اجرا کرد.
۳. ایمپورت کردن و مقداردهی اولیه کتابخانههای اصلی پایتون
مقداردهی اولیه مجموعه بصریسازی
کد زیر برای افرادی است که از «ژوپیتر نوتبوک» (Jupyter Notebook) استفاده میکنند.
۴. باز کردن یک نقشه برداری
همانطور که پیشتر بیان شد، یک نقشه بردار، گروهی از چندین نوع فایل است که 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 در سانتیاگو است.
۱۲. نتیجهگیری
در پایان میتوان فهمید که ساخت نقشه با استفاده از سه تابع توسعه داده شده در این راهنما، تنها با یک خط از کد امکانپذیر است.
آنچه در این مطلب توسعه داده شده، برای ناحیه Santiago Matropolitan است، که میتوان به سادگی آن را برای استفاده با هر نقشه برداری موجود در اینترنتی سازگار کرد. برای مثال، میتوان به «US Census Bureau» (+) رفت و Cartographic Boundary Shapefiles را برای ایالتهای آمریکا دانلود کرد. کد زیر برای سانتیاگو است:
که میتوان آن را ترسیم کرد:
Jupyter Notebook و همه دادههای مورد استفاده در این مقاله از گیتهاب (+) قابل دانلود هستند.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- مجموعه آموزشهای برنامهنویسی پایتون
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- مجموعه آموزشهای هوش محاسباتی
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- آموزش برنامهنویسی R و نرمافزار R Studio
- مجموعه آموزشهای برنامه نویسی متلب (MATLAB)
- معرفی منابع آموزش ویدئویی هوش مصنوعی به زبان فارسی و انگلیسی
- تبدیل دادههای بدون ساختار به ساختیافته با پایتون و API نقشه گوگل — راهنمای کامل
^^