随着全球定位系统(GPS)和卫星影像技术的飞速发展,地理信息系统(GIS)已经成为了一个重要的应用领域。GIS不仅限于地图制作和分析,也被广泛应用于环境管理、土地管理、城市规划等领域。而Web GIS应用程序的开发,可以使得用户在任何地点、任何时间、通过任何设备进行GIS数据的查询、分析和管理,具有极大的应用前景。
Django是一个基于Python语言的Web开发框架,它提供了一系列的开发工具和技术,可以帮助我们快速建立高效的Web应用程序。本文将介绍如何使用Django建立一个简单的Web GIS应用程序。
一、环境准备
在开始前,我们需要确保已经安装好以下必备环境:
- Python 3.x
- Django
- GDAL
其中,GDAL是一个常用的地理数据处理库,我们将使用它来处理GIS数据。
二、新建Django项目
通过以下命令可以创建一个新的Django项目:
django-admin startproject webgis
这条命令创建了一个名为webgis的Django项目。我们可以通过以下命令进入该项目的根目录:
cd webgis
接着,我们可以通过以下命令创建一个名为gisapp的应用程序:
python manage.py startapp gisapp
这个命令创建了一个名为gisapp的Django应用程序,并在项目目录下创建了一个与之同名的子目录。
三、配置Django项目
我们需要在项目的settings.py文件中配置GDAL和应用程序:
# 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四、创建地理要素模型
我们需要在应用程序的models.py文件中创建一些地理要素模型,以便在数据库中存储地理要素数据。比如,我们可以创建一个名为“WorldBorder”的模型,用于存储世界各国的边界信息。以下是该模型的定义:
# 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在该模型中,我们定义了一些字段来存储国家/地区的基本信息(如名称、面积、人口等),同时我们还定义了一个MultiPolygonField类型的字段来存储边界信息。
五、创建地理要素数据
我们需要创建一些地理要素数据,以便在数据库中进行存储。我们可以通过以下命令将数据导入数据库:
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
该命令将world_borders.shp文件中的数据导入到名为“worldborder”的表中。
六、编写视图函数
我们需要在应用程序的views.py文件中编写一些视图函数,以便响应用户的请求。比如,我们可以编写一个名为“map”的视图函数,用于在地图上显示世界各国的边界信息。以下是该视图函数的定义:
# 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})该函数首先获取所有国家/地区的信息,然后将它们转换为GeoJSON格式的数据。最后,将数据传递到名为“map.html”的模板中进行展示。
七、编写模板
我们需要在应用程序的templates目录下创建一个名为“map.html”的模板,用于展示地图和数据。以下是该模板的定义:
<!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>该模板使用了一个名为“Leaflet”的JavaScript地图库。
八、运行应用程序
我们可以在命令行中执行以下命令,启动Django服务器:
python manage.py runserver
接着,访问以下地址,即可在浏览器中查看Web GIS应用程序:
http://127.0.0.1:8000/map
总结
本文介绍了如何使用Django和GDAL建立一个简单的Web GIS应用程序。通过使用这些工具和技术,我们可以轻松地开发高效的Web应用程序,并在其中展示和分析地理数据。此外,我们还可以使用其他地图库和GIS数据源来进一步扩展和优化我们的应用程序。
