当前位置: 首页 > 工具软件 > GeoDjango > 使用案例 >

geodjango项目笔记——保姆级教程

严锐
2023-12-01

1 项目简介

当前已经用django和apache搭建了一个sqlite3驱动的数据库展示及管理站点,用python3编写了一个桌面端应用程序。基于此,计划升级站点和桌面应用程序。
升级目标:
(1)站点和桌面端共用一个数据库,实现数据互通;
(2)添加地理信息服务功能。
实现目标存在的问题:
(1)原有数据库为sqlite3数据库,虽轻便同时亦可实现空间数据存储功能但无网络服务功能,难以实现站点和桌面端的数据同步;
(2)若要添加地理信息服务功能,需要实现空间数据展示及基本的空间分析功能。
解决方案:
(1)数据同步功能的实现,采用具有网络服务功能的数据库,把原sqlite3数据库数据迁移至新数据库。通过综合比较,最终决定采用postgresql数据库,原因是开源免费、功能齐全、对空间数据支持优秀,号称最先进的开源关系型数据库。
(2)django本身包含一个地理空间模块geodjango,支持对几何图形和光栅数据的编辑、查询、操作功能,可用于创建地理web应用程序。
(3)桌面端的空间编辑、查询、操作功能通过gdal模块实现。

2 搭建服务器

2.1 安装django

(1)django是python的一个模块,安装django之前要确定系统上安装了python,我用的是华为云服务器,centos7系统,自带了python3.6.8版本。linux系列系统都自带python,只需检查python版本即可。
查看python版本:

# python3
Python 3.6.8 

(2)安装django,安装正式版本django即可,通过pip安装。

python3 -m pip install django

查看安装的django版本:

>>>import django
>>>print(django.get_version())
3.2.12

我安装的是3.2.12版本。
(3)安装sqlite3.9以上版本,系统自带的3.7版本太低,会报错。通过官网下载源码安装最新版。

wget https://www.sqlite.org/2022/sqlite-autoconf-3390400.tar.gz
tar xzf sqlite-autoconf-3390400.tar.gz
cd sqlite-autoconf-3390400

到这一步之后不要急着./configure,需要手动增加编译项。此处不增加编译项并不会影响sqlite的安装和django项目的创建,但是会导致后续空间数据迁移时出错。

vim sqlite3.c
#define SQLITE_CORE 1                                                     
#define SQLITE_AMALGAMATION 1                                             
#ifndef SQLITE_PRIVATE                                                    
# define SQLITE_PRIVATE static                                            
#endif                                                                                                                                           
//新增编译项                                                                 
#define SQLITE_ENABLE_COLUMN_METADATA 1

完成对sqlite3.c文件的修改后即可进行安装操作。

./configure
make
make install
make clean

完成sqlite安装后,需添加环境变量,否则python无法找到新安装的sqlite。将/usr/local/lib添加至LD_LIBRARY_PATH:

vim etc/profile
export LD_LIBRARY_PATH=/usr/local/lib

(4)创建django项目和app:

cd /usr
python3 -m django startproject mysite
cd mysite
python3 manage.py startapp gisapp

(5)完成此步骤后,django相关内容暂告一段落,settings.py文件配置后续再做介绍。

2.2 安装apache

pass

2.3 配置服务器

pass

3 搭建数据库

3.1 安装postgresql

(1)postgresql推荐源码安装,centos7平台利用yum安装的postgresql-14实际上是postgresql9.2,与项目需要的其它库存在不兼容情况,在应用中会各种报错。本项目安装的是14.0版本,源码在官网下载。
下载14.0源码(我的所有软件安装在了/usr/local文件夹):

cd /usr/local
wget https://ftp.postgresql.org/pub/source/v14.0/postgresql-14.0.tar.gz

(2)解压并cd至解压好的文件夹:

tar xzf postgresql-14.0.tar.gz
cd postgresql-14.0

(3)编译安装源码(make clean并非必须的,作用是清除编译安装过程文件):

./configure
make
su
make install
make clean

(4)若安装过程失败提示缺少readline,安装readline-devel即可。

yum install readline-devel

(5)创建系统用户postgres,postgresql不能在root用户下操作,习惯性创建用户postgres,也可创建其它名字的用户。postgresql会自动创建一个同名数据库管理员账户和数据库。

adduser postgres

(6)创建data文件夹,并赋权限给postgres用户:

mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data

(7)切换到postgres用户,创建数据集簇:

su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

(8)开启数据库服务,创建第一个数据库testdb:

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
/usr/local/pgsql/bin/createdb testdb

(8-1)如果安装时没有配置日志文件,上面的命令开启数据库服务会失败,提示找不到日志文件,此时可以不指定日志文件开启服务,不会影响服务运行,但是没有日志(也可能是在系统日志的某个角落,我暂时没找到)。将上面指令替换成下面的:

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start

