الجمعة، 14 فبراير 2025

6 مكتبات بايثون لإنشاء خرائط جميلة

 في مرحلة ما، يواجه أي عالم بيانات الحاجة إلى تحليل أو نمذجة البيانات الجغرافية المكانية، ولا يمكن القيام بذلك دون الجزء المرئي الحاسم. ولأنني من عشاق الخرائط، يسعدني أن أشارك معك هذه المكتبات الست الرائعة لإنشاء خرائط مفيدة وأنيقة. بعض المكتبات التي شاركتها هنا مناسبة أكثر للتصورات الثابتة، والبعض الآخر مناسب للتصورات التفاعلية، وبالتالي فإن نطاق المشكلات التي يمكنها معالجتها واسع.


Cartopy

Cartopy هي مكتبة قوية ومعروفة مثالية لرسم الخرائط الثابتة باستخدام بيانات قياسية أو متعددة الأضلاع. وهي توفر العديد من الطبقات المضمنة للحدود الأرضية والمائية والإدارية. وهي سهلة الاستخدام حقًا وتحتوي على مجموعة بديهية من الأوامر.

على سبيل المثال، دعنا نحاول تصور بيانات MODIS. إذا كنت تريد المتابعة، يمكنك العثور على الكود هنا.

لتثبيت الحزمة، يمكنك استخدام تعبير عادي مع pip:

1
!pip install cartopy

الآن دعونا نحمل البيانات:

1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt
 
lats = np.load('lats.npy')
lons = np.load('lons.npy')
data = np.load('data.npy')

بعد ذلك يمكننا رسم البيانات على الفور:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
proj = ccrs.PlateCarree() #let's set the map's projection
 
fig, ax = plt.subplots(subplot_kw=dict(projection=proj), figsize=(10, 20))#now we need to create a figure with the pre-set projection and a size
 
ax.set_extent([-160, -105, 40 ,70], crs=ccrs.PlateCarree())#let's limit the coordinates to have only the region of MODIS product
 
plt.contourf(lons, lats, data,
             transform=ccrs.PlateCarree(), cmap = 'summer') #let's add a countor of the data using matplotlib
'''Adding nice cartopy features'''
ax.add_feature(cfeature.BORDERS, edgecolor='black', linewidth=1)
ax.add_feature(cfeature.LAKES,  alpha=0.5)
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.COASTLINE, edgecolor='black', linewidth=1)
ax.add_feature(cartopy.feature.RIVERS, edgecolor='blue', linewidth=0.5)
states_provinces = cfeature.NaturalEarthFeature(
            category='cultural',  name='admin_1_states_provinces',
            scale='10m', facecolor='none')
ax.add_feature(states_provinces, edgecolor='black', zorder=10, linestyle = '-', linewidth=0.5)
 
 
ax.gridlines(draw_labels=True)#formating the grid
 
lon, lat = -122.8414, 55.1119
ax.plot(lon,lat,  'bo', markersize=6, color = 'red', transform=ccrs.Geodetic())#adding some random marker to the map

كما يمكنك الحكم من النتيجة، يوفر Cartopy وفرة كبيرة من الطرق لتخصيص خريطتك، حيث يمكنك ضبط الألوان وعرض الخطوط والكثافة وغير ذلك من المعلمات الخاصة بطبقاتك يدويًا. بالإضافة إلى ذلك، فإن الكود نفسه بديهي للغاية وسهل الفهم.

ميزة كبيرة أخرى للمكتبة هي عدد الإسقاطات المختلفة التي يمكن استخدامها، وبالتالي فإن نطاق البيانات التي يمكنك تصورها باستخدام cartopy ضخم!

يعد Cartopy أحد الأدوات التي أستخدمها بانتظام في عملي، وآمل أن تجدها مفيدة للغاية أيضًا!

Folium

ربما تكون هذه المكتبة هي الأكثر شهرة في الصناعة، نظرًا لأنها تفاعلية (تحتوي على JS) وقابلة للتخصيص بدرجة كبيرة. وللبدء في التخطيط (بعد التثبيت)، يمكنك ببساطة الاتصال بـ:

