ویژگی تصویر

کتابخانه geopandas در پایتون — راهنمای کامل و کاربردی

  /  پایتون   /  کتابخانه geopandas در پایتون
بنر تبلیغاتی الف

GeoPandas یکی از مهم‌ترین کتابخانه‌های پردازش داده‌های مکانی (geospatial) در اکوسیستم پایتون است. این کتابخانه با ترکیب قابلیت‌های pandas و ابزارهای هندسی مانند Shapely و Fiona، کار با داده‌های برداری (vector) جغرافیایی را ساده و قدرتمند می‌کند. در این مقاله به مفاهیم کلیدی، مثال‌های عملی، نکات بهینه‌سازی و کاربردهای واقعی خواهیم پرداخت.

نصب و پیش‌نیازها

بهترین روش نصب GeoPandas استفاده از conda است تا وابستگی‌های باینری به‌خوبی مدیریت شوند. مثال‌ها:

conda install -c conda-forge geopandas
# یا با pip (ممکن است نصب وابستگی‌های باینری مشکل‌ساز باشد)
pip install geopandas

نصب با conda معمولاً ساده‌تر است زیرا پکیج‌های C/C++ مانند GEOS، PROJ و GDAL نیز نصب می‌شوند. اگر با pip نصب می‌کنید، مراقب نسخه‌های GDAL و پروجکشن‌ها باشید.

مفاهیم پایه

  • GeoSeries: مشابه pandas Series اما هر ردیف یک هندسه (Point, LineString, Polygon) دارد.
  • GeoDataFrame: مشابه pandas DataFrame اما یک ستون هندسی مخصوص (معمولاً با نام geometry) دارد.
  • CRS (Coordinate Reference System): تعریف سیستم مختصات؛ مدیریت صحیح CRS برای محاسبات فضایی ضروری است.
  • Shapely, Fiona, pyproj: کتابخانه‌هایی که GeoPandas روی آن‌ها سوار است و عملیات هندسی، خواندن/نوشتن و تبدیل CRS را انجام می‌دهند.

مثال‌های عملی

خواندن یک فایل شیپ و نمایش سریع:

import geopandas as gpd

gdf = gpd.read_file("data/cities.shp")
print(gdf.crs)
gdf.plot(column="population", cmap="viridis", legend=True)

این کد فایل شیپ را می‌خواند، CRS را چاپ می‌کند و یک نقشه ساده بر اساس ستون جمعیت رسم می‌کند.

تبدیل CRS برای محاسبات سطح/مساحت:

# تبدیل به یک CRS متریک مناسب
gdf_metric = gdf.to_crs(epsg=3857)
gdf_metric["area_m2"] = gdf_metric.geometry.area

در اینجا ابتدا داده‌ها را به EPSG:3857 (سیستم متریک متداول وب) تبدیل می‌کنیم تا محاسبه مساحت به متر مربع انجام شود؛ سپس ستون area_m2 را اضافه می‌کنیم.

ترکیب فضایی (مثلاً spatial join):

regions = gpd.read_file("data/regions.shp")
cities = gpd.read_file("data/cities.shp")

# برچسب‌گذاری هر شهر با منطقه مربوطه
cities_with_region = gpd.sjoin(cities, regions, how="left", op="within")

در این مثال از gpd.sjoin برای الحاق اطلاعات مناطق به شهرها استفاده شده است. پارامتر op می‌تواند “intersects”, “within”, “contains” باشد.

مثال با تولید بافر و محاسبه تداخل:

roads = gpd.read_file("data/roads.shp")
# ایجاد بافر 50 متری برای جاده‌ها (ابتدا CRS متریک)
roads = roads.to_crs(epsg=32639)
roads["buffer_50m"] = roads.geometry.buffer(50)

# بررسی برخورد با مناطق حساس
sensitive = gpd.read_file("data/sensitive_areas.shp").to_crs(roads.crs)
intersections = gpd.overlay(roads.set_geometry("buffer_50m"), sensitive, how="intersection")

ابتدا CRS مناسب انتخاب شده، سپس بافر ۵۰ متری ساخته شده و در نهایت تداخل میان بافر جاده‌ها و مناطق حساس محاسبه می‌شود.

بهبود عملکرد و نکات فنی