关闭服务指令:

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop

(9)安装完成后,可能需要配置一些系统变量,把下面代码运行一遍:

LD_LIBRARY_PATH=/usr/local/pgsql/lib
    export LD_LIBRARY_PATH
PATH=/usr/local/pgsql/bin:$PATH
    export PATH
/sbin/ldconfig /usr/local/pgsql/lib
MANPATH=/usr/local/pgsql/share/man:$MANPATH
    export MANPATH

或者把上述代码粘贴到/etc/profile文件末尾运行source .profile,可以一劳永逸:

source /etc/profile

(10)检查数据库是否能正常运行并修改管理员用户postgres密码为postgres,若不为用户设置密码将不能通过远程访问数据库:

/usr/local/pgsql/bin/psql testdb
testdb=> ALTER ROLE postgres WITH PSAAWORD 'postgres';

(11)若要数据库可以远程访问,还需要对postgresql.conf文件和pg_hba.conf文件进行设置。修改postgresql.conf文件:
listen_addresses = ‘*’,port = 5432
"*"表示允许所有IP访问,也可输入IP地址指定IP访问,port为端口号。
修改pg_hba.conf文件:
IPv4 local connections:
host all all 0.0.0.0/0 md5

0.0.0.0表示接受所有IP,md5表示md5加密,默认的trust表示不加密。
(12)到此为止,其实postgresql数据库已完成安装及配置,但若要支持空间数据并兼容geodjango空间数据库后端API还需要一些包的支持,这些包不是数据库必须的,而是项目必须的,放在后续章节说明。

3.2 安装空间库

本项目需要一系列的空间库支持,包括GEOS 、PROJ、GDAL、SFCGAL等,下面逐一介绍各库相互兼容的版本号和安装方法。
(1)安装cmake,gcc-c++,某些库不能用./configure,需要c++编译,因此首先需要安装cmake和gcc-c++。gcc-c++通过yum安装:

yum install gcc-c++

安装好gcc-c++库后,通过源码安装cmake。

wget https://github.com/Kitware/CMake/releases/download/v3.24.2/cmake-3.24.2.tar.gz
tar xzf cmake-3.24.2.tar.gz
./configure
make
make install
make clean

(2)安装GEOS库,选择安装3.10.3版本,其它版本不确定能够兼容。官网下载源码安装:

wget https://download.osgeo.org/geos/geos-3.10.3.tar.bz2
tar xvfj geos-3.10.3.tar.bz2
cd geos-3.10.3
mkdir _build
cd _build
# Set up the build
cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    ..
# Run the build, test, install
make
ctest
make install

(3)安装PROJ,PROJ是坑最多的库,初次安装时在这转了不少弯路。坑多并非proj难安装,而是不同版本会编译不同的libproj.so.xx文件。proj安装版本号又没有明确写明编译出的libproj.so版本号,第一次安装时装了好多版本才找到so.19版本。

wget https://download.osgeo.org/proj/proj-7.2.1.tar.gz
tar xzf proj-7.2.1.tar.gz
cd proj-7.2.1
./configure
make
make install
make clean
sudo ldconfig

若./configure失败提示找不到sqlite,添加PKG_CONFIG_PATH即可:

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

若./configure失败提示缺少libtiff-4,源码安装:

wget https://download.osgeo.org/libtiff/tiff-4.4.0.tar.gz
./configure
make
make install
make clean

若./configure失败提示缺少curl,源码安装:

wget https://curl.se/download/curl-7.85.0.tar.gz
tar xzf curl-7.85.0.tar.gz
./configure --without-ssl
make
make install
make clean

安装完成后,验证proj是否安装成功:

proj
Rel. 7.2.1, January 1st, 2021

(4)安装SFCGAL,安装之前需要先安装cgal、boost、mpfr、gmp。安装时需要注意版本对应关系。
安装gmp-6.1.2:

wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2
tar jxvf gmp-6.1.2.tar.bz2
cd gmp-6.1.2
./configure
make
make install
make clean

安装mpfr-4.0.2:

wget https://www.mpfr.org/mpfr-4.0.2/mpfr-4.0.2.tar.gz
tar xzf mpfr-4.0.2.tar.gz
cd mpfr-4.0.2
./configure
make
make install
make clean

安装boost-1.72.0:

wget https://boostorg.jfrog.io/artifactory/main/release/1.72.0/source/boost_1_72_0.tar.gz
tar xzf boost_1_72_0.tar.gz
cd boost_1_72_0
./bootstrap.sh
./b2

安装cgal-4.14:

wget https://github.com/CGAL/cgal/archive/refs/tags/releases/CGAL-4.14.tar.gz
tar xzf CGAL-4.14.tar.gz
cd cgal-releases-CGAL-4.14
cmake .
make
make install

安装SFCGAL-1.3.7:

wget https://gitlab.com/Oslandia/SFCGAL/-/archive/v1.3.8/SFCGAL-v1.3.7.tar.gz
tar xzf v1.3.7.tar.gz
cd SFCGAL-1.3.7
cmake -Wno-dev .
make
make install

若make时提示缺少CGAL文件,网上搜索相应文件下载上传至目标文件夹即可,至于为何会缺少 ,尚不可知。
(5)安装GDAL-3.2.0,安装时间较长,但只要前置依赖包正确安装基本就不会报错。源码安装:

wget https://github.com/OSGeo/gdal/releases/download/v3.2.0/gdal-3.2.0.tar.gz
tar xzf gdal-3.2.0.tar.gz
cd gdal-3.2.0
./configure
make
make install
sudo ldconfig

3.3 安装postgis

(1)安装依赖包libxml2-2.9.9:

wget https://gitlab.gnome.org/GNOME/libxml2/-/archive/v2.9.9/libxml2-v2.9.9.tar.gz
tar xzf libxml2-v2.9.9.tar.gz
cd libxml2-v2.9.9
./autogen.sh
make
make install

(2)安装依赖包protobuf-all-21.7:

wget https://github.com/protocolbuffers/protobuf/releases/download/v21.7/protobuf-all-21.7.tar.gz
tar xzf protobuf-all-21.7.tar.gz
cd protobuf-21.7
./configure
make
make install

(3)安装依赖包protobuf-c-1.4.1:

wget https://github.com/protobuf-c/protobuf-c/releases/download/v1.4.1/protobuf-c-1.4.1.tar.gz
tar xzf protobuf-c-1.4.1.tar.gz
cd protobuf-c-1.4.1
./configure
make
make install

(4)安装json-c-0.10,此包不是必须的,可以选择不安装:

wget https://s3.amazonaws.com/json-c_releases/releases/json-c-0.10.tar.gz
tar xzf json-c-0.10.tar.gz
cd json-c-0.10
./configure
make
make install

(5)安装postgis-3.3.0,依赖包正确安装后,直接源码安装即可:

wget https://download.osgeo.org/postgis/source/postgis-3.3.0.tar.gz
tar xzf postgis-3.3.0.tar.gz
cd postgis-3.3.0
./configure
make
make install

安装完成后,如果extensions没有复制到pgsql目录,有可能postgis是不能用的,需要参照以下指令再次安装:

cd /usr/local/postgis-3.3.0/extensions
cd postgis
make clean
make
export PGUSER=postgres
make install

添加路径至ld.so.conf:

vim /etc/ld.so.conf
#新增以下路径
/usr/local/lib64

验证postgis是否可用:

su postgres
psql -d testdb
testdb=> CREATE EXTENSION postgis;

成功会显示==“EXTENT POSTGIS”==。至此,所有准备工作已全部完成,接下来进行django项目空间后端的配置。

3.4 配置空间后端

(1)空间数据库后端主要通过settings.py文件进行设置。settings.py文件包含了项目的大部分基本设置,可以通过阅读官方文档详细了解如何通过settings.py设置项目参数。

cd /usr/mysite
vim settings.py
#INSTALLED_APPS项增加以下内容:
INSTALLED_APPS = [                                                                                                                                              
    'django.contrib.admin',                                               
    'django.contrib.auth',                                                
    'django.contrib.contenttypes',                                        
    'django.contrib.sessions',                                            
    'django.contrib.messages',                                            
    'django.contrib.staticfiles',                                         
    'django.contrib.gis',                                                 
    'gisapp.apps.GisappConfig',  #创建的app                                   
]        
#DATABASES修改参考:
DATABASES = {                                                             
    'default': {                                                          
        'ENGINE': 'django.contrib.gis.db.backends.postgis',               
        'HOST': '你的IP',                                          
        'USER': '你的数据库管理员用户名',                                               
        'PASSWORD': '你的密码',                                           
        'NAME': 'testdb',   #数据库名                                              
        'PORT': '5432',     #端口号                                              
    },                                                                    
}                                                               

(2)测试后端。在gisapp的models.py写入以下代码创建模型wordborder:

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, null=True)
    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):
        return self.name

运行makemigrations命令:

python3 manage.py makemigrations

不出意外的话,会出现缺少psycopg2模块的错误,因为我们还未安装此模块。安装此模块之前需要先安装python3-devel。

yum install python3-devel -y
python3 -m pip install psycopg2

安装完成之后再次运行makemigrations命令。
接下来进行数据迁移,migrate

python3 manage.py migrate

如无意外,postgresql数据库中会新建表gisapp_worldborder,数据迁移至数据库成功。项目后端已和数据库建立连接,后面可以用django数据库API对建立连接的数据库进行操作。
此章节结束后,就完成了项目所有准备工作,接下来进行项目后端核心工作,建立模型层。

4 模型层

5 视图层

 类似资料: