如何将GEE Python Api集成到Django框架中进行使用(避免踩坑)(一)

前言

之前一直在GEE的网页端通过编写JavaScript代码进行研究,现在需要通过Python Api进行系统构建,通过对比选择Django框架对GEE进行集成,以便构建一个前后端交互的系统,下面借用github上的一个项目GEE Django进行演示。
以下都是在PyCharm中进行开发,而不是anaconda中

1.GEE Python Api安装

在本地进行GEE Python的安装,首先要安装GEE的Python库earthengine-api,打开命令行输入

pip install earthengine-api

安装Google的Python Api客户端

pip install google-api-python-client

安装鉴权验证依赖库

pip install pyCrypto

windows系统可能会遇到pyCrypto库无法进行安装的情况,可以执行以下命令,安装pyCrytodome库,两个库的功能是一样的

pip install pyCrytodome

打开编译器输入以下代码来进行身份验证:

import ee
#向GEE服务器进行身份验证
ee.Authenticate()
#初始化 API
ee.Initialize()

这时候可能会输出一个链接,点进去即可进行身份验证,选择自己的账号验证一下就可以了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
如果没有在输出行打印出链接,则可能是电脑没有安装gcloud导致的,可以去官网下载一下gcloud cli,以便获得本地的授权,不然是无法使用的。
下载完gcloud后,输入以下命令进行激活,输入完后会弹出一个页面,确认自己的身份和云端项目即可生成token,将生成的token粘贴到命令行里,即可完成本地的授权认证,我这里已经经过认证了,就不再展示验证后的页面。

earthengine authenticate --auth_mode=notebook

在这里插入图片描述
到这为止,GEE Python Api基本已经安装完成,可以打开一个空白文件输入以下代码进行验证是否安装成功:
在这里插入图片描述

import ee
import os
#以下为设置代理服务器,需要和你自己的电脑的代理服务地址一致
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:4780'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:4780'
# ee.Authenticate()
ee.Initialize()
#打印出数据信息
image = ee.Image('srtm90_v4')
print(image.getInfo())

在这里插入图片描述

2.Django框架安装

这部分内容csdn上好多博主都已经写过,这一步目前就跳过了。

3.GEE与Django的集成

以上已经安装好了GEE Python Api和Django框架,下面将会对两者进行集成,开篇提供了一个github项目–GEE Django的连接,下面会通过构建该项目来介绍如何使用。
首先构建一个Django项目,打开所要使用的文件夹,在命令行中输入:

django-admin startproject DjangoGEE 

构建Django项目之后,通过pycharm打开,在Terminal中输入以下命令,创建一个应用程序:

python manage.py startapp gee

创建完应用程序后,需要将其安装到系统中,打开setting.py文件,在以下代码中添加一行,这样系统就会知道我们添加了一个应用程序:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #添加下面一行
    'gee'
]

在创建的gee文件夹里,找到views.py文件,输入以下内容:

from django.shortcuts import render
# generic base view
from django.views.generic import TemplateView 

#folium
import folium
#gee
import ee
ee.Initialize()

#forntend
#home
class home(TemplateView):
    template_name = 'index.html'
    # Define a method for displaying Earth Engine image tiles on a folium map.
    def get_context_data(self, **kwargs):

        figure = folium.Figure()

        m = folium.Map(
            location=[28.5973518, 83.54495724],
            zoom_start=8,
        )
        m.add_to(figure)       

        dataset = ee.ImageCollection('MODIS/006/MOD13Q1').filter(ee.Filter.date('2019-07-01', '2019-11-30')).first()
        modisndvi = dataset.select('NDVI')
        visParams = {
    
    'min':0, 'max':3000, 'palette':['225ea8','41b6c4','a1dab4','034B48']}
        vis_paramsNDVI = {
    
    
            'min': 0,
            'max': 9000,
            'palette': [ 'FE8374', 'C0E5DE', '3A837C','034B48',]}

        map_id_dict = ee.Image(modisndvi).getMapId(vis_paramsNDVI)
        folium.raster_layers.TileLayer(
                    tiles = map_id_dict['tile_fetcher'].url_format,
                    attr = 'Google Earth Engine',
                    name = 'NDVI',
                    overlay = True,
                    control = True
                    ).add_to(m) 

        m.add_child(folium.LayerControl())
    
        figure.render()

        print('test')
        return {
    
    "map": figure}

新建一个template模板文件夹,并创建index.html作为展示的页面,并输入以下代码:
在这里插入图片描述

<html>

<head>

  <title>Django and GEE</title>

  {
   
   { map.header.render|safe }}

</head>

<body>

  <div class="row" style="height:1080px;width:1920px">
    <div class="col-lg-12">
      {
   
   {map.html.render|safe}}
    </div>
  </div>

  <script>

  {
      
      {
      
       map.script.render|safe }}
    
  </script>

</body>

到此为止,可能程序会报一些错误
在这里插入图片描述
他这里提示了需要运行:

python manage.py migrate

后面的错误可能是模板文件的错误,在setting.py文件里,将下面一行做一个更改:

TEMPLATES = [
    {
    
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #更改的是下面一行
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
    
    
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

到这为止,代码应该就可以顺利运行了,如果报一些超时的错误,则可能需要添加代理服务器,在views.py文件开头添加以下代码(上面有说过):

import os
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:4780'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:4780'

大功告成,输入python manage.py runserver 即可运行该系统,效果大概是以下这样:
在这里插入图片描述

最后说两句

因为国内能找到的资源很有限,本人也在查阅了很多资料后写下这篇博客,在这其中自己也踩了很多坑,也在博客中进行了阐述,避免大家跟我犯同样的错误,也欢迎大家跟我一起交流。
以下是一些参考文章:
Google Earth Engine(python)——为什么要学习 Django 而不是其他框架呢?
GEE官网教程

猜你喜欢

转载自blog.csdn.net/qq_51118386/article/details/129836225