پرش به محتویات

راهنمای جامع کار با Google Earth Engine در VSCode

این گزارش شامل تمام مراحل کار با گوگل ارث انجین از صفر تا دانلود تصاویر ماهواره‌ای و محاسبه شاخص‌های گیاهی است. تمام مراحل به زبان ساده و با مثال‌های کاربردی توضیح داده شده است.

۱. پیش‌نیازها و تنظیمات اینترنت

۱.۱ چرا نیاز به تنظیمات خاص اینترنت داریم؟

زمانی که شما می‌خواهید از سرورهای گوگل استفاده کنید، درخواست‌های شما باید از شبکه داخلی خارج شده و به سرورهای بین‌المللی گوگل برسد. اما به دلیل تحریم‌های اقتصادی، اپراتورهای اینترنت در ایران (مانند مخابرات، ایرانسل و سایر ارائه‌دهندگان) این ارتباط را مسدود می‌کنند.[1][2][^3]

۱.۲ راه‌حل: استفاده از شبکه خصوصی مجازی

شبکه خصوصی مجازی (VPN - Virtual Private Network) مانند یک تونل رمزگذاری شده عمل می‌کند که شما را از داخل ایران به یک سرور واسط در کشور دیگری (مثل آلمان، هلند یا سنگاپور) منتقل می‌کند و از آنجا به سرورهای گوگل متصل می‌شوید.[2][3]

۱.۳ مشکل رایج: فیلترشکن‌های معمولی

بسیاری از فیلترشکن‌ها فقط ترافیک مرورگر وب (Browser) شما را از تونل عبور می‌دهند. اما برنامه‌های دیگر مثل پایتون، VSCode و ترمینال همچنان به صورت مستقیم به اینترنت داخلی متصل می‌شوند و در نتیجه به سرورهای گوگل دسترسی پیدا نمی‌کنند.[^2]

۱.۴ راه‌حل پیشرفته: فعال‌سازی حالت TUN

حالت TUN (یا TAP) یک حالت خاص در نرم‌افزارهای VPN است که یک آداپتور شبکه مجازی روی سیستم عامل شما ایجاد می‌کند. این آداپتور دقیقاً مانند یک کارت شبکه فیزیکی عمل می‌کند، با این تفاوت که تمام ترافیک شبکه سیستم (شامل تمام برنامه‌ها) را از داخل تونل VPN عبور می‌دهد.

تفاوت عملکرد:

حالت مرورگر پایتون VSCode ترمینال
بدون TUN ✅ متصل ❌ مسدود ❌ مسدود ❌ مسدود
با TUN ✅ متصل ✅ متصل ✅ متصل ✅ متصل

۱.۵ نحوه فعال‌سازی حالت TUN

برای نرم‌افزار v2rayN:

Settings → Core Settings → Enable TUN Mode

نکته امنیتی: برای فعال‌سازی TUN Mode، نرم‌افزار VPN باید با دسترسی Administrator (در ویندوز) یا root (در لینوکس) اجرا شود.

هشدار: پس از فعال‌سازی TUN، ممکن است برخی برنامه‌های داخلی (مثل بانک‌ها) به دلیل شناسایی IP خارجی به درستی کار نکنند. در این صورت موقتاً TUN را غیرفعال کنید.


۲. نصب کتابخانه‌های پایتون

۲.۱ مفهوم کتابخانه در پایتون

کتابخانه (Package یا Library) در پایتون، یک بسته نرم‌افزاری آماده است که توسط برنامه‌نویسان دیگر نوشته شده و به صورت رایگان در دسترس قرار گرفته است. استفاده از کتابخانه‌ها به این معناست که شما نیازی به نوشتن هزاران خط کد از ابتدا ندارید و می‌توانید از کدهای از پیش آزمایش شده استفاده کنید.[4][5][^1]

۲.۲ کتابخانه‌های مورد نیاز

کتابخانه اول: earthengine-api

این کتابخانه شامل تمام توابع و کلاس‌های لازم برای برقراری ارتباط با سرورهای Google Earth Engine است. این کتابخانه مانند یک مترجم عمل می‌کند که دستورات پایتون شما را به زبان API گوگل ترجمه کرده و به سرور ارسال می‌کند.[6][7][^1]

کتابخانه دوم: geemap

این کتابخانه ابزارهای بصری برای نمایش نقشه‌های تعاملی و تصاویر ماهواره‌ای در محیط پایتون فراهم می‌کند. بدون این کتابخانه، شما فقط می‌توانید محاسبات را انجام دهید اما نتیجه را نمی‌توانید به صورت نقشه ببینید.[5][8][^4]

۲.۳ دستور نصب

دستور زیر را یک‌بار در ترمینال یا Command Prompt اجرا کنید:

pip install earthengine-api geemap

نکته مهم: این دستور را در ترمینال سیستم‌عامل اجرا کنید، نه داخل فایل کد پایتون. اگر از محیط مجازی (Virtual Environment) استفاده می‌کنید، ابتدا آن را فعال کنید.

راه‌های اجرای ترمینال:

  • ویندوز: کلیدهای Win + R را بزنید، cmd تایپ کنید و Enter بزنید
  • لینوکس/مک: برنامه Terminal را باز کنید
  • VSCode: از منوی Terminal → New Terminal استفاده کنید

۳. احراز هویت و اتصال به سرورهای گوگل

۳.۱ مفهوم احراز هویت

احراز هویت (Authentication) فرآیندی است که در آن شما به سرور گوگل ثابت می‌کنید که چه کسی هستید و مجوز استفاده از سرویس‌های Earth Engine را دارید. این مشابه وارد شدن با رمز عبور به سیستم ایمیل یا شبکه‌های اجتماعی است.[7][1][^6]

۳.۲ چرا گوگل احراز هویت را الزامی کرده است؟

سرورهای Google Earth Engine دارای قدرت پردازشی بسیار بالایی هستند و پتابایت‌ها داده ماهواره‌ای را ذخیره کرده‌اند. اگر هر کسی بدون شناسایی بتواند استفاده کند، منابع سرور به سرعت اشباع می‌شود. بنابراین گوگل نیاز دارد بداند:[9][10]

  • چه کسی از سرویس استفاده می‌کند
  • چقدر منابع مصرف می‌کند
  • آیا استفاده تجاری است یا تحقیقاتی

۳.۳ کد احراز هویت

import ee
import geemap

# احراز هویت (فقط بار اول)
ee.Authenticate()

# اتصال به پروژه
ee.Initialize(project='نام_پروژه_شما')

۳.۴ توضیح خط‌به‌خط کد

خط اول: import ee

کتابخانه Earth Engine API را وارد برنامه می‌کند.[1][6]

خط دوم: import geemap

کتابخانه نمایش نقشه را وارد برنامه می‌کند.[8][4][^5]

خط پنجم: ee.Authenticate()

این دستور یک پنجره مرورگر باز می‌کند و فرآیند احراز هویت را شروع می‌کند. این کار فقط یک‌بار در هر سیستم لازم است. پس از انجام موفقیت‌آمیز، اطلاعات احراز هویت در سیستم ذخیره می‌شود و دیگر نیازی به تکرار نیست.[6][7][^1]

نکته: در کدهای بعدی این خط را کامنت می‌کنیم (با # در ابتدای خط) چون دیگر نیازی به اجرای مجدد نیست.

خط هشتم: ee.Initialize(project='...')

پس از احراز هویت موفق، باید به پایتون بگویید که به کدام پروژه Cloud متصل شوید. پروژه مانند یک فضای کاری مجزا است که تمام محاسبات و داده‌های شما در آن ذخیره می‌شود.[10][9]

۳.۵ فرآیند ثبت‌نام در Google Earth Engine

گام اول: اجرای دستور Authenticate

دستور ee.Authenticate() را در کد پایتون اجرا کنید. یک پنجره مرورگر باز می‌شود و شما را به صفحه ورود گوگل هدایت می‌کند.[7][1][^6]

گام دوم: ورود با حساب کاربری

با استفاده از حساب Gmail خود وارد شوید. بهتر است از همان حسابی استفاده کنید که برای Google Drive و سایر سرویس‌های گوگل استفاده می‌کنید.

گام سوم: ایجاد Cloud Project

گوگل از شما می‌پرسد: «آیا می‌خواهید یک Cloud Project ایجاد کنید؟». روی گزینه Create a new project کلیک کنید.[9][10]

پروژه ابری (Cloud Project) چیست؟

پروژه ابری مانند یک پوشه اختصاصی روی سرورهای گوگل است. تمام کارهای شما (تصاویر پردازش شده، نتایج محاسبات، فایل‌های خروجی) در این پروژه ذخیره می‌شوند. هر کاربر می‌تواند چندین پروژه داشته باشد و برای هر پروژه تحقیقاتی یک پروژه جداگانه بسازد.

گام چهارم: انتخاب نوع استفاده

گوگل سه نوع استفاده را تعریف کرده است:

  • Non-commercial: استفاده غیر تجاری (رایگان)
  • Academic: استفاده دانشگاهی و پژوهشی (رایگان)
  • Commercial: استفاده تجاری (پولی)

برای کارهای تحقیقاتی و آموزشی، گزینه Non-commercial یا Academic را انتخاب کنید.[^10]

گام پنجم: تکمیل فرم اطلاعات

فرمی با فیلدهای زیر نمایش داده می‌شود:

  • هدف استفاده: Scientific Research (پژوهش علمی)
  • محدوده جغرافیایی: Global (جهانی)
  • وابستگی سازمانی: نام دانشگاه یا موسسه پژوهشی خود را وارد کنید

نکته امنیتی: از کلمات کامل و حساس مانند "Iran"، "Islamic" یا "Tehran" استفاده نکنید. بهتر است از اختصارات استفاده کنید (مثلاً: Tehran Univ → TehranU یا Iran Planning Org → IPO). این کار احتمال فیلتر شدن توسط سیستم‌های خودکار تحریم را کاهش می‌دهد.[3][2]

گام ششم: دریافت کد تایید

پس از ارسال فرم و تایید، یک کد طولانی (معمولاً شروع می‌شود با 4/0Aan...) به شما نمایش داده می‌شود. این کد یک‌بار مصرف است و فقط برای احراز هویت این سیستم استفاده می‌شود.[1][6]

گام هفتم: وارد کردن کد در VSCode

کد را کپی کنید و در کادر ورودی که در بالای پنجره VSCode ظاهر شده، Paste کنید و Enter بزنید.

گام هشتم: تایید موفقیت

اگر پیام "Successfully authenticated" نمایش داده شد، یعنی احراز هویت با موفقیت انجام شده است.

اگر ارور دریافت کردید، احتمالاً یکی از مشکلات زیر وجود دارد:

  • فیلترشکن فعال نیست یا در حالت TUN نیست
  • کد منقضی شده است (سریع‌تر عمل کنید)
  • مشکل در اتصال اینترنت

۴. ساخت نقشه و تعیین محدوده مطالعه

۴.۱ چرا نیاز به نقشه داریم؟

قبل از دانلود تصاویر ماهواره‌ای، نیاز داریم دو کار انجام دهیم:

  1. یک نقشه تعاملی بسازیم تا بتوانیم نتایج را بصری ببینیم
  2. یک محدوده جغرافیایی مشخص کنیم تا فقط تصاویر آن ناحیه را دریافت کنیم

۴.۲ کد ایجاد نقشه پایه

# ایجاد نقشه با مرکزیت تهران
Map = geemap.Map(center=[35.69, 51.39], zoom=10)

۴.۳ توضیح پارامترها

پارامتر center:

مختصات جغرافیایی نقطه مرکز نقشه را مشخص می‌کند. فرمت آن به صورت [Latitude, Longitude] است.[4][5][^8]

  • عدد اول (35.69): عرض جغرافیایی (Latitude) - فاصله از خط استوا
  • عدد دوم (51.39): طول جغرافیایی (Longitude) - فاصله از نصف‌النهار مبدأ

نحوه پیدا کردن مختصات:

  1. وارد Google Maps شوید
  2. روی نقطه مورد نظر راست‌کلیک کنید
  3. اولین عدد Latitude و دومین عدد Longitude است

پارامتر zoom:

سطح بزرگنمایی نقشه را تعیین می‌کند. مقدار آن بین ۱ تا ۲۰ است:

  • 1-4: دید کلی از یک قاره یا کشور
  • 8-12: دید شهر یا منطقه
  • 15-20: دید خیابان یا ساختمان

مفهوم شیء (Object):

متغیر Map یک شیء است. شیء در برنامه‌نویسی مانند یک جعبه است که هم داده دارد (مثل مختصات مرکز) و هم ابزار (مثل توابع اضافه کردن لایه).[5][4]

۴.۴ تعریف محدوده مستطیلی

tehran_bound = ee.Geometry.Rectangle([51.0, 35.5, 51.6, 35.9])

Map.addLayer(tehran_bound, {'color': 'red'}, 'Tehran Bound')

۴.۵ توضیح Bounding Box

مفهوم Bounding Box:

صندوق محدودکننده (Bounding Box) یک مستطیل جغرافیایی است که محدوده مطالعه شما را مشخص می‌کند. این مستطیل با چهار نقطه تعریف می‌شود: گوشه جنوب غربی و گوشه شمال شرقی.[^1]

فرمت داده‌ها:

[51.0,        35.5,         51.6,        35.9]

چرا نیاز به محدوده داریم؟

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

تابع addLayer:

این تابع یک لایه جدید به نقشه اضافه می‌کند. پارامترهای آن:[8][4][^5]

  • پارامتر اول: شیء جغرافیایی (اینجا مستطیل)
  • پارامتر دوم: تنظیمات نمایش (اینجا رنگ قرمز)
  • پارامتر سوم: نام لایه که در لیست لایه‌ها نمایش داده می‌شود

مفهوم لایه (Layer):

لایه مانند یک ورق کاغذ شفاف است که روی نقشه قرار می‌گیرد. شما می‌توانید چندین لایه روی هم بگذارید (مثلاً یک لایه جاده، یک لایه رودخانه، یک لایه محدوده شهر).

۴.۶ نمایش نقشه

Map

این دستور در محیط‌های Jupyter Notebook یا VSCode با افزونه مناسب، نقشه تعاملی را نمایش می‌دهد. شما می‌توانید با ماوس zoom کنید، جابجا شوید و لایه‌ها را روشن/خاموش کنید.[4][5][^8]


۵. دریافت و فیلتر تصاویر ماهواره‌ای

۵.۱ معرفی ماهواره Sentinel-2

سنتینل-۲ (Sentinel-2) یک ماهواره اروپایی برای مشاهده زمین است که توسط آژانس فضایی اروپا (ESA) پرتاب شده است. این ماهواره هر ۵ روز یک‌بار از تمام سطح زمین تصویربرداری می‌کند و تصاویر آن به صورت رایگان در دسترس عموم قرار دارد.[11][12]

مشخصات فنی:

  • رزولوشن مکانی: ۱۰ متر (برای باندهای مرئی)
  • دوره بازگشت: ۵ روز
  • تعداد باندها: ۱۳ باند طیفی
  • پوشش: کل سطح زمین

۵.۲ مشکل حجم داده

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

۵.۳ سه فیلتر اصلی

فیلتر اول: مکان (filterBounds)

فقط تصاویری را نگه می‌دارد که با محدوده ما تلاقی دارند.[^1]

فیلتر دوم: زمان (filterDate)

فقط تصاویری را نگه می‌دارد که در یک بازه زمانی خاص گرفته شده‌اند.[^1]

فیلتر سوم: ابر (filter)

فقط تصاویری را نگه می‌دارد که درصد ابر کمتری دارند.[^1]

۵.۴ کد فراخوانی و فیلتر تصاویر

s2_collection = ee.ImageCollection('COPERNICUS/S2_SR') \
    .filterBounds(tehran_bound) \
    .filterDate('2024-11-01', '2024-11-30') \
    .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))