1
2
3
import folium
map = folium.Map(location=(50, 0), zoom_start=8)#location - the center of the map, zoom_start - the resolution
map

يمكنك استخدام بلاط افتراضي مختلف أو الإشارة إلى بلاط مخصص:

1
2
map = folium.Map(location=(50, 0), zoom_start=8, tiles="Cartodb Positron")
map

الآن دعنا نضيف بلدان العالم. للقيام بذلك، سأستخدم إطار بيانات geopandas الافتراضي:

1
2
3
4
5
6
7
8
import geopandas as gpd
df = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
 
map = folium.Map(zoom_start=4, tiles="Cartodb Positron")
gdf_json = df.to_json()
 
folium.GeoJson(gdf_json).add_to(map)
map

Plotly

Plotly هي مكتبة أخرى شهيرة معروفة بمخططاتها التفاعلية الجميلة. ومن بين العديد من الميزات، تحتوي على العديد من الوظائف لرسم الخرائط، مثل px.choropleth وpx.choropleth_mapbox وpx.scatter_mapbox وpx.scatter_geo وبعض الوظائف الأخرى. يمكنك العثور على مزيد من التفاصيل هنا.

كتوضيح، دعنا نرسم نفس مجموعة بيانات geo pandas، ولكن هذه المرة بتصور متغير gdp_md_est. يمكن القيام بذلك بسهولة شديدة ضمن الأسطر التالية:

1
2
3
4
5
6
import plotly.express as px
 
fig = px.choropleth(df, locations='iso_a3', hover_name='name',
                    color='gdp_md_est',
                    projection='natural earth')
fig.show()

ipyleaflet

المكتبة الرابعة التي أريد أن أعرضها عليكم هي ipyleaflet. إنها مكتبة أخرى رائعة تعتمد على JS لإنشاء خرائط تفاعلية. أحد الأشياء المفضلة لدي في هذه الحزمة هو عدد المربعات التي تحتوي عليها. لذا فلنبدأ بالأساسيات:

1
2
3
4
from ipyleaflet import Map
 
m = Map(center=(45, 2), zoom=5)
m

لا يوجد شيء خاص، أليس كذلك؟ ولكن الآن دعنا نستخدم منتج MODIS Terra كخريطة أساسية لنا!

1
2
3
m = Map(basemap=basemap_to_tiles(basemaps.NASAGIBS.ModisTerraTrueColorCR, "2023-08-08"),
    center=(45, 2), zoom=5)
m

أو يمكننا استخدام بيانات VIIRS لتصور الأرض في الليل:

1
2
3
m = Map(basemap=basemaps.NASAGIBS.ViirsEarthAtNight2012,
    center=(45, 2), zoom=5)
m

يمكنك اللعب مع خيارات أخرى، فهناك العشرات منها حرفيًا!

الآن دعنا نرسم بعض البيانات من العالم الحقيقي. إحدى أكثر الميزات المثيرة للإعجاب في المكتبة التي وجدتها هي تصور السرعة. لهذا الغرض، يمكننا استخدام بيانات توقعات NCEP(WMC)، والتي تتميز بدقة 1 درجة. تم الحصول على مجموعة البيانات للفترة 2016–04–30 06:00 وتم توفيرها في مستندات مكتبة ipyleaflet. لقراءتها، سنستخدم xarray، وهو مثالي لقراءة ملفات netCDF4.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from ipyleaflet.velocity import Velocity
import xarray as xr
import os
import requests
 
if not os.path.exists('wind-global.nc'):
  r = requests.get(url)
  wind_data = r.content
  with open('wind-global.nc', 'wb') as f:
      f.write(wind_data)
 
m = Map(center=(45, 2), zoom=4, interpolation='nearest', basemap=basemaps.CartoDB.DarkMatter)
 
ds = xr.open_dataset('wind-global.nc')
 
wind = Velocity(data=ds,
                zonal_speed='u_wind',
                meridional_speed='v_wind',
                latitude_dimension='lat',
                longitude_dimension='lon',
                velocity_scale=0.01,
                max_velocity=20)
m.add(wind)
 
m

