مقدمه

در این درس، ما با یک فرمت داده دیگر به نام GeoJSON کار خواهیم کرد. GeoJSON یک فرمت استاندارد بر پایه JSON است که برای نمایش و انکود کردن عوارض جغرافیایی (geographical features) مانند نقاط، خطوط و چندضلعی‌ها به کار می‌رود. این فرمت به طور گسترده در اپلیکیشن‌های نقشه‌برداری وب و سیستم‌های اطلاعات جغرافیایی (GIS) استفاده می‌شود.

ما قصد داریم داده‌های مربوط به زلزله‌های یک ماه گذشته را از وب‌سایت USGS دانلود کرده و با استفاده از کتابخانه Plotly، مکان وقوع آنها را روی یک نقشه جهانی نمایش دهیم.

بررسی ساختار داده‌های GeoJSON

یک فایل GeoJSON معمولاً یک شیء JSON است که حداقل یک عضو به نام features دارد. این عضو، لیستی از تمام عوارض جغرافیایی (در اینجا، زلزله‌ها) است. هر عارضه خود یک شیء است که شامل یک بخش geometry (حاوی مختصات) و یک بخش properties (حاوی اطلاعات توصیفی مانند شدت زلزله) می‌باشد.

خواندن و پردازش فایل

ما با استفاده از ماژول json که در فصل قبل با آن آشنا شدیم، این فایل را خوانده و داده‌های مورد نیاز خود (طول و عرض جغرافیایی و شدت هر زلزله) را استخراج می‌کنیم.

Copy Icon PYTHON
import json

# Explore the structure of the data.
filename = 'data/eq_data_1_day_m1.geojson'
with open(filename) as f:
    all_eq_data = json.load(f)

all_eq_dicts = all_eq_data['features']

mags, lons, lats = [], [], []
for eq_dict in all_eq_dicts:
    mag = eq_dict['properties']['mag']
    lon = eq_dict['geometry']['coordinates'][0]
    lat = eq_dict['geometry']['coordinates'][1]
    mags.append(mag)
    lons.append(lon)
    lats.append(lat)

print(mags[:10])
print(lons[:5])
print(lats[:5])

در این کد، ما فایل GeoJSON را باز کرده و آن را به یک دیکشنری پایتون تبدیل می‌کنیم. سپس روی لیست features حلقه زده و از هر دیکشنری زلزله، مقادیر شدت (mag)، طول جغرافیایی (lon) و عرض جغرافیایی (lat) را استخراج و در لیست‌های مجزا ذخیره می‌کنیم.

رسم نقشه جهانی زلزله‌ها

اکنون که داده‌های خود را آماده کرده‌ایم، می‌توانیم با استفاده از Plotly Express (یک رابط سطح بالاتر برای Plotly) یک نقشه پراکندگی (scatter plot) جهانی بسازیم.

Copy Icon PYTHON
import plotly.express as px

# ... (previous data extraction code) ...

fig = px.scatter_geo(lat=lats, lon=lons)
fig.show()

تابع px.scatter_geo() به صورت خودکار یک نقشه جهان ایجاد کرده و نقاط ما را بر اساس طول و عرض جغرافیایی روی آن ترسیم می‌کند.

سفارشی‌سازی نمودار

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

Copy Icon PYTHON
# ... (previous data extraction code) ...

fig = px.scatter_geo(lat=lats, lon=lons, size=mags,
                    title='Global Earthquakes',
                    color=mags,
                    color_continuous_scale='Viridis',
                    labels={'color':'Magnitude'},
                    projection='natural earth',
                    hover_name=hover_texts  # Assuming hover_texts is a list of location strings
                    )
fig.show()

در این نسخه نهایی، ما با استفاده از پارامترهای size و color، شدت زلزله‌ها را به صورت بصری نمایش داده‌ایم. color_continuous_scale یک طیف رنگی برای نمایش مقادیر عددی مشخص می‌کند. projection نیز نوع پروجکشن نقشه را تعیین می‌کند.

در این درس، با فرمت GeoJSON و نحوه پردازش و مصورسازی داده‌های جغرافیایی با استفاده از پایتون و کتابخانه Plotly آشنا شدیم. با این درس، فصل «دانلود داده» به پایان می‌رسد. ما اکنون می‌توانیم با فرمت‌های داده رایج مانند CSV و JSON کار کرده و آنها را به نمودارهای معنادار و تعاملی تبدیل کنیم. در فصل بعدی، به سراغ «کار با APIها» خواهیم رفت و یاد می‌گیریم که چگونه به صورت برنامه‌نویسی داده‌ها را از سرویس‌های وب دریافت کنیم.