۵.۵ توضیح خط‌به‌خط

خط اول: ee.ImageCollection('COPERNICUS/S2_SR')

مجموعه داده Sentinel-2 Surface Reflectance را از سرور گوگل فراخوانی می‌کند.[11][1]

  • ImageCollection: مجموعه‌ای از هزاران تصویر مستقل
  • COPERNICUS/S2_SR: شناسه منحصر به فرد این مجموعه در پایگاه داده گوگل
  • SR (Surface Reflectance): بازتاب سطحی، یعنی تصاویری که اثر اتمسفر از آن‌ها حذف شده است

علامت \ در انتهای خط:

به پایتون می‌گوید «این دستور در خط بعدی ادامه دارد». فقط برای خوانایی بهتر کد است و هیچ تاثیری بر اجرا ندارد.

خط دوم: .filterBounds(tehran_bound)

از بین میلیون‌ها تصویر در سراسر دنیا، فقط تصاویری که با مستطیل تهران تلاقی دارند را نگه می‌دارد. این کار حجم داده را از پتابایت به چند گیگابایت کاهش می‌دهد.[^1]

خط سوم: .filterDate('2024-11-01', '2024-11-30')

فقط تصاویری که بین اول تا سی‌ام نوامبر ۲۰۲۴ گرفته شده‌اند را انتخاب می‌کند. فرمت تاریخ باید به صورت 'YYYY-MM-DD' باشد.[^1]