كما ترى، فإن الناتج ليس مجرد خريطة تفاعلية، بل هو خريطة متحركة. لذا فهو يعزز بالتأكيد تمثيل البيانات ويجعل بياناتك تتحدث!

geemap

Geemap عبارة عن حزمة لرسم الخرائط التفاعلية متكاملة مع محرك Google Earth. لذا فمن الواضح أنها مريحة حقًا عند العمل مع مكتبة Python ee، وهي حزمة Python GEE.

على سبيل التوضيح، دعونا نجمع بيانات الغطاء الأرضي من منتج Dynamic World لجزيرة في شمال أوروبا:

1
2
3
4
5
6
7
8
9
10
import ee
 
radius = 1250
point=ee.Geometry.Point([19.9, 60.2])
roi = point.buffer(radius) #setting a circle around the point of interest
 
DW = ee.ImageCollection("GOOGLE/DYNAMICWORLD/V1")\
                  .filterDate(start = '2022-07-08', end='2022-08-30')\
                  .filterBounds(roi) #getting the data
DW_list = DW.toList(DW.size()) #converting the data to GEE List

الآن يمكننا القيام بالتخطيط:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
m = geemap.Map(center=[60.2, 19.9], zoom=14)
 
m.add_basemap('HYBRID') #adding a layer of Sentinel-2 imagery
viz_params = {'bands':'label', 'min':0, 'max':8,
'palette':['419bdf',
    '397d49',
    '88b053',
    '7a87c6',
    'e49635',
    'dfc35a',
    'c4281b',
    'a59b8f',
    'b39fe1']}
m.add_ee_layer(ee.Image(DW_list.get(9)), viz_params) #adding an image №9, as it has low cloud coverage for this area
m.add_legend(title="Dynamic World Land Cover", builtin_legend='Dynamic_World')
display(m)

أود أن أقول إن geemap أداة رائعة حقًا للعمل مع GEE. فهي تحتوي على العديد من الوظائف المختلفة، والتي يمكنها حل مجموعة كبيرة من المهام. العيب الرئيسي والوحيد هو أنها ليست سهلة الاستخدام للغاية. تحتاج إلى معرفة قواعد بناء الجملة لمكتبة ee وأن يكون لديك فهم عام لكيفية عمل GEE قبل استخدام geemap.

ridgemap

هذه المكتبة هي الأخيرة والمفضلة حقًا بالنسبة لي، لأنها تسمح بإنشاء قطع فنية فريدة من نوعها.

قبل التخطيط، دعنا نقوم بتثبيت مكتبتين:

1
!pip install ridge_map mplcyberpunk

الآن دعونا ننشئ خريطة:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import matplotlib.pyplot as plt
from  ridge_map import FontManager, RidgeMap
import ridge_map as rm
import mplcyberpunk
import matplotlib.font_manager as fm
 
plt.style.use("cyberpunk")
plt.rcParams["figure.figsize"] = (16,9)
 
 
r = RidgeMap(bbox=(-15, 32, 45,90), font=fm.prop) #creating a map
 
values =r.get_elevation_data(num_lines=200) #getting elevation data
values = r.preprocess(values=values, #setting hypoparameters
   water_ntile=70,
   vertical_ratio=40,
   lake_flatness=3)
 
r.plot_map(values, label="Europe", label_x=0.4,label_y=-0.05, label_size=60, line_color=plt.get_cmap('inferno'), background_color="#212946")
mplcyberpunk.add_glow_effects() #adding glowing

من وجهة نظري، هذا رائع! يمكنك الاطلاع على المكتبة والعثور على العديد من التصورات الأخرى ونشر تصوراتك الخاصة:)

نأمل أن تجد هذه المكتبات مفيدة وتستحق أن تدرجها في صندوق الأدوات الخاص بك.

ليست هناك تعليقات:

إرسال تعليق

10 مشاريع صعبة للمستوى المتوسط ​​لتعزيز مهاراتك في بايثون ومحفظتك

  هل تريد تسريع عملية   التعلم ؟ هل سئمت من عدم ثقتك بنفسك بما يكفي لوصف نفسك بالخبير؟ أو ربما تكون كذلك، ولكن في أعماقنا نعلم أن هذا ليس صح...