18 KiB
توضیح response سنجشازدور
این فایل response زیر را توضیح میدهد:
- کد HTTP داخلی:
200 - پیام:
success - وضعیت نهایی تحلیل:
completed - منبع response:
database
این response نشان میدهد که pipeline سنجشازدور برای یک مزرعه با موفقیت اجرا شده، دادههای ماهوارهای برای 12 سلول grid ذخیره شده، و در نهایت subdivision دادهمحور با 2 خوشه ساخته شده است.
جمعبندی سریع همین response
- تحلیل مربوط به بازه
2026-04-09تا2026-05-09است. - درخواست در
2026-05-10T20:17:34Zشروع شده و در2026-05-10T20:28:29Zکامل شده است. - 12 سلول grid با اندازه
900مترمربع پردازش شدهاند. - feature های استفادهشده برای clustering اینها هستند:
ndvindwisoil_vv_db
- هیچ metricی fail نشده است.
- همه 12 observation قابل استفاده بودهاند:
usable_observation_count = 12fully_null_observation_count = 0
- نتیجه نهایی clustering برابر
2خوشه است.
ساختار کلی response
ساختار سطح بالا این response به صورت زیر است:
{
"code": 200,
"msg": "success",
"data": {
"status": "completed",
"source": "database",
"run": {...},
"task": {...},
"location": {...},
"summary": {...},
"cells": [...],
"subdivision_result": {...},
"pagination": {...}
}
}
هر بخش یک نقش جدا دارد:
run: رکورد اصلی اجرای تحلیلtask: وضعیت orchestration و stageهای Celery/pipelinelocation: اطلاعات مزرعه و layout بلوکهاsummary: خلاصه آماری observationهاcells: داده خام هر سلول gridsubdivision_result: خروجی clustering و assignment هر سلولpagination: اطلاعات صفحهبندی برای لیست cellها و assignmentها
بخش code و msg
code = 200- یعنی endpoint با موفقیت جواب داده است.
msg = "success"- پیام عمومی موفقیت است.
این دو فیلد بیشتر برای client-side handling مفید هستند.
بخش data.status و data.source
status = "completed"- یعنی فرآیند تحلیلی کامل شده و نتیجه نهایی آماده است.
source = "database"- یعنی response از دادههای ذخیرهشده در دیتابیس ساخته شده، نه از اجرای زنده openEO در همان لحظه.
نکته:
- این به معنی آن نیست که openEO استفاده نشده؛ برعکس، openEO قبلاً استفاده شده و خروجی آن در DB persist شده است.
- فقط endpoint فعلی نتیجه را از cache دیتابیسی برگردانده است.
بخش run
بخش run رکورد اصلی اجرای remote sensing را توصیف میکند.
فیلدهای پایه
id = 1- شناسه اجرای تحلیل
block_code = ""- اجرای تحلیل روی block پیشفرض/کل محدوده انجام شده است
chunk_size_sqm = 900- هر cell حدود 900 مترمربع است
temporal_start = "2026-04-09"temporal_end = "2026-05-09"- بازه زمانی دادههای ماهوارهای
وضعیت run
status = "success"- وضعیت خام دیتابیس
status_label = "completed"- نسخه نرمالشده برای client
pipeline_status = "completed"- وضعیت نهایی قابل نمایش برای frontend
stage = "completed"- آخرین stage ثبتشده
featureهای انتخابشده
selected_features = ["ndvi", "ndwi", "soil_vv_db"]
یعنی clustering فقط با این سه feature انجام شده است.
requested_cluster_count
requested_cluster_count = null
یعنی کاربر تعداد cluster را مستقیماً مشخص نکرده و سیستم آن را خودش انتخاب کرده است.
بخش run.metadata
این بخش metadata کامل اجرای pipeline را نگه میدارد.
scope
scope = "all_blocks"
یعنی اجرا در scope کل blockهای قابل تحلیل ثبت شده است.
service
این بخش مشخص میکند metricها از کدام backend آمدهاند.
backend = "openeo"backend_url = "https://openeofed.dataspace.copernicus.eu"collections_used = ["SENTINEL2_L2A", "SENTINEL1_GRD"]
یعنی:
ndviوndwiاز Sentinel-2soil_vvاز Sentinel-1soil_vv_dbبه صورت مشتقشده ازsoil_vv
job_refs
اینها شناسه jobهای openEO هستند:
ndvindwisoil_vv
این شناسهها برای trace کردن jobهای backend خیلی مهماند.
failed_metrics
failed_metrics = []
یعنی هیچ metricی fail نشده است.
payload_diagnostics
برای هر metric یک summary از payload خام openEO ذخیره شده:
returned_cell_count = 12payload_keys_sample = ["0", "1", "2", "3", "4"]available_features = []
تعبیر این بخش:
- backend برای هر metric 12 نتیجه برگردانده
- payload به صورت positional/list-based بوده، نه با
cell_codeهای صریح available_features = []طبیعی است، چون payload از نوع لیستی عددی بوده و structure دیکشنری feature-based نداشته است
بخش run.metadata.summary
این خلاصه اجرایی run است:
source = "openeo"status = "completed"cell_count = 12processed_cell_count = 12created_observation_count = 12updated_observation_count = 0existing_observation_count = 0failed_metric_count = 0cluster_count = 2subdivision_result_id = 1
معنی عملی:
- همه 12 سلول تازه ساخته و پردازش شدهاند
- چیزی از قبل reuse نشده
- pipeline بدون failure تا انتها رفته
بخش timestamps
این timestamps جریان کامل pipeline را نشان میدهند:
queued_at: زمان queue شدن taskstarted_at: زمان شروع واقعی taskpreparing_analysis_grid_at: زمان شروع ساخت gridanalysis_grid_ready_at: زمان آماده شدن gridanalysis_cells_selected_at: زمان انتخاب cellهای هدفfetching_remote_metrics_at: زمان شروع fetch از openEOremote_metrics_fetched_at: زمان تکمیل دریافت metricهاobservations_persisted_at: زمان ذخیره observationها در DBclustering_completed_at: زمان تکمیل clusteringcompleted_at: زمان پایان کامل pipeline
برای این response:
- start:
2026-05-10T20:17:34.570353+00:00 - complete:
2026-05-10T20:28:29.469326+00:00
پس کل فرآیند حدود 10 دقیقه و 55 ثانیه طول کشیده است.
بخش stage_details
این بخش مهمترین قسمت برای debugging و فهم pipeline است.
analysis_grid_ready
{
"created": true,
"total_count": 12,
"created_count": 12,
"existing_count": 0
}
یعنی:
- grid analysis تازه ساخته شده
- 12 سلول جدید ایجاد شده
analysis_cells_selected
{
"force_refresh": false,
"total_cell_count": 12,
"existing_cell_count": 0,
"cell_count_to_process": 12
}
یعنی:
- force refresh فعال نبوده
- هیچ cell cacheشدهای برای reuse وجود نداشته
- هر 12 سلول باید از openEO پردازش میشدند
fetching_remote_metrics
این بخش دو چیز را نشان میدهد:
target_cells- لیست سلولهایی که برایشان metric گرفته شده
metric_progress- وضعیت پیشرفت metricها
در این response:
total_metrics = 3- metricهای کاملشده:
ndvindwisoil_vv_db
نکته:
- job_ref
soil_vv_dbدر اصل به job مربوط بهsoil_vvmap شده، چونsoil_vv_dbmetric مشتقشده است.
remote_metrics_fetched
این بخش metadata سرویس را بعد از fetch نگه میدارد و تأیید میکند:
- metricها از openEO آمدهاند
- هیچ metricی fail نشده
- برای هر metric 12 سلول نتیجه برگشته
observations_persisted
این بخش نشان میدهد دادهها با موفقیت در DB ذخیره شدهاند:
created_count = 12updated_count = 0matched_cell_count = 12usable_observation_count = 12fully_null_observation_count = 0unmatched_db_cell_codes = []unmatched_payload_cell_codes = []
این یکی از مهمترین بخشهای response است، چون ثابت میکند:
- matching بین payload و سلولهای DB کامل بوده
- هیچ observation خالی persist نشده
- تمام cellها usable بودهاند
clustering_completed
این بخش خروجی clustering را خلاصه میکند:
cluster_count = 2used_cell_count = 12skipped_cell_count = 0subdivision_result_id = 1
و پارامترهای KMeans:
max_k = 10n_init = 10random_state = 42selection_strategy = "elbow"selected_k = 2
یعنی سیستم با روش elbow، مقدار K = 2 را بهترین انتخاب دیده است.
بخش task
بخش task نسخه task-oriented همین اجرا را نشان میدهد.
current_stage
current_stage = "completed"
یعنی دیگر stage فعالی وجود ندارد و task بسته شده است.
stages
این آرایه تاریخچه stageها را نگه میدارد:
queuedpreparing_analysis_gridanalysis_grid_readyanalysis_cells_selectedfetching_remote_metricsremote_metrics_fetchedobservations_persistedclustering_completedcompleted
این ترتیب دقیق pipeline را نشان میدهد.
metric_progress
این بخش برای UI بسیار مفید است:
total_metrics = 3completed_metric_count = 3failed_metrics = []active_metric = null
پس هیچ metric نیمهکاره یا fail شدهای باقی نمانده است.
celery
این بخش وضعیت Celery task را نشان میدهد:
state = "SUCCESS"ready = truesuccessful = truefailed = false
و در info هم خلاصه اجرایی برگردانده شده:
- 12 سلول پردازش شده
- 12 observation ساخته شده
- 2 cluster تولید شده
بخش location
این بخش context مکانی تحلیل را نشان میدهد.
اطلاعات پایه
id = 1lon = "50.000000"lat = "50.000000"input_block_count = 1
farm_boundary
یک polygon مربعی کوچک اطراف مختصات 50,50 است.
block_layout
در blocks دو ورودی دیده میشود:
-
block پیشفرض:
source = "default"block_code = "block-1"
-
block تولیدشده از remote sensing:
source = "remote_sensing"block_code = ""needs_subdivision = true- دارای 2 زیربلوک (
cluster-0,cluster-1)
این یعنی سیستم علاوه بر block اولیه، یک layout تحلیلی جدید هم بر اساس دادههای remote sensing ساخته است.
analysis_grid_summary
cell_count = 12chunk_size_sqm = 900
یعنی farm boundary به 12 cell با اندازه 900 مترمربع شکسته شده است.
satellite_snapshots
دو snapshot وجود دارد:
-
برای
block-1status = "missing"- یعنی برای آن block خاص snapshot مستقلی وجود ندارد
-
برای
block_code = ""status = "completed"run_id = 1cell_count = 12resolved_metrics:ndvi = 0.686502ndwi = -0.598028soil_vv_db = -13.374155
این اعداد همان summary سادهی metrics در کل محدوده هستند.
بخش summary
این بخش خلاصه آماری کل observationها است:
{
"cell_count": 12,
"ndvi_mean": 0.686502,
"ndwi_mean": -0.598028,
"soil_vv_db_mean": -13.374155
}
معنی:
- 12 سلول در summary لحاظ شدهاند
- میانگین
ndviحدود0.6865 - میانگین
ndwiحدود-0.5980 - میانگین
soil_vv_dbحدود-13.3742
بخش cells
این آرایه، داده خام هر سلول را نگه میدارد.
هر item شامل اینها است:
cell_codeblock_codechunk_size_sqmcentroid_latcentroid_longeometrytemporal_starttemporal_endndvindwisoil_vvsoil_vv_dbmetadata
مثال از یک cell
برای اولین سلول:
cell_code = loc-1__block-farm__chunk-900__r0000c0000ndvi = 0.6622872683737013ndwi = -0.583760056230757soil_vv = 0.0290423126684294soil_vv_db = -15.369688
این یعنی این cell هم داده خام خطی Sentinel-1 (soil_vv) را دارد، هم نسخه dB آن (soil_vv_db).
cells[].metadata
metadata هر سلول شامل اینها است:
run_idjob_refsbackend_namebackend_urlcollections_usedfailed_metricspayload_diagnostics
این metadata برای traceability خیلی مفید است، چون مشخص میکند این observation از کدام run و کدام jobهای openEO آمده است.
بخش subdivision_result
این بخش خروجی اصلی clustering را نشان میدهد.
فیلدهای پایه
id = 1cluster_count = 2selected_features = ["ndvi", "ndwi", "soil_vv_db"]skipped_cell_codes = []
یعنی:
- نتیجه نهایی clustering دو خوشه دارد
- هیچ cellی حذف نشده
metadata.scaler_means
میانگین هر feature قبل از scaling:
ndvi = 0.6865018435098507ndwi = -0.5980279920277772soil_vv_db = -13.374155250000005
metadata.scaler_scales
انحراف معیار/scale هر feature:
ndvi = 0.018948282260331236ndwi = 0.012494317547431832soil_vv_db = 0.87754098540943
metadata.imputer_statistics
چون imputer از نوع median بوده:
- median
ndvi - median
ndwi - median
soil_vv_db
برای این run ذخیره شدهاند، حتی اگر در این مورد missing value نداشتهایم.
metadata.missing_value_counts
{
"ndvi": 0,
"ndwi": 0,
"soil_vv_db": 0
}
این خیلی مهم است، چون نشان میدهد برای featureهای clustering هیچ دادهی گمشدهای وجود نداشته است.
metadata.inertia_curve
این آرایه SSE را برای Kهای مختلف نگه میدارد:
k=1 => sse=36k=2 => sse=14.987928- ...
k=10 => sse=0.140512
سیستم از این curve برای انتخاب elbow استفاده کرده و در نهایت k=2 را برداشته است.
metadata.cluster_summaries
خلاصه هر cluster:
-
cluster-0cell_count = 9centroid_lat = 49.999995centroid_lon = 50.000223
-
cluster-1cell_count = 3centroid_lat = 50.000174centroid_lon = 49.99985
یعنی تقسیمبندی نهایی مزرعه به دو زیربلوک 9تایی و 3تایی انجام شده است.
assignments
این آرایه برای هر cell مشخص میکند:
- عضو کدام cluster است
- raw feature value آن چیست
- scaled feature value آن چیست
مثلاً:
loc-1__block-farm__chunk-900__r0000c0000cluster_label = 1raw_feature_values.ndvi = 0.662287...raw_feature_values.ndwi = -0.583760...raw_feature_values.soil_vv_db = -15.369688
این بخش برای تحلیل اینکه چرا یک cell داخل یک cluster خاص افتاده بسیار مفید است.
بخش pagination
این بخش صفحهبندی را برای دو لیست نشان میدهد:
cellsassignments
در هر دو مورد:
page = 1page_size = 100total_items = 12total_pages = 1has_next = falsehas_previous = false
یعنی تمام دادهها در یک صفحه جا شدهاند.
نتیجه نهایی این response
اگر بخواهیم این response را در یک جمله خلاصه کنیم:
- سیستم در تاریخ
2026-05-10یک تحلیل سنجشازدور موفق روی 12 سلول grid انجام داده، metricهایndvi,ndwi,soil_vv_dbرا بدون missing value ذخیره کرده، و مزرعه را با روش elbow-based KMeans به 2 زیربلوک تقسیم کرده است.
مهمترین فیلدها برای استفاده عملی
اگر فقط چند بخش برای frontend یا debugging مهم باشد، اینها از همه مهمترند:
data.statusdata.run.selected_featuresdata.run.metadata.summarydata.run.metadata.stage_details.observations_persisteddata.summarydata.cellsdata.subdivision_result.metadata.cluster_summariesdata.subdivision_result.assignments
برداشت فنی از سلامت این run
این response از نظر pipeline یک run سالم را نشان میدهد:
- status نهایی
completedاست - Celery در
SUCCESSاست - هیچ metricی fail نشده
- همه cellها match شدهاند
- هیچ observationی null کامل نیست
- clustering روی همه سلولها اجرا شده
- output نهایی subdivision ساخته شده
پس این response نمونهی یک اجرای موفق و کامل remote sensing subdivision است.