hoàn thành chức năng remove cloud train
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
# Microsoft Planetary Computer - Giải pháp Timeout
|
||||
|
||||
## ❌ Vấn đề
|
||||
```
|
||||
The request exceeded the maximum allowed time
|
||||
```
|
||||
|
||||
## ✅ Giải pháp
|
||||
|
||||
### 1. **Giảm Parameters** (Quan trọng nhất)
|
||||
|
||||
**Thử theo thứ tự:**
|
||||
|
||||
```python
|
||||
# ❌ QUÁ LỚN - Dễ timeout
|
||||
bbox = [105.48, 9.77, 106.14, 10.35] # ~70km x 60km
|
||||
start_date = "2023-01-01"
|
||||
end_date = "2023-12-31" # 12 months
|
||||
max_scenes = 12
|
||||
```
|
||||
|
||||
```python
|
||||
# ✅ VỪA PHẢI - Tốt
|
||||
bbox = [105.8, 10.0, 105.9, 10.1] # ~10km x 10km
|
||||
start_date = "2024-01-01"
|
||||
end_date = "2024-01-31" # 1 month
|
||||
max_scenes = 5
|
||||
```
|
||||
|
||||
```python
|
||||
# ✅ RẤT NHỎ - Luôn work
|
||||
bbox = [105.85, 10.05, 105.87, 10.07] # ~2km x 2km
|
||||
start_date = "2024-01-15"
|
||||
end_date = "2024-01-22" # 1 week
|
||||
max_scenes = 3
|
||||
```
|
||||
|
||||
### 2. **Chiến lược Progressive Loading**
|
||||
|
||||
Thay vì load toàn bộ vùng lớn 1 lúc, chia nhỏ:
|
||||
|
||||
```python
|
||||
# Ví dụ: Chia bbox lớn thành 4 phần nhỏ
|
||||
original_bbox = [105.48, 9.77, 106.14, 10.35]
|
||||
|
||||
# Tính mid points
|
||||
min_lon, min_lat, max_lon, max_lat = original_bbox
|
||||
mid_lon = (min_lon + max_lon) / 2
|
||||
mid_lat = (min_lat + max_lat) / 2
|
||||
|
||||
# 4 sub-regions
|
||||
sub_regions = [
|
||||
[min_lon, min_lat, mid_lon, mid_lat], # Bottom-left
|
||||
[mid_lon, min_lat, max_lon, mid_lat], # Bottom-right
|
||||
[min_lon, mid_lat, mid_lon, max_lat], # Top-left
|
||||
[mid_lon, mid_lat, max_lon, max_lat], # Top-right
|
||||
]
|
||||
|
||||
# Load từng region riêng, sau đó merge
|
||||
```
|
||||
|
||||
### 3. **Tăng Timeout trong Code**
|
||||
|
||||
Sửa `fetch_sentinel_items_with_retry`:
|
||||
|
||||
```python
|
||||
# Thử với timeout dài hơn và ít items hơn
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
# Giảm target xuống còn 2-3 items cho lần đầu
|
||||
target_items = min(3, max_scenes) if attempt == 0 else 2
|
||||
|
||||
search = catalog.search(
|
||||
collections=["sentinel-2-l2a"],
|
||||
bbox=bbox,
|
||||
datetime=time_range,
|
||||
query={"eo:cloud_cover": {"lt": cloud_cover}},
|
||||
limit=10 # Giảm từ 20-50 xuống 10
|
||||
)
|
||||
|
||||
# Set timeout cho iterator
|
||||
items = []
|
||||
import signal
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Item fetch timeout")
|
||||
|
||||
signal.signal(signal.SIGALRM, timeout_handler)
|
||||
signal.alarm(30) # 30 giây timeout
|
||||
|
||||
try:
|
||||
for item in search.items():
|
||||
items.append(item)
|
||||
if len(items) >= target_items:
|
||||
break
|
||||
finally:
|
||||
signal.alarm(0) # Cancel alarm
|
||||
```
|
||||
|
||||
### 4. **Alternative: Dùng Dữ liệu Local**
|
||||
|
||||
Nếu Planetary Computer liên tục timeout:
|
||||
|
||||
#### **a) Download trước (Recommended)**
|
||||
|
||||
```bash
|
||||
# Dùng sentinelsat để download
|
||||
pip install sentinelsat
|
||||
|
||||
# Download Sentinel-2 về máy
|
||||
python download_sentinel2.py --bbox 105.8,10.0,105.9,10.1 \
|
||||
--start 2024-01-01 --end 2024-01-31
|
||||
```
|
||||
|
||||
#### **b) Dùng Google Earth Engine** (Nếu có account)
|
||||
|
||||
```python
|
||||
import ee
|
||||
ee.Initialize()
|
||||
|
||||
# Load Sentinel-2 từ GEE thay vì Planetary Computer
|
||||
image = ee.ImageCollection('COPERNICUS/S2_SR') \
|
||||
.filterBounds(ee.Geometry.Rectangle(bbox)) \
|
||||
.filterDate(start_date, end_date) \
|
||||
.median()
|
||||
```
|
||||
|
||||
### 5. **Cache Aggressive**
|
||||
|
||||
Khi đã load được data, cache ngay:
|
||||
|
||||
```python
|
||||
# Trong prediction interface, enable cache by default
|
||||
use_cache = True # ALWAYS
|
||||
|
||||
# Khi load thành công, lưu cache ngay
|
||||
if items and len(items) > 0:
|
||||
cache_file = f"cache_{bbox_hash}_{date_hash}.joblib"
|
||||
joblib.dump({
|
||||
'items': items,
|
||||
's2_data': s2_data,
|
||||
'timestamp': datetime.now()
|
||||
}, cache_file)
|
||||
```
|
||||
|
||||
## 🎯 **Action Plan Ngay Bây Giờ**
|
||||
|
||||
### **Bước 1: Test với bbox CỰC NHỎ**
|
||||
|
||||
Web interface → Prediction:
|
||||
- Min Lon: **105.80**
|
||||
- Min Lat: **10.00**
|
||||
- Max Lon: **105.82** (chỉ 0.02 độ = ~2km)
|
||||
- Max Lat: **10.02**
|
||||
- Start: **2024-01-15**
|
||||
- End: **2024-01-17** (3 ngày)
|
||||
- Max Scenes: **2**
|
||||
- Cloud Cover: 50%
|
||||
|
||||
→ Nếu vẫn timeout → Vấn đề là internet/firewall/server PC quá tải
|
||||
|
||||
### **Bước 2: Nếu Step 1 OK → Tăng dần**
|
||||
|
||||
- Tăng bbox lên 0.05 độ (~5km)
|
||||
- Tăng time range lên 1 tuần
|
||||
- Tăng max_scenes lên 5
|
||||
|
||||
### **Bước 3: Dùng Batch Processing**
|
||||
|
||||
Thay vì 1 query lớn:
|
||||
- Chia thành nhiều queries nhỏ
|
||||
- Dùng `/api/batch/start`
|
||||
- Mỗi job = 1 vùng nhỏ
|
||||
- Merge results sau
|
||||
|
||||
## 🔧 **Debug Commands**
|
||||
|
||||
```bash
|
||||
# Check internet
|
||||
ping -c 3 planetarycomputer.microsoft.com
|
||||
|
||||
# Check DNS
|
||||
nslookup planetarycomputer.microsoft.com
|
||||
|
||||
# Test với curl
|
||||
curl -I https://planetarycomputer.microsoft.com/api/stac/v1
|
||||
|
||||
# Monitor network
|
||||
sudo tcpdump -i any host planetarycomputer.microsoft.com
|
||||
```
|
||||
|
||||
## 📝 **Token Info** (FYI)
|
||||
|
||||
Microsoft Planetary Computer **KHÔNG CẦN** manual token:
|
||||
- ✅ SAS tokens tự động gen bởi `planetary_computer.sign()`
|
||||
- ✅ Auto-refresh khi cần
|
||||
- ✅ Không cần API key/registration (public access)
|
||||
- ❌ KHÔNG có "hết token" - chỉ có timeout/rate limit
|
||||
|
||||
Nếu thấy authentication error:
|
||||
```python
|
||||
# Cài lại thư viện
|
||||
pip install --upgrade planetary-computer pystac-client
|
||||
```
|
||||
Reference in New Issue
Block a user