Как загрузить спутниковые изображения (например, 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?

Вернуться на верх