之前两篇基本上搭好了geodjango开发的环境了,当然你的电脑上肯定要有python和django的环境(这个我就不介绍了,网上一搜一大堆),我自己用的python3.5和django2.0(毕竟2.0都出来了,我也紧跟时代学学新版本)。
提醒一下:如果不熟悉django的话,要先看一下django的官方文档,可以走一遍他的投票教程(纯新手差不多需要一天吧)
下面说正事:
建立一个虚拟环境(将项目的库于其他项目分离,在其中安装自己的包)
python -m venv myshape_env
激活
source myshape_env/bin/activate
(激活成功后,命令行前端显示你的虚拟环境)
安装django:
pip install django
新建一个项目:
django-admin startproject geodjango
新建一个应用:
cd geodjango
python manage.py startapp world
配置项目geodjango下的setting.py
需要引入的应用(加入自己缺的)
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.gis',
'world',
]
数据库配置:(注释掉原来sqlite3的配置,添加和自己数据库符合的配置,以下是我的)
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE':'django.contrib.gis.db.backends.postgis',
'NAME': 'geodjango',
'USER': 'postgres',
'PASSWORD':'123',
'HOST':'localhost',
'PORT':'5432',
}
}
空间数据:http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
mkdir world/data
cd world/data
wget http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
unzip TM_WORLD_BORDERS-0.3.zip
cd ../..
以下是数据(感兴趣的同学可以自己查询不同格式数据的作用)
用ogrinfo来检测数据
1.ogrinfo world/data/TM_WORLD_BORDERS-0.3.shp
2.ogrinfo -so world/data/TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
定义空间数据模型:(模型字段和上面特征字段对应)
from django.contrib.gis.db import models
# Create your models here.
class WorldBorder(models.Model):
# Regular Django fields corresponding to the attributes in the
# world borders shapefile.
name = models.CharField(max_length=50)
area = models.IntegerField()
pop2005 = models.IntegerField('Population 2005')
fips = models.CharField('FIPS Code', max_length=2)
iso2 = models.CharField('2 Digit ISO', max_length=2)
iso3 = models.CharField('3 Digit ISO', max_length=3)
un = models.IntegerField('United Nations Code')
region = models.IntegerField('Region Code')
subregion = models.IntegerField('Sub-Region Code')
lon = models.FloatField()
lat = models.FloatField()
# GeoDjango-specific: a geometry field (MultiPolygonField)
mpoly = models.MultiPolygonField()
# Returns the string representation of the model.
def __str__(self): # __unicode__ on Python 2
return self.name
数据迁移:
python manage.py makemigrations
python manage.py migrate
可以在pgadmin3看到已经生成world_worldborder表
导入数据:在world应用下面新建一个load.py
import os
from django.contrib.gis.utils import LayerMapping
from .models import WorldBorder
# Create your views here.
world_mapping = {
'fips' : 'FIPS',
'iso2' : 'ISO2',
'iso3' : 'ISO3',
'un' : 'UN',
'name' : 'NAME',
'area' : 'AREA',
'pop2005' : 'POP2005',
'region' : 'REGION',
'subregion' : 'SUBREGION',
'lon' : 'LON',
'lat' : 'LAT',
'mpoly' : 'MULTIPOLYGON',
}
world_shp = os.path.abspath(
os.path.join(os.path.dirname(__file__), 'data', 'TM_WORLD_BORDERS-0.3.shp'),
)
def run(verbose=True):
lm = LayerMapping(
WorldBorder, world_shp, world_mapping,
transform=False, encoding='iso-8859-1',
)
lm.save(strict=True, verbose=verbose)
world_mapping字典中的每个键都对应于WorldBorder模型中的字段。值是加载数据的shapefile字段的名称。
执行:
python manage.py shell
>>> from world import load
>>> load.run()
后台管理空间数据:
在项目中admin.py注册模型
from django.contrib.gis import admin
from .models import WorldBorder
admin.site.register(WorldBorder, admin.GeoModelAdmin)
创建超级用户:
python manage.py createsuperuser
(需要输入用户名,密码)
python manage.py runserver
看一下效果:
以上只是一个简单的测试练习,我会不定期更新(有疑问可以留言),大家一起学习