zoukankan      html  css  js  c++  java
  • 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
    看一下效果:

     

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

     
     


     

  • 相关阅读:
    Catalan数,括号序列和栈
    NOIP2017 心路历程
    [Code Festival 2017 qual A] C: Palindromic Matrix
    HIVE 数据类型
    HADOOP-HIVE学习笔记(3)- Beeline
    HADOOP-HIVE学习笔记(2) CLI
    中信证券 指标公式 笔记
    【转】Python将列表数据写入文件(txt, csv,excel)
    Python中创建二维数组
    DevExpress 控件汉化方法
  • 原文地址:https://www.cnblogs.com/icat-510/p/8968514.html
Copyright © 2011-2022 走看看