Как загрузить спутниковые изображения (например, Sentinel-2) из Google Earth Engine (GEE) с помощью python api в Django
В основном я пытаюсь создать конечную точку API с помощью Django, которая возвращает geoJSON с координатами и спутниковыми изображениями, которые будут потребляться фронтенд-приложением (Nextjs/React). Координаты отображаются в виде сетки, но я не вижу загрузки изображения, я пробовал различные подходы, даже пару раз переделывал кодовую базу. В моем консольном облаке Google com monitoring metrics-explorer (изображение ниже) показано, что в моем Earth Engine происходит активность, но спутниковые изображения не загружаются в мою локальную директорию.
введите описание изображения здесь
Моя кодовая база
models.py:
from django.contrib.gis.db import models
# Create your models here.
class farm(models.Model):
fid = models.FloatField()
name = models.CharField(max_length = 50)
size = models.FloatField()
crop = models.CharField(max_length = 10)
geom = models.MultiPolygonField(srid = 4326)
image_path = models.CharField(max_length = 255, blank = True, null = True)
def __str__(self):
return self.name
serializers.py:
from rest_framework_gis.serializers import GeoFeatureModelSerializer, GeometryField
from .models import farm
class farmSerializer(GeoFeatureModelSerializer):
geom = GeometryField()
class Meta:
model = farm
geo_field = "geom"
fields = "__all__"
urls.py:
from rest_framework.routers import DefaultRouter
from django.conf import settings
from django.conf.urls.static import static
from .views import farmViewSet
router = DefaultRouter()
router.register(
prefix = "api/v1/farms",
viewset = farmViewSet,
basename = "farms"
)
urlpatterns = router.urls
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.SATELLITE_IMAGES_URL, document_root=settings.SATELLITE_IMAGES_DIR)
utils.py:
import ee
import os
import requests
import json
from parallel_sync import wget
from django.conf import settings
# from .models import farm
ee.Authenticate()
ee.Initialize(project="ee-bezalelbenuri")
def download_satellite_image(farm):
try:
geom = json.loads(farm.geom.geojson)
geometry = ee.Geometry.Polygon(geom["coordinates"])
# Define date range for the satellite images
start = ee.Date('2020-01-01')
finish = ee.Date('2023-03-20')
# Get the latest Landsat 8 image
image = ee.ImageCollection("COPERNICUS/S2") \
.filterBounds(geometry) \
.filterDate(start, finish) \
.first()
path = image.getDownloadURL({
"region": geometry,
"scale":10
})
# # define the local file path
image_folder = settings.SATELLITE_IMAGES_DIR
os.makedirs(image_folder, exist_ok = True)
image_path = os.path.join(image_folder, f"{farm.id}.zip")
# # Download the image
wget.download(path, image_path)
# Save the image path to the model
farm.image_path = os.path.join(settings.SATELLITE_IMAGES_URL, f'{farm.id}.zip')
farm.save()
except Exception as e:
print(f"Error downloading satellite image: {e}")
views.py:
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import farm
from .serializer import farmSerializer
from .utils import download_satellite_image
# Create your views here.
class farmViewSet(viewsets.ModelViewSet):
queryset = farm.objects.all()
serializer_class = farmSerializer
@action(detail = True, methods = ["get"])
def download_image(self, request, pk = None):
farm_instance = self.get_object()
download_satellite_image(farm_instance)
return Response({"status": "image downloaded", "image_path": farm_instance.image_path})
settings.py:
STATIC_URL = "static/"
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
SATELLITE_IMAGES_DIR = os.path.join(BASE_DIR, 'generated', 'satellite_images')
SATELLITE_IMAGES_URL = '/generated/satellite_images/'
Может быть, я что-то упускаю, может быть, команду manage.py?