ubuntu16.04搭建geodjango+postgresql+postgis的WebGIS框架(三)加載空間數據


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

 

以上只是一個簡單的測試練習,我會不定期更新(有疑問可以留言),大家一起學習

 
 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM