Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bina aplikasi Web GIS berdasarkan Django

Bina aplikasi Web GIS berdasarkan Django

PHPz
PHPzasal
2023-06-17 13:12:031857semak imbas

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

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

cd webgis

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

python manage.py startapp gisapp

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

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

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

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})

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>

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

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

http://127.0.0.1:8000/map

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!

Kenyataan:
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