برای مجموعه‌داده‌های بزرگ باید مراقب کارایی باشید. نکات کاربردی:

  • از spatial index (rtree) استفاده کنید تا عملیات‌های مکانی سریع‌تر شوند. GeoPandas به‌صورت خودکار از sindex برای برخی عملیات‌ها استفاده می‌کند.
  • برای محاسبات سریع‌تر هندسی از نسخه‌های جدید Shapely/pygeos استفاده کنید؛ در نسخه‌های اخیر عملکرد بهبود یافته است.
  • برای داده‌های بسیار بزرگ، از Dask-GeoPandas یا پایگاه‌داده‌ای مثل PostGIS استفاده کنید.
  • در صورت نیاز به تحلیل رأس‌به‌رأس از pandas-compatible عملیات برداری استفاده کنید و از حلقه‌های پایتونی خودداری کنید.

نمونه بهینه‌سازی: استفاده از spatial index برای فیلتر اولیه

# فرض: gdf_a و gdf_b داده‌های بزرگ
gdf_a = gdf_a.to_crs(epsg=32639)
gdf_b = gdf_b.to_crs(epsg=32639)

sindex = gdf_b.sindex
possible_matches_index = list(sindex.intersection(gdf_a.geometry.total_bounds))
possible_matches = gdf_b.iloc[possible_matches_index]
matches = gpd.sjoin(gdf_a, possible_matches, how="inner", predicate="intersects")

کد بالا از شاخص فضایی برای کاهش تعداد مقایسه‌ها استفاده می‌کند: ابتدا با استفاده از bounding box فیلتر اولیه اعمال می‌شود و سپس join انجام می‌گیرد که هزینه محاسباتی را به‌طرز چشمگیری کاهش می‌دهد.

ذخیره‌سازی و فرمت‌ها

GeoPandas می‌تواند داده‌ها را به فرمت‌های مختلف (Shapefile, GeoJSON, GeoPackage) ذخیره کند:

gdf.to_file("output/areas.geojson", driver="GeoJSON")
# یا GeoPackage
gdf.to_file("output/data.gpkg", layer="areas", driver="GPKG")

انتخاب درایور مناسب مهم است؛ برای مثال GeoJSON برای وب مناسب است اما محدودیت‌هایی در اندازه و دقت دارد، درحالی‌که GeoPackage قالب باینری و انعطاف‌پذیرتری ارائه می‌دهد.

کاربردهای واقعی و نمونه‌های صنعتی

  • برنامه‌ریزی شهری: تحلیل دسترسی به خدمات (مثلاً فاصله تا مراکز درمانی) با استفاده از بافر و network analysis.
  • محیط زیست و منابع طبیعی: برآورد پوشش جنگل، تحلیل تداخل زیستگاه‌ها و حوزه‌های حفاظت‌شده.
  • کسب‌وکار و لوکیشن اینتلیجنس: تعیین بهترین محل برای شعب جدید با تحلیل تراکم جمعیت و رقبا.
  • زنجیره تأمین و لجستیک: مسیریابی و تحلیل مناطق تحت پوشش مراکز توزیع.

جدول مرجع روش‌های رایج

متدتوضیح
read_fileخواندن فایل‌های برداری با پشتیبانی از فرمت‌های متعدد
to_fileذخیره GeoDataFrame به فرمت‌های مختلف
to_crsتغییر CRS برای محاسبات دقیق مکانی
sjoinالحاق فضایی بین لایه‌ها (spatial join)
bufferایجاد بافر اطراف هندسه
overlayعملیات‌های مشترک هندسی (intersection, union, difference)

نکات نهایی و بهترین روش‌ها

  • همیشه CRS را بررسی و در صورت نیاز تبدیل کنید تا نتایج مساحت و فاصله دقیق باشند.
  • برای پردازش حجم بزرگ داده از پایگاه‌داده‌های جغرافیایی (PostGIS) یا چارچوب توزیع‌شده استفاده کنید.
  • نسخه‌های جدید GeoPandas و وابستگی‌ها را دنبال کنید؛ هر نسخه بهبودهای قابل‌توجه عملکردی دارد.
  • مستندات رسمی و مثال‌های گیت‌هاب GeoPandas منبع بسیار خوبی برای یادگیری عمیق هستند.

با ترکیب GeoPandas با ابزارهای دیگر مثل Folium برای نقشه‌های تعاملی یا Matplotlib/Contextily برای زمینه‌های تصویری می‌توانید تحلیل‌های مکانی قدرتمند و قابل انتشار ایجاد کنید. GeoPandas نقطه شروع بسیار مناسبی برای هر کسی است که می‌خواهد پردازش مکانی را در پایتون پیاده‌سازی کند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: