14 KiB
14 KiB
راهنمای فرانت برای API های Location Data
این فایل برای تیم فرانت نوشته شده تا بتواند API های Location Data را سریع و دقیق مصرف کند.
مسیرهای اصلی:
GET /api/location-data/POST /api/location-data/POST /api/location-data/ndvi-health/GET /api/location-data/remote-sensing/POST /api/location-data/remote-sensing/GET /api/location-data/remote-sensing/cluster-blocks/{cluster_uuid}/live/GET /api/location-data/remote-sensing/cluster-recommendations/GET /api/location-data/remote-sensing/results/{result_id}/k-options/POST /api/location-data/remote-sensing/results/{result_id}/k-options/activate/GET /api/location-data/remote-sensing/runs/{run_id}/status/
احراز هویت
همه این endpointها با JWT کار میکنند.
نمونه header:
Authorization: Bearer <access_token>
Content-Type: application/json
ساختار عمومی response
تقریبا همه endpointها این فرم را دارند:
{
"code": 200,
"msg": "success",
"data": {}
}
قاعده پیشنهادی در فرانت:
- اول
HTTP statusرا چک کنید. - بعد
codeرا از body چک کنید. - در موفقیت، فقط
dataرا به state یا UI بدهید. - در خطا،
msgرا به عنوان پیام اصلی نمایش دهید. - اگر
dataشامل خطای فیلدها بود، آن را برای فرم map کنید.
نمونه خطای validation:
{
"code": 400,
"msg": "داده نامعتبر.",
"data": {
"farm_uuid": ["This field is required."]
}
}
نمونه خطای not found:
{
"code": 404,
"msg": "location پیدا نشد.",
"data": null
}
1) دریافت location ذخیره شده
GET /api/location-data/
کاربرد:
- خواندن location ذخیره شده
- دریافت farm boundary
- دریافت block layout
- دریافت subdivisionها و snapshotهای ماهواره ای ذخیره شده
query params
latاختیاریlonاختیاریfarm_uuidاختیاری
نمونه درخواست
GET /api/location-data/?farm_uuid=<farm_uuid>
نمونه response
{
"code": 200,
"msg": "success",
"data": {
"source": "database",
"id": 12,
"lon": "51.389000",
"lat": "35.689200",
"input_block_count": 2,
"farm_boundary": {},
"block_layout": {},
"block_subdivisions": [],
"satellite_snapshots": []
}
}
استفاده در فرانت
farm_boundaryرا برای رسم polygon کل مزرعه استفاده کنید.block_layoutرا برای رندر blockها استفاده کنید.block_subdivisionsبرای نمایش grid/subdivision مفید است.satellite_snapshotsبرای summaryهای تاریخی یا cache قابل استفاده است.
2) ثبت یا به روزرسانی location
POST /api/location-data/
کاربرد:
- ساخت location جدید
- update location قبلی
- ثبت farm boundary
- ثبت block layout
نمونه body
{
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"lat": 35.6892,
"lon": 51.389,
"farm_boundary": {
"type": "Polygon",
"coordinates": []
},
"block_layout": {
"blocks": []
}
}
نکات فرانت
- اگر کاربر هنوز boundary را کامل نکرده، این endpoint را صدا نزنید.
- در صورت دریافت
source = createdمیتوانید UI را به عنوان location جدید mark کنید. - در صورت دریافت
source = databaseیعنی رکورد از قبل وجود داشته یا update شده است.
3) دریافت NDVI health
POST /api/location-data/ndvi-health/
کاربرد:
- گرفتن کارت سلامت پوشش گیاهی مزرعه
- نمایش شاخص NDVI در UI
body
{
"farm_uuid": "11111111-1111-1111-1111-111111111111"
}
response مهم
{
"code": 200,
"msg": "success",
"data": {
"ndviIndex": 0.63,
"mean_ndvi": 0.63,
"ndvi_map": {},
"vegetation_health_class": "healthy",
"observation_date": "2026-05-12",
"satellite_source": "sentinel-2",
"healthData": [
{
"title": "میانگین NDVI",
"value": 0.63,
"color": "green",
"icon": "leaf"
}
]
}
}
استفاده در فرانت
ndviIndexرا به عنوان KPI اصلی نمایش دهید.vegetation_health_classرا برای badge یا رنگ وضعیت استفاده کنید.healthDataرا برای کارت های summary استفاده کنید.ndvi_mapاگر لایه نقشه داشت، به map layer وصل شود.
4) خواندن cache سنجش از دور
GET /api/location-data/remote-sensing/
کاربرد:
- فقط داده cache شده یا ذخیره شده را میخواند
- پردازش جدید شروع نمیکند
query params
farm_uuidاجباریpageاختیاریpage_sizeاختیاریstart_dateاختیاریend_dateاختیاری
نمونه درخواست
GET /api/location-data/remote-sensing/?farm_uuid=<farm_uuid>&page=1&page_size=50
فیلدهای مهم response
statussourcelocationsummarycellsrunsubdivision_resultpaginationmetadata
رفتار پیشنهادی در فرانت بر اساس status
success: داده آماده است و باید render شود.processing: هنوز نتیجه نهایی آماده نیست؛ loading یا polling state نشان دهید.not_found: هنوز تحلیل برای این مزرعه ساخته نشده؛ میتوانیدPOST /remote-sensing/را بزنید.
استفاده در فرانت
cellsبرای نقشه سلولی و heatmap مناسب است.summaryبرای کارت آماری بالای صفحه مناسب است.subdivision_result.cluster_blocksبرای نمایش cluster polygonها استفاده شود.assignmentsبرای رنگ آمیزی سلول ها بر اساس label کلاستر مفید است.
5) شروع تحلیل سنجش از دور
POST /api/location-data/remote-sensing/
کاربرد:
- شروع async processing
- ساخت run و
task_id - شروع جریان polling برای UI
body
{
"farm_uuid": "11111111-1111-1111-1111-111111111111"
}
response
{
"code": 202,
"msg": "تحلیل سنجشازدور در صف قرار گرفت.",
"data": {
"status": "processing",
"source": "processing",
"location": {},
"block_code": "",
"chunk_size_sqm": 900,
"temporal_extent": {
"start_date": "2026-04-12",
"end_date": "2026-05-12"
},
"summary": {
"cell_count": 0,
"ndvi_mean": null,
"ndwi_mean": null,
"soil_vv_db_mean": null
},
"cells": [],
"run": {},
"task_id": "11111111-1111-1111-1111-111111111111"
}
}
قرارداد مهم برای فرانت
- همیشه
task_idرا ذخیره کنید. - اگر
run.idموجود بود، برای status endpoint از آن استفاده کنید. - بعد از این endpoint بلافاصله polling را شروع کنید.
flow پیشنهادی
POST /remote-sensing/
-> دریافت task_id / run
-> هر چند ثانیه GET /runs/{run_id}/status/
-> وقتی status = completed شد، همان payload را مصرف کن
6) دریافت live metrics برای یک cluster
GET /api/location-data/remote-sensing/cluster-blocks/{cluster_uuid}/live/
کاربرد:
- گرفتن metricهای یک cluster
- استفاده برای panel جزئیات یا modal زنده
نمونه درخواست
GET /api/location-data/remote-sensing/cluster-blocks/<cluster_uuid>/live/
فیلدهای مهم
sourcecluster_blocksummarymetricsmetadata
نکات فرانت
- اگر
source = databaseبود، label بزنید که داده cache است. - اگر
source = openeoبود، میتوانید label زنده یا live نمایش دهید. metricsبرای KPIهای سریع مناسب است.cluster_block.geometryرا برای هایلایت روی نقشه استفاده کنید.
7) پیشنهاد گیاه برای clusterها
GET /api/location-data/remote-sensing/cluster-recommendations/
کاربرد:
- دریافت پیشنهاد محصول برای هر cluster
- نمایش candidate plantها و suggested plant
query params
farm_uuidاجباری
فیلدهای مهم response
registered_plantsclustersevaluated_plant_countcluster_count
استفاده در فرانت
برای هر cluster این بخش ها مهم هستند:
satellite_metricssensor_metricsresolved_metricscandidate_plantssuggested_plant
UI پیشنهادی
- کارت cluster با عنوان
sub_block_codeیاcluster_label - KPIهای
resolved_metrics - جدول candidateها با score
- highlight کردن
suggested_plant
8) لیست K optionها
GET /api/location-data/remote-sensing/results/{result_id}/k-options/
کاربرد:
- گرفتن همه Kهای ذخیره شده برای یک subdivision result
response مهم
{
"code": 200,
"msg": "success",
"data": {
"result_id": 5,
"active_requested_k": 3,
"recommended_requested_k": 4,
"options": []
}
}
استفاده در فرانت
active_requested_kرا به عنوان گزینه فعال UI نشان دهید.recommended_requested_kرا با badge پیشنهادی نمایش دهید.optionsرا برای dropdown یا segmented control استفاده کنید.
9) فعال سازی یک K
POST /api/location-data/remote-sensing/results/{result_id}/k-options/activate/
body
{
"requested_k": 4
}
استفاده در فرانت
- وقتی کاربر K جدید را انتخاب میکند این endpoint را صدا بزنید.
- بعد از موفقیت،
subdivision_resultبرگشتی را جایگزین state قبلی کنید. - لازم نیست دوباره
GET /remote-sensing/را صدا بزنید اگر payload کامل برگشت.
10) polling وضعیت run
GET /api/location-data/remote-sensing/runs/{run_id}/status/
کاربرد:
- فهمیدن این که pipeline در چه مرحلهای است
- دریافت نتیجه نهایی به محض completion
statusهای مهم
pendingrunningretryingcompletedfailed
رفتار پیشنهادی در فرانت
pending: queue staterunning: progress stateretrying: پیام retry موقتcompleted: داده نهایی را render کنfailed: CTA برای retry بده
نکته مهم
اگر status = completed شد، همان response نهایی را مصرف کنید و polling را stop کنید.
فیلدهای مهم برای map
farm level
farm_boundaryblock_layout.blocksblock_subdivisions
remote sensing level
cells[].geometrysubdivision_result.cluster_blocks[].geometrysubdivision_result.assignments[]cluster_block.geometry
پیشنهاد برای لایه های نقشه
- لایه مرز مزرعه
- لایه blockها
- لایه cellها یا heatmap
- لایه cluster blockها
- لایه selected cluster highlight
خطاهایی که فرانت باید handle کند
400
- ورودی ناقص یا نامعتبر
- باید خطای فیلدی یا toast نشان داده شود
404
- مزرعه یا location یا result پیدا نشده
- برای UI بهتر است empty state نمایش داده شود
502
- خطا از backend upstream مثل openEO یا AI
- بهتر است retry action داشته باشید
flow پیشنهادی کامل برای صفحه تحلیل
سناریو اول: فقط نمایش داده موجود
GET /api/location-data/remote-sensing/?farm_uuid=<farm_uuid>
-> اگر status=success : render
-> اگر status=processing : برو به polling
-> اگر status=not_found : دکمه شروع تحلیل نمایش بده
سناریو دوم: کاربر تحلیل را شروع میکند
POST /api/location-data/remote-sensing/
-> 202
-> run/task_id را ذخیره کن
-> GET /api/location-data/remote-sensing/runs/{run_id}/status/
-> وقتی completed شد نتیجه را render کن
سناریو سوم: کاربر K را تغییر میدهد
GET /results/{result_id}/k-options/
-> انتخاب K
-> POST /results/{result_id}/k-options/activate/
-> subdivision_result جدید را render کن
پیشنهاد state management در فرانت
حداقل stateهایی که نیاز دارید:
{
location: null,
remoteSensing: null,
runStatus: null,
clusterRecommendations: [],
selectedClusterUuid: null,
kOptions: [],
loading: false,
polling: false,
error: null
}
نکات نهایی برای تیم فرانت
- برای endpointهای async همیشه polling را در نظر بگیرید.
codeرا از body نادیده نگیرید.- روی
statusدر remote sensing و run status منطق UI بنویسید. - داده های هندسی را مستقیم برای map layerها مصرف کنید.
cluster_uuid,result_id,run_idرا بعد از اولین response در state نگه دارید.
فایل مکمل
اگر به جزئیات کامل همه responseها نیاز دارید، این فایل را هم ببینید:
docs/location_data_api_responses_fa.md