نکته مهم: در کد اصلی ویدیو تاریخ 2025-11-01 بود که یک تاریخ آینده است و احتمالاً تصویری بازنمی‌گرداند. شما باید تاریخ گذشته وارد کنید.

خط چهارم: .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))

فقط تصاویری که کمتر از ۱۰ درصد ابر دارند را نگه می‌دارد.[^1]

  • lt: مخفف Less Than (کمتر از)
  • CLOUDY_PIXEL_PERCENTAGE: یک فیلد متادیتا که درصد ابر را ذخیره کرده است

چرا این فیلتر مهم است؟ چون ابر مانند یک دیوار سفید جلوی دوربین است و داده‌های زیر آن را مخفی می‌کند.

۵.۶ انتخاب باندهای مورد نیاز

s2_selected = s2_collection.select(['B4', 'B3', 'B2', 'B8'])

۵.۷ مفهوم باند طیفی

باند (Band) چیست؟

دوربین ماهواره Sentinel-2 مانند دوربین عکاسی معمولی نیست. این دوربین ۱۳ سنسور مجزا دارد که همزمان ۱۳ عکس از همان صحنه می‌گیرد، هر کدام در یک طول موج مختلف.[13][11]

چرا این کار را می‌کند؟

چشم انسان فقط ۳ رنگ را می‌بیند: قرمز، سبز و آبی. اما اجسام مختلف (گیاه، آب، خاک، ساختمان) در طول‌موج‌های دیگر (مثل مادون قرمز یا فرابنفش) رفتارهای منحصر به فردی دارند که با چشم دیده نمی‌شوند.[12][11]

۵.۸ معرفی چهار باند انتخابی

نام باند نام انگلیسی طول موج کاربرد
B2 Blue ۴۹۰ نانومتر آشکارسازی آب و جو [^11]
B3 Green ۵۶۰ نانومتر رشد گیاهان و سلامت [^11]
B4 Red ۶۶۵ نانومتر جذب کلروفیل [11][12]
B8 Near Infrared ۸۴۲ نانومتر ساختار سلولی گیاه [11][13]

چرا باند B8 (مادون قرمز) مهم است؟

برگ‌های سبز و سالم در باند مادون قرمز بازتاب بسیار بالایی دارند (تا ۸۰٪)، در حالی که خاک و آب تقریباً هیچ بازتابی ندارند. این ویژگی باعث می‌شود که گیاهان در تصاویر مادون قرمز بسیار روشن دیده شوند و تشخیص آن‌ها آسان باشد.[12][13]

۵.۹ محاسبه تصویر ترکیبی (Composite)

s2_median = s2_selected.median().clip(tehran_bound)

۵.۱۰ توضیح تابع median

مفهوم میانه (Median):

فرض کنید پس از اعمال فیلترها، ۱۰ تصویر از تهران در یک ماه باقی مانده است. حالا برای هر پیکسل (مثلاً پیکسل مربوط به میدان آزادی) ۱۰ مقدار مختلف داریم. تابع median() مقدار وسطی (میانه) را انتخاب می‌کند.[^1]

مثال عددی:

مقادیر یک پیکسل در ۱۰ تصویر:

[100, 105, 102, 500, 103, 104, 101, 106, 102, 103]

مقدار ۵۰۰ واضحاً یک مقدار پرت است (شاید یک ابر کوچک بوده). اگر میانگین بگیریم:

میانگین = (100+105+...+500+...+103) / 10 = 132.6

این مقدار توسط ۵۰۰ خراب شده است.

اما میانه (مقدار وسطی پس از مرتب‌سازی):

مرتب شده: [100, 101, 102, 102, 103, 103, 104, 105, 106, 500]
میانه = (103 + 103) / 2 = 103

این مقدار واقعی‌تر است.[^1]

نتیجه: تابع median() یک تصویر ترکیبی (Composite) تولید می‌کند که تقریباً بدون ابر است و نماینده کل دوره زمانی است.

۵.۱۱ تابع clip

عملکرد clip:

تصویر را دقیقاً به اندازه مستطیل tehran_bound برش می‌زند. مثل کار برش دادن کاغذ با قیچی است. بدون این تابع، تصویر کل تایل ماهواره‌ای (معمولاً ۱۰۰×۱۰۰ کیلومتر) دانلود می‌شود.[^1]


۶. نمایش تصویر با رنگ طبیعی

۶.۱ مفهوم رنگ طبیعی

رنگ طبیعی (True Color) به تصویری گفته می‌شود که دقیقاً مشابه آنچه چشم انسان می‌بیند باشد: آسمان آبی، درخت سبز، خاک قهوه‌ای. برای ساخت این تصویر باید سه باند قرمز، سبز و آبی را ترکیب کنیم.[11][12]

۶.۲ کد نمایش

vis_params = {
    'bands': ['B4', 'B3', 'B2'],
    'min': 0,
    'max': 3000,
}

# اضافه کردن لایه به نقشه
Map.addLayer(s2_median, vis_params, 'Sentinel True Color')

۶.۳ توضیح پارامترها

پارامتر bands:

ترتیب باندها برای ترکیب رنگی را مشخص می‌کند. ترتیب استاندارد RGB در geemap به صورت [Red, Green, Blue] است.[13][11]

نکته مهم: ترتیب قرار گرفتن باندها بسیار مهم است. اگر بنویسید ['B2', 'B3', 'B4'] تصویر به رنگ‌های غیرطبیعی نمایش داده می‌شود.

پارامتر min و max:

محدوده مقادیر دیجیتالی پیکسل‌ها را برای نمایش تعیین می‌کند. تصاویر Sentinel-2 مقادیری بین ۰ تا حدود ۱۰۰۰۰ دارند. ما به پایتون می‌گوییم:[5][8]

  • مقادیر ۰ تا ۳۰۰۰ را روی طیف سیاه (۰) تا سفید (۲۵۵) نگاشت کن
  • مقادیر کمتر از ۰ → سیاه
  • مقادیر بیشتر از ۳۰۰۰ → سفید

اگر این اعداد را تغییر دهید:

  • کاهش max (مثلاً ۲۰۰۰): تصویر روشن‌تر می‌شود
  • افزایش max (مثلاً ۵۰۰۰): تصویر تیره‌تر می‌شود

۷. محاسبه شاخص پوشش گیاهی

۷.۱ معرفی شاخص NDVI

شاخص NDVI مخفف Normalized Difference Vegetation Index است که به فارسی «شاخص نرمال‌شده تفاضل پوشش گیاهی» نامیده می‌شود. این یکی از پرکاربردترین شاخص‌ها در سنجش از دور است.[14][12][^13]

۷.۲ فلسفه NDVI

سوال اصلی: چگونه بفهمیم یک نقطه پوشش گیاهی سالم دارد یا خیر؟

پاسخ: گیاهان سبز رفتار خاصی در طیف نوری دارند:[14][12][^13]

  1. در نور قرمز (۶۶۵ نانومتر) بازتاب کمی دارند - چون رنگدانه کلروفیل نور قرمز را جذب می‌کند
  2. در مادون قرمز نزدیک (۸۴۲ نانومتر) بازتاب بسیار زیادی دارند - به دلیل ساختار سلولی برگ

این تفاوت بازتاب، یک «امضای طیفی» منحصر به فرد برای گیاهان است.

۷.۳ فرمول NDVI

\[ NDVI = \frac{NIR - Red}{NIR + Red} = \frac{B8 - B4}{B8 + B4} \]

چرا این فرمول؟

  • صورت کسر (NIR - Red): تفاضل بازتاب را محاسبه می‌کند
  • مخرج کسر (NIR + Red): نرمال‌سازی می‌کند تا نتیجه همیشه بین -۱ و +۱ باشد

۷.۴ تفسیر مقادیر NDVI

محدوده مقدار تفسیر رنگ نمایش
+0.6 تا +0.8 جنگل انبوه و بسیار سالم [12][14] سبز تیره
+0.4 تا +0.6 پوشش گیاهی متراکم (مزارع سبز) سبز روشن
+0.2 تا +0.4 پوشش گیاهی کم‌تراکم (مرتع) سبز کم‌رنگ
0 تا +0.2 خاک لخت، بیابان [^14] سفید/کرم
-0.2 تا 0 آب، برف، ساختمان [12][14] آبی
کمتر از -0.2 ابر یا آب عمیق آبی تیره

۷.۵ کد محاسبه NDVI

ndvi = s2_median.normalizedDifference(['B8', 'B4']).rename('NDVI')

۷.۶ توضیح تابع normalizedDifference

این یک تابع آماده در Earth Engine است که فرمول (A - B) / (A + B) را محاسبه می‌کند:[12][1]

  • باند اول (B8) = A (صورت و مخرج)
  • باند دوم (B4) = B (صورت و مخرج)

تابع rename:

نام باند خروجی را به 'NDVI' تغییر می‌دهد. این فقط برای راحتی کار است و هیچ تاثیری بر محاسبات ندارد.[^1]

۷.۷ کد نمایش NDVI

ndvi_vis = {
    'min': -0.2,
    'max': 0.8,
    'palette': ['blue', 'white', 'green']
}

# اضافه کردن لایه به نقشه
Map.addLayer(ndvi, ndvi_vis, 'Sentinel NDVI')

۷.۸ توضیح پالت رنگی

پارامتر palette:

یک فهرست از رنگ‌ها که به صورت گرادیانت (طیف تدریجی) نمایش داده می‌شوند:[8][4]

مقدار NDVI رنگ نمایش معنی
-0.2 آبی (blue) آب، ابر
0 تا +0.3 سفید (white) خاک، بیابان
+0.8 سبز (green) جنگل، گیاه سالم

مقادیر بینابین: رنگ‌های میانی به صورت خودکار محاسبه می‌شوند (مثلاً NDVI=0.4 → سبز کم‌رنگ).


۸. ذخیره‌سازی تصویر نهایی

۸.۱ چرا نیاز به دانلود داریم؟

تا این لحظه تمام محاسبات روی سرورهای گوگل انجام شده است. ما فقط نتیجه را به صورت تعاملی در VSCode می‌بینیم. اگر بخواهیم:[4][5][^8]

  • تصویر را در نرم‌افزار QGIS باز کنیم
  • تحلیل‌های پیشرفته‌تری انجام دهیم
  • تصویر را با دیگران به اشتراک بگذاریم

باید آن را به صورت فایل روی کامپیوتر خود ذخیره کنیم.

۸.۲ کد کامل Export

import os

out_dir = os.path.expanduser('~/Downloads')
out_file = os.path.join(out_dir, 'Tehran_NDVI.tif')

geemap.ee_export_image(
    ndvi,
    filename=out_file,
    scale=30,
    region=tehran_bound,
    file_per_band=False
)

۸.۳ توضیح خط‌به‌خط

خط اول: import os

ماژول مدیریت سیستم‌عامل را وارد می‌کند. این ماژول برای کار با مسیرها، پوشه‌ها و فایل‌ها استفاده می‌شود.

خط چهارم: os.path.expanduser('~/Downloads')

مسیر پوشه Downloads را پیدا می‌کند. علامت ~ یک میانبر است که به معنی «پوشه خانگی کاربر» است:

  • در لینوکس: /home/username/Downloads
  • در ویندوز: C:\Users\YourName\Downloads
  • در مک: /Users/username/Downloads

خط پنجم: os.path.join(out_dir, 'Tehran_NDVI.tif')

مسیر کامل فایل را می‌سازد. این تابع به جای استفاده از / یا \ که در سیستم‌عامل‌های مختلف متفاوت است، به صورت خودکار جداکننده صحیح را انتخاب می‌کند.

خط هشتم: geemap.ee_export_image(...)

فرآیند دانلود تصویر از سرور گوگل را شروع می‌کند.[5][8][^4]

۸.۴ پارامترهای تابع export

پارامتر اول (ndvi):

شیء تصویری که می‌خواهیم دانلود کنیم. می‌توانید به جای NDVI، تصویر RGB یا هر باند دیگری را قرار دهید.

پارامتر filename:

مسیر کامل و نام فایل خروجی. پسوند .tif یعنی فرمت GeoTIFF که یک فرمت استاندارد برای تصاویر ماهواره‌ای است.

پارامتر scale:

رزولوشن مکانی هر پیکسل به متر. مثلاً scale=30 یعنی هر پیکسل نماینده یک مربع ۳۰×۳۰ متری از زمین است.[^11]

نکته مهم: رزولوشن اصلی Sentinel-2 برای باندهای مرئی ۱۰ متر است. اما اگر scale=10 بگذارید، حجم فایل خیلی زیاد می‌شود. برای محدوده‌های بزرگ مثل تهران، scale=30 یا scale=50 توصیه می‌شود.[^11]

جدول تاثیر scale بر حجم فایل:

Scale (متر) تعداد پیکسل‌ها حجم تقریبی کیفیت
10 بالا ~500 مگابایت عالی
30 متوسط ~50 مگابایت خوب
50 کم ~20 مگابایت متوسط
100 خیلی کم ~5 مگابایت ضعیف

پارامتر region:

محدوده جغرافیایی که می‌خواهیم دانلود کنیم. اگر این پارامتر را ننویسید، کل تصویر (ممکن است چند استان) دانلود می‌شود.[^1]

پارامتر file_per_band:

اگر True باشد، برای هر باند یک فایل جداگانه ذخیره می‌شود. اگر False باشد (پیش‌فرض)، همه باندها در یک فایل GeoTIFF چند باندی ذخیره می‌شوند.[4][5]

۸.۵ خطای رایج: حجم بیش از حد

پیام خطا:

Error: Image too large. Please reduce scale or region.

دلیل: گوگل محدودیت حجمی برای دانلود مستقیم دارد (معمولاً حدود ۲۵۶ مگابایت).[^1]

راه‌حل‌ها:

  1. افزایش مقدار scale (مثلاً از ۱۰ به ۳۰)
  2. کوچک کردن محدوده region
  3. استفاده از Export به Google Drive به جای دانلود مستقیم

۹. کد کامل پروژه

در اینجا کد کامل و آماده اجرا برای کپی در یک فایل پایتون آورده شده است:

import ee
import geemap
import os

# ee.Authenticate()

ee.Initialize(project='your-project-name')  # نام پروژه خود را وارد کنید

Map = geemap.Map(center=[35.69, 51.39], zoom=10)

tehran_bound = ee.Geometry.Rectangle([51.0, 35.5, 51.6, 35.9])
Map.addLayer(tehran_bound, {'color': 'red'}, 'Tehran Bound')

s2_collection = ee.ImageCollection('COPERNICUS/S2_SR') \
    .filterBounds(tehran_bound) \
    .filterDate('2024-11-01', '2024-11-30') \
    .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))

s2_selected = s2_collection.select(['B4', 'B3', 'B2', 'B8'])
s2_median = s2_selected.median().clip(tehran_bound)

vis_params = {
    'bands': ['B4', 'B3', 'B2'],
    'min': 0,
    'max': 3000,
}
Map.addLayer(s2_median, vis_params, 'Sentinel True Color')

ndvi = s2_median.normalizedDifference(['B8', 'B4']).rename('NDVI')

ndvi_vis = {
    'min': -0.2,
    'max': 0.8,
    'palette': ['blue', 'white', 'green']
}
Map.addLayer(ndvi, ndvi_vis, 'Sentinel NDVI')

Map

out_dir = os.path.expanduser('~/Downloads')
out_file = os.path.join(out_dir, 'Tehran_NDVI.tif')

geemap.ee_export_image(
    ndvi,
    filename=out_file,
    scale=30,
    region=tehran_bound,
    file_per_band=False
)

print(f"فایل با موفقیت در {out_file} ذخیره شد.")

۱۰. منابع داده اضافی

گوگل ارث انجین علاوه بر Sentinel-2، دسترسی به صدها مجموعه داده دیگر را فراهم می‌کند. در اینجا برخی از پرکاربردترین آن‌ها معرفی می‌شوند:[9][10][^1]

۱۰.۱ تصاویر ماهواره Landsat

landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') \
    .filterBounds(tehran_bound) \
    .filterDate('2024-01-01', '2024-12-31')

مشخصات:

  • رزولوشن: ۳۰ متر[^11]
  • دوره زمانی: از سال ۱۹۸۴ تا اکنون
  • کاربرد: مطالعات تاریخی تغییرات کاربری اراضی

۱۰.۲ داده‌های آلودگی هوا (Sentinel-5P)

no2 = ee.ImageCollection('COPERNICUS/S5P/NRTI/L3_NO2') \
    .filterDate('2024-11-01', '2024-11-30') \
    .select('NO2_column_number_density')

کاربرد: نقشه‌برداری آلودگی هوای شهرهای بزرگ.

۱۰.۳ دمای سطح زمین (MODIS)

lst = ee.ImageCollection('MODIS/006/MOD11A1') \
    .filterDate('2024-06-01', '2024-06-30') \
    .select('LST_Day_1km')

کاربرد: مطالعه جزایر حرارتی شهری.

۱۰.۴ نور شب (VIIRS Nighttime Lights)

nightlights = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMSLCFG') \
    .filterDate('2024-01-01', '2024-12-31')

کاربرد: تخمین جمعیت، فعالیت اقتصادی و توسعه شهری.

۱۰.۵ داده‌های جمعیتی

population = ee.Image('WorldPop/GP/100m/pop/IRN_2020')

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