رسم نقشه‌ی مجموعه‌ی داده‌های جهانی: قالب JSON

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

بارگذاری داده‌های زمین‌لرزه

فایل eq_1_day_m1.json را به پوشه‌ای منتقل کنید که در آن داده‌های این فصل را ذخیر132 ه کرده‌اید. زمین‌لرزه‌ها بر اساس بزرگی آن‌ها در مقیاس ریشتر دسته‌بندی می‌شوند. این فایل شامل داده‌های تمام زمین‌لرزه‌ها با بزرگی بزرگتر از M1 است که در ۲۴ ساعت گذشته رخ داده‌اند. (در زمان نگارش این متن) این داده از یکی منابع داده‌ی زمین‌لرزه مربوط به مطالعات زمین‌شناسی ایالات متحده آمده است که می‌توانید آن را در آدرس https://earthquake.usgs.gov/earthquakes/feed/ پیدا کنید.

بررسی داده‌ی JSON

زمانی که فایل eq_1_day_m1.json را باز می‌کنید خواهید دیدید که محتویّات آن بسیار فشرده و خواندن آن‌ها مشکل است:

1
2
3
4
5
6
7
{"type":"FeatureCollection","metadata":{"generated":1550361461000,...
{"type":"Feature","properties":{"mag":1.2,"place":"11km NNE of Nor...
{"type":"Feature","properties":{"mag":4.3,"place":"69km NNW of Ayn...
{"type":"Feature","properties":{"mag":3.6,"place":"126km SSE of Co...
{"type":"Feature","properties":{"mag":2.1,"place":"21km NNW of Teh...
{"type":"Feature","properties":{"mag":4,"place":"57km SSW of Kakto...
--snip--

این فایل بیشتر برای ماشین‌ها قالب‌بندی شده تا برای انسان‌ها. امّا می‌بینیم که این فایل شامل چند دیکشنری و همچنین اطّلاعاتی است که به آن‌ها علاقه‌مندیم مانند بزرگی زمین‌لرزه‌ها و موقعیّت‌های آن.

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import json

# Explore the structure of the data.
filename = 'data/eq_data_1_day_m1.json'

with open(filename) as f:
    all_eq_data = json.load(f)

readable_file = 'data/readable_eq_data.json'

with open(readable_file, 'w') as f:
    json.dump(all_eq_data, f, indent=4)

ابتدا ماژول json را وارد می‌کنیم تا داده‌ها را به درستی از فایل بخوانیم و کل این مجموعه‌داده را در all_eq_data ذخیره کنیم. تابع json.load() داده را به شکلی تبدیل می‌کند که پایتون بتواند با آن کار کند: در این مورد یک دیکشنری عظیم. سپس فایلی می‌سازیم که همان داده‌ها را به شکلی خواناتر در آن ذخیره کنیم. تابع json.dump() یک شیء داده‌ی JSON و یک شیء فایل دریافت می‌کند و داده را در فایل می‌نویسد. نشان‌وند indent=4 به تابع dump() می‌گوید که داده‌ها را با تورفتگی شکل دهد تا با ساختار داده جور دربیاید.

اکنون که در پوشه‌ی data فایل readable_eq_data.json را یافته و باز کنید، بخش اوّل آن را مانند زیر خواهید دید:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
    "type": "FeatureCollection",
    "metadata": {
        "generated": 1550361461000,
        "url": "https://earthquake.usgs.gov/earthquakes/.../1.0_day.geojson",
        "title": "USGS Magnitude 1.0+ Earthquakes, Past Day",
        "status": 200,
        "api": "1.7.0",
        "count": 158
    },
    "features": [
--snip--

بخش اوّل فایل قسمتی را با کلید "metadata" دربرمی‌گیرد. این قسمت به ما می‌گوید که فایل داده چه زمانی تولید شده و کجا می‌توانیم آن را به صورت آنلاین پیدا کنیم. همچنین عنوانی قابل خواندن و تعداد زمین‌لرزه‌های موجود در فایل هم در این بخش مشخّص می‌شود. در یک دوره‌ی ۲۴ ساعته ۱۵۸ زمین‌لرزه ثبت شده است.

این فایل geoJSON ساختاری دارد که برای داده‌های موقعیّت‌محور سودمند است. اطّلاعات در لیستی با کلید "features" ذخیره شده است. از آن‌جایی که این فایل حاوی داده‌های زمین‌لرزه‌ای است، داده‌های آن به شکل لیست آمده‌اند و هر عضو لیست مربوط به یک زمین‌لرزه است. این ساختار ممکن است گیج‌کننده به نظر بیاید امّا بسیار قدرتمند است و به زمین‌شناسان امکان می‌دهد که هر تعداد اطّلاعات که بخواهید در قالب یک دیکشنری برای هر زمین‌لرزه ذخیره کنند و سپس تمام دیکشنری‌ها را در یک لیست بزرگ قرار دهند.

بیایید به یکی از دیکشنری‌های مربوط به یک زمین‌لرزه نگاهی بیندازیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
--snip--
{
    "type": "Feature",
    "properties": {
        "mag": 0.96,
        --snip--
        "title": "M 1.0 - 8km NE of Aguanga, CA"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [
            -116.7941667,
            33.4863333,
            3.22
        ]
    },
    "id": "ci37532978"
},

کلید "properties" اطّلاعات بسیاری درباره‌ی هر زمین‌لرزه دارد. ما بیشتر به بزرگی هر زمین‌لرزه علاقه‌مندیم که در کلید مربوط به آن، "mag" قرار دارد. همچنین عنوان هر زمین‌لرزه هم برای ما جالب است که شامل خلاصه‌ای زیبا از بزرگی و موقعیّت آن است.

کلید "geometry" به ما کمک می‌کند که محل وقوع زمین‌لرزه را پیدا کنیم. این اطّلاعات برای رسم هر رخداد ضروری است. می‌توانیم طول و عرض جغرافیایی هر زمین‌لرزه را در لیستی با کلید "coordinates" پیدا کنیم.

این فایل از آن‌چه ما در کدهای خود نوشته‌ایم بسیار تودرتوتر است پس اگر گیج‌کننده به نظر می‌رسد نگران نشوید: پایتون بیشتر پیچیدگی را خود مدیریّت می‌کند. کار خود را با بیرون کشیدن یک دیکشنری مربوط به یکی از زمین‌لرزه که در ۲۴ ساعت گذشته رخ داد شروع می‌کنیم.

نکته
زمانی که درباره‌ی موقعیت‌ها صحبت می‌کنیم غالباً عرض جغرافیایی را ابتدا و سپس طول جغرافیایی را می‌آوریم. این قرارداد احتمالاً به این دلیل به وجود آمده که انسان‌ها عرض جغرافیایی را بسیار پیش‌تر از مفهوم طول جغرافیایی توسعه داده‌اند. با این حال بسیاری از چارچوب‌های جغرافیایی ابتدا طول و سپس عرض جغرافیایی را می‌آورند تا با قرارداد (x,y) در بیان‌های ریاضیاتی متناظر باشد. قالب geoJSON از قرارداد (طول، عرض) پیروی می‌کند و اگر شما از چارچوب دیگری استفاده می‌کنید مهم است که قرارداد مورد استفاده‌ی آن را یاد بگیرید.