Rumah > pembangunan bahagian belakang > Tutorial Python > Bina aplikasi Web GIS berdasarkan Django

Bina aplikasi Web GIS berdasarkan Django

PHPz
Lepaskan: 2023-06-17 13:12:03
asal
1877 orang telah melayarinya

Dengan perkembangan pesat Sistem Kedudukan Global (GPS) dan teknologi pengimejan satelit, Sistem Maklumat Geografi (GIS) telah menjadi bidang aplikasi yang penting. GIS tidak terhad kepada pengeluaran dan analisis peta, tetapi juga digunakan secara meluas dalam pengurusan alam sekitar, pengurusan tanah, perancangan bandar dan bidang lain. Pembangunan aplikasi Web GIS membolehkan pengguna membuat pertanyaan, menganalisis dan mengurus data GIS di mana-mana tempat, pada bila-bila masa dan melalui mana-mana peranti, yang mempunyai prospek aplikasi yang hebat.

Django ialah rangka kerja pembangunan web berdasarkan bahasa Python Ia menyediakan satu siri alatan dan teknologi pembangunan yang boleh membantu kami membina aplikasi web yang cekap. Artikel ini akan memperkenalkan cara menggunakan Django untuk membina aplikasi Web GIS yang mudah.

1. Persediaan persekitaran

Sebelum bermula, kita perlu memastikan bahawa persekitaran yang diperlukan berikut telah dipasang:

  1. Python 3.x
  2. Django
  3. GDAL

Antaranya, GDAL ialah perpustakaan pemprosesan data geografi yang biasa digunakan, kami akan menggunakannya untuk memproses data GIS.

2. Cipta projek Django baharu

Anda boleh mencipta projek Django baharu melalui arahan berikut:

django-admin startproject webgis
Salin selepas log masuk

Arahan ini mencipta projek Django bernama webgis. Kita boleh memasukkan direktori akar projek dengan arahan berikut:

cd webgis
Salin selepas log masuk

Seterusnya, kita boleh mencipta aplikasi bernama gisapp dengan arahan berikut:

python manage.py startapp gisapp
Salin selepas log masuk

Arahan ini mencipta aplikasi bernama gisapp Django aplikasi dan cipta subdirektori dengan nama yang sama dalam direktori projek.

3. Konfigurasikan projek Django

Kami perlu mengkonfigurasi GDAL dan aplikasi dalam fail tetapan.py projek:

# settings.py

# 导入GDAL库
from django.contrib.gis import gdal

# 数据库设置
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis', # 使用PostGIS数据库
        'NAME': 'webgis', # 数据库名称
        'USER': 'postgres', # 数据库用户名
        'PASSWORD': '****', # 数据库密码
        'HOST': '127.0.0.1', # 数据库地址
        'PORT': '5432', # 数据库端口
    }
}

# 应用设置
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'gisapp', # 加入我们的应用程序
]

# 时间区域设置
TIME_ZONE = 'Asia/Shanghai'

# GDAL设置
gdal.HAS_GDAL = True
gdal.HAS_SRS = True
Salin selepas log masuk

4 >

Kami perlu mencipta beberapa model ciri geografi dalam fail models.py aplikasi untuk menyimpan data ciri geografi dalam pangkalan data. Sebagai contoh, kita boleh mencipta model yang dipanggil "WorldBorder" untuk menyimpan maklumat sempadan negara di dunia. Berikut ialah takrifan model:

# models.py

from django.contrib.gis.db import models

class WorldBorder(models.Model):
    name = models.CharField(max_length=50)
    area = models.IntegerField(default=0)
    pop2005 = models.IntegerField(default=0)
    fips = models.CharField(max_length=2)
    iso2 = models.CharField(max_length=2)
    iso3 = models.CharField(max_length=3)
    un = models.IntegerField(default=0)
    region = models.IntegerField(default=0)
    subregion = models.IntegerField(default=0)
    lon = models.FloatField()
    lat = models.FloatField()
    mpoly = models.MultiPolygonField()

    def __str__(self):
        return self.name
Salin selepas log masuk

Dalam model ini, kami mentakrifkan beberapa medan untuk menyimpan maklumat asas negara/rantau (seperti nama, kawasan, penduduk, dll.), dan kami juga mentakrifkan medan jenis MultiPolygonField untuk menyimpan maklumat sempadan.

5. Cipta data ciri geografi

Kami perlu mencipta beberapa data ciri geografi untuk penyimpanan dalam pangkalan data. Kita boleh mengimport data ke dalam pangkalan data melalui arahan berikut:

ogr2ogr -f "PostgreSQL" PG:"dbname=webgis user=postgres host=127.0.0.1 password=**** port=5432" -nln worldborder -nlt MULTIPOLYGON -update -overwrite -lco GEOMETRY_NAME=mpoly -skipfailures ./world_borders.shp
Salin selepas log masuk

Perintah ini akan mengimport data dalam fail world_borders.shp ke dalam jadual bernama "worldborder".

6. Tulis fungsi paparan

Kami perlu menulis beberapa fungsi paparan dalam fail views.py aplikasi untuk membalas permintaan pengguna. Sebagai contoh, kita boleh menulis fungsi paparan bernama "peta" untuk memaparkan maklumat sempadan negara di seluruh dunia pada peta. Berikut ialah takrifan fungsi paparan:

# views.py

from django.shortcuts import render
from django.contrib.gis.geos import GEOSGeometry
from .models import WorldBorder

def map(request):
    # 获取所有国家/地区
    countries = WorldBorder.objects.all()

    # 构造GeoJSON格式数据
    geojson = {
        "type": "FeatureCollection",
        "features": []
    }
    for country in countries:
        feature = {
            "type": "Feature",
            "geometry": country.mpoly.geojson,
            "properties": {
                "name": country.name,
                "area": country.area,
                "pop2005": country.pop2005,
                "fips": country.fips,
                "iso2": country.iso2,
                "iso3": country.iso3,
                "un": country.un,
                "region": country.region,
                "subregion": country.subregion
            }
        }
        geojson["features"].append(feature)

    # 返回地图页面
    return render(request, 'map.html', {'geojson': geojson})
Salin selepas log masuk

Fungsi ini mula-mula mendapat maklumat semua negara/rantau dan kemudian menukarnya kepada data format GeoJSON. Akhir sekali, data dihantar ke templat bernama "map.html" untuk paparan.

7. Menulis templat

Kita perlu mencipta templat bernama "map.html" dalam direktori templat aplikasi untuk memaparkan peta dan data. Berikut ialah definisi templat:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Web GIS Application</title>
    <style>
        #map {
            width: 100%;
            height: 100%;
            position: absolute;
            top: 0;
            left: 0;
            z-index: -1;
        }
    </style>
    <script src="{% static 'leaflet/leaflet.js' %}"></script>
    <link rel="stylesheet" href="{% static 'leaflet/leaflet.css' %}"/>
</head>
<body>
<div id="map"></div>
<script>
    // 初始化地图
    var map = L.map('map').setView([39.9, 116.4], 3);

    // 添加图层
    var geojson = {{ geojson | safe }};
    var countries = L.geoJSON(geojson, {
        onEachFeature: function (feature, layer) {
            layer.bindPopup(feature.properties.name);
        }
    }).addTo(map);

    // 添加控件
    L.control.scale().addTo(map);

    // 添加底图
    var osm = L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
        attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors'
    });
    osm.addTo(map);
</script>
</body>
</html>
Salin selepas log masuk

Templat ini menggunakan perpustakaan peta JavaScript yang dipanggil "Risalah".

8. Jalankan aplikasi

Kita boleh melaksanakan arahan berikut pada baris arahan untuk memulakan pelayan Django:

python manage.py runserver
Salin selepas log masuk

Kemudian, lawati alamat berikut untuk membukanya pelayar Lihat Aplikasi GIS Web:

http://127.0.0.1:8000/map
Salin selepas log masuk
Ringkasan

Artikel ini menerangkan cara membina aplikasi GIS Web mudah menggunakan Django dan GDAL. Dengan menggunakan alat dan teknik ini, kami boleh membangunkan aplikasi web yang cekap dengan mudah untuk memaparkan dan menganalisis data geografi. Selain itu, kami boleh menggunakan perpustakaan peta lain dan sumber data GIS untuk melanjutkan dan mengoptimumkan aplikasi kami.

Atas ialah kandungan terperinci Bina aplikasi Web GIS berdasarkan Django. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan