之前两篇基本上搭好了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
看一下效果:

 

以上只是一个简单的测试练习,我会不定期更新(有疑问可以留言),大家一起学习

 
 


 

posted on 2018-04-28 16:30  远离人类,加入硅基  阅读(1776)  评论(0编辑  收藏  举报