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

Cartopy هي مكتبة قوية ومعروفة مثالية لرسم الخرائط الثابتة باستخدام بيانات قياسية أو متعددة الأضلاع. وهي توفر العديد من الطبقات المضمنة للحدود الأرضية والمائية والإدارية. وهي سهلة الاستخدام حقًا وتحتوي على مجموعة بديهية من الأوامر.
على سبيل المثال، دعنا نحاول تصور بيانات MODIS. إذا كنت تريد المتابعة، يمكنك العثور على الكود هنا.
لتثبيت الحزمة، يمكنك استخدام تعبير عادي مع pip:
1 | !pip install cartopy |
الآن دعونا نحمل البيانات:
1 2 3 4 5 6 | import numpy as npimport matplotlib.pyplot as pltlats = 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 projectionfig, 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 sizeax.set_extent([-160, -105, 40 ,70], crs=ccrs.PlateCarree())#let's limit the coordinates to have only the region of MODIS productplt.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 gridlon, 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 foliummap = folium.Map(location=(50, 0), zoom_start=8)#location - the center of the map, zoom_start - the resolutionmap |

يمكنك استخدام بلاط افتراضي مختلف أو الإشارة إلى بلاط مخصص:
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 gpddf = 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 pxfig = 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 Mapm = 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 Velocityimport xarray as xrimport osimport requestsif 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 eeradius = 1250 point=ee.Geometry.Point([19.9, 60.2])roi = point.buffer(radius) #setting a circle around the point of interestDW = ee.ImageCollection("GOOGLE/DYNAMICWORLD/V1")\ .filterDate(start = '2022-07-08', end='2022-08-30')\ .filterBounds(roi) #getting the dataDW_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 imageryviz_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 aream.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 pltfrom ridge_map import FontManager, RidgeMapimport ridge_map as rmimport mplcyberpunkimport matplotlib.font_manager as fmplt.style.use("cyberpunk")plt.rcParams["figure.figsize"] = (16,9)fm = FontManager('https://github.com/google/fonts/blob/main/ofl/arbutusslab/ArbutusSlab-Regular.ttf?raw=true')r = RidgeMap(bbox=(-15, 32, 45,90), font=fm.prop) #creating a mapvalues =r.get_elevation_data(num_lines=200) #getting elevation datavalues = 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 |

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