رویداد

رویدادها با تعامل کاربر با ابزاره یا تغییر برنامه‌ای در ابزاره فعال می‌شوند. برای انجام کاری هنگام وقوع رویداد، تابع بازخوانی را در ابزاره با onClick() (برای ui.Map یا ui.Button) یا onChange() (هر چیز دیگری) ثبت کنید. همچنین می‌توانید یک فراخوانی برگشتی در سازنده مشخص کنید. پارامترهای فراخوانی‌های رویداد بسته به ابزاره و نوع رویداد متفاوت است. برای مثال، ui.Textbox مقدار رشته‌ای را که درحال‌حاضر وارد شده است به توابع بازخوانی رویداد «کلیک» خود ارسال می‌کند. برای نوع پارامتر ارسال‌شده به توابع فراخوانی هر ابزاره، مرجع میانای برنامه‌سازی کاربردی را در برگه اسناد بررسی کنید.

مثال زیر چندین رویداد را نشان می‌دهد که از یک کنش کاربر برای مشخص کردن تصویری برای نمایش منشأ می‌گیرند. When the user selects an image, another select widget is updated with the bands of the image and displays the first band in the map:

ویرایشگر کد (جاوا اسکریپت)

// Load some images.
var dem = ee.Image('NASA/NASADEM_HGT/001');
var veg = ee.Image('NASA/VIIRS/002/VNP13A1/2022_06_02')
  .select(['EVI', 'EVI2', 'NDVI']);

// Make a drop-down menu of bands.
var bandSelect = ui.Select({
  placeholder: 'Select a band...',
  onChange: function(value) {
    var layer = ui.Map.Layer(imageSelect.getValue().select(value));
    // Use set() instead of add() so the previous layer (if any) is overwritten.
    Map.layers().set(0, layer);
  }
});

// Make a drop down menu of images.
var imageSelect = ui.Select({
  items: [
    {label: 'NASADEM', value: dem},
    {label: 'VIIRS Veg', value: veg}
  ],
  placeholder: 'Select an image...',
  onChange: function(value) {
    // Asynchronously get the list of band names.
    value.bandNames().evaluate(function(bands) {
      // Display the bands of the selected image.
      bandSelect.items().reset(bands);
      // Set the first band to the selected band.
      bandSelect.setValue(bandSelect.items().get(0));
    });
  }
});

print(imageSelect);
print(bandSelect);

توجه داشته باشید که وقتی کاربر تصویری را انتخاب می‌کند، فهرست نام‌های باند تصویر در ابزاره bandSelect بار می‌شود، باند اول روی مقدار فعلی تنظیم می‌شود، و تابع onChange مربوط به bandSelect به‌طور خودکار فعال می‌شود. همچنین به استفاده از evaluate() برای دریافت ناهمگام مقدار ComputedObject برگردانده‌شده توسط bandNames() توجه کنید. در بخش رویدادهای ناهمگام اطلاعات بیشتری کسب کنید.

درحال لغو گوش دادن

روش unlisten() امکان برداشتن توابع بازخوانی ثبت‌شده در ابزاره را فراهم می‌کند. این کار برای جلوگیری از راه‌اندازی رویدادهایی که فقط باید یک‌بار یا تحت شرایط خاصی رخ دهند مفید است. مقدار برگشتی onClick() یا onChange() شناسه‌ای است که می‌تواند به unlisten() منتقل شود تا ابزاره فراخوانی تابع را متوقف کند. برای لغو ثبت همه رویدادها یا رویدادهای یک نوع خاص، unlisten() را بدون آرگومان یا با آرگومان نوع رویداد (مثلاً 'click' یا 'change') فراخوانی کنید. مثال زیر unlisten() را برای تسهیل باز و بسته کردن پانل نشان می‌دهد:

ویرایشگر کد (جاوا اسکریپت)

// Create a panel, initially hidden.
var panel = ui.Panel({
  style: {
    width: '400px',
    shown: false
  },
  widgets: [
    ui.Label('Click on the map to collapse the settings panel.')
  ]
});

// Create a button to unhide the panel.
var button = ui.Button({
  label: 'Open settings',
  onClick: function() {
    // Hide the button.
    button.style().set('shown', false);
    // Display the panel.
    panel.style().set('shown', true);

    // Temporarily make a map click hide the panel
    // and show the button.
    var listenerId = Map.onClick(function() {
      panel.style().set('shown', false);
      button.style().set('shown', true);
      // Once the panel is hidden, the map should not
      // try to close it by listening for clicks.
      Map.unlisten(listenerId);
    });
  }
});

// Add the button to the map and the panel to root.
Map.add(button);
ui.root.insert(0, panel);

توجه داشته باشید که از unlisten() برای متوقف کردن Map از گوش دادن به رویدادهای کلیک برای بستن پانل در زمانی که پانل ازقبل بسته است استفاده می‌شود.

رویدادهای ناهمگام

اگر از نتیجه Earth Engine (مانند خروجی عددی از کاهش) در یک ابزاره استفاده می‌کنید، باید مقدار را از سرور دریافت کنید. (برای جزئیات درباره کارخواه درمقابل سرور در Earth Engine، این صفحه را ببینید). برای جلوگیری از توقف کل واسط کاربر هنگام محاسبه آن مقدار، می‌توانید از تابع evaluate() برای دریافت مقدار به‌صورت ناهمگام استفاده کنید. تابع evaluate() درخواستی را برای یک مقدار شروع می‌کند و وقتی مقدار آماده شد، تابع بازخوانی را فراخوانی می‌کند تا کاری با نتیجه انجام دهد. برای مثال، برنامه‌ای را برای دریافت مقدار میانگین سری زمانی NDVI در یک نقطه درنظر بگیرید:

ویرایشگر کد (جاوا اسکریپت)

// Load and display an NDVI image.
var ndvi = ee.ImageCollection('LANDSAT/COMPOSITES/C02/T1_L2_8DAY_NDVI')
    .filterDate('2014-01-01', '2015-01-01');
var vis = {min: 0, max: 1, palette: ['99c199', '006400']};
Map.addLayer(ndvi.median(), vis, 'NDVI');

// Configure the map.
Map.setCenter(-94.84497, 39.01918, 8);
Map.style().set('cursor', 'crosshair');

// Create a panel and add it to the map.
var inspector = ui.Panel([ui.Label('Click to get mean NDVI')]);
Map.add(inspector);

Map.onClick(function(coords) {
  // Show the loading label.
  inspector.widgets().set(0, ui.Label({
    value: 'Loading...',
    style: {color: 'gray'}
  }));

  // Determine the mean NDVI, a long-running server operation.
  var point = ee.Geometry.Point(coords.lon, coords.lat);
  var meanNdvi = ndvi.reduce('mean');
  var sample = meanNdvi.sample(point, 30);
  var computedValue = sample.first().get('NDVI_mean');

  // Request the value from the server.
  computedValue.evaluate(function(result) {
    // When the server returns the value, show it.
    inspector.widgets().set(0, ui.Label({
      value: 'Mean NDVI: ' + result.toFixed(2),
    }));
  });
});

وقتی کاربر روی نقطه‌ای در این نقشه کلیک می‌کند، تماس reduceRegion() در سرور راه‌اندازی می‌شود. این عملیات ممکن است مدتی طول بکشد. برای جلوگیری از مسدود شدن برنامه درحین محاسبات Earth Engine، این نمونه تابع بازخوانی را برای نتیجه ثبت می‌کند، به‌ویژه computedValue.evaluate(). وقتی محاسبه تمام شد، نتیجه نمایش داده می‌شود. در این مدت، پیامی نمایش داده می‌شود که نشان می‌دهد محاسبه درحال انجام است.