当前已经用django和apache搭建了一个sqlite3驱动的数据库展示及管理站点,用python3编写了一个桌面端应用程序。基于此,计划升级站点和桌面应用程序。
升级目标:
(1)站点和桌面端共用一个数据库,实现数据互通;
(2)添加地理信息服务功能。
实现目标存在的问题:
(1)原有数据库为sqlite3数据库,虽轻便同时亦可实现空间数据存储功能但无网络服务功能,难以实现站点和桌面端的数据同步;
(2)若要添加地理信息服务功能,需要实现空间数据展示及基本的空间分析功能。
解决方案:
(1)数据同步功能的实现,采用具有网络服务功能的数据库,把原sqlite3数据库数据迁移至新数据库。通过综合比较,最终决定采用postgresql数据库,原因是开源免费、功能齐全、对空间数据支持优秀,号称最先进的开源关系型数据库。
(2)django本身包含一个地理空间模块geodjango,支持对几何图形和光栅数据的编辑、查询、操作功能,可用于创建地理web应用程序。
(3)桌面端的空间编辑、查询、操作功能通过gdal模块实现。
(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文件配置后续再做介绍。
pass
pass
(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还需要一些包的支持,这些包不是数据库必须的,而是项目必须的,放在后续章节说明。
本项目需要一系列的空间库支持,包括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
(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项目空间后端的配置。
(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对建立连接的数据库进行操作。
此章节结束后,就完成了项目所有准备工作,接下来进行项目后端核心工作,建立模型层。