在PostgreSQL16.4环境安装postgis3.5

PostGIS 是一个 Postgres 扩展,增加了对存储和操作空间数据类型的支持。
当我们构建在地图上存储、操作和可视化数据的软件应用程序时,通常需要使用空间数据存储。
本次项目也需要使用空间数据,因此尝试在PostgreSQL16.4环境安装postgis3.5。

准备工作

postgresql下载地址:

https://www.postgresql.org/download/

postgis下载地址:

https://postgis.net/development/source_code/

主机OS为centos7.9,将下载好的包上传至/app/database目录下。

修改主机名,多个节点的话配好映射。

创建用户和组
建议非root用户管理,因此创建postgres用户:

useradd postgres
passwd postgres

配好yum源后安装依赖包:

yum groupinstall -y "Development Tools" "Legacy UNIX Compatibility"
yum install -y bison flex readline* zlib-devel gcc* gmake

创建目录并授权
一个是软件安装目录,一个是数据目录,
可以类比mysql的basedir和datadir;

mkdir -p /usr/local/pg16
mkdir -p /data/pg16
chown -R postgres. /usr/local/pg16
chown -R postgres. /data/pg16
chmod 700 -R /data/pg16

操作系统参数优化:

vim /etc/sysctl.conf 

kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

按配置进行相应调整。

生效配置:

sysctl -p

限制参数:

vim /etc/security/limits.conf

* soft   nofile    131072
* hard   nofile    131072
* soft   nproc    131072
* hard   nproc    131072
* soft   stack    unlimited
* hard   stack   unlimited
* hard   memlock    50000000
* soft   memlock    50000000

建议关闭numa,设置IO策略为deadline(机械)或者noop(SSD):

测试机numa本身未开启,如需关闭需要编辑/etc/default/grub,在GRUB_CMDLINE_LINUX一栏添加numa=off;

查看IO策略,此处以xvda为例:

cat /sys/block/xvda/queue/scheduler

显示为deadline或noop都可以(算法不同,noop更倾向于饿死读而优先写,适合SSD)。避免使用cfq。

echo noop > /sys/block/xvda/queue/scheduler

这种方式重启后会失效,如果想持久化则需要将命令放在/etc/rc.local中,或者直接修改grub:

vim /etc/default/grub

在GRUB_CMDLINE_LINUX一栏添加elevator=noop,再重新生成grub2.cfg配置文件,或者:

grubby --update-kernel=ALL --args="elevator=noop"

重启生效。

源码安装postgresql16.4

cd /app/database
tar -xf postgresql-16.4.tar.gz

然后授权给postgres用户,切换到postgres用户

cd postgresql-16.4

./configure --help查看可定制的参数,其中打印的结果中–with类的都是打开一些功能,此外还有–without,–disable等,具体参考官网;
此处指定安装目录和端口,不指定的话默认端口是5432;这些参数后面初始化也可以指定

./configure --prefix=/usr/local/pg16 --with-python --with-perl --enable-nls --with-readline

这步结果会显示缺失的依赖,我这里还需要额外安装:

yum install libicu-devel -y
yum install perl-ExtUtils-Embed -y
yum install python3 python3-devel -y

安装完成后重新configure。

编译全部可用功能:

gmake world

把所有编译好的进行安装(本质其实就是建目录+拷贝):

gmake install -world

配置postgres用户的环境变量:

cd ~
vim .bash_profile

export PGDATA=/data/pg16
export LANG=en_US.utf8
export PGHOME=/usr/local/pg16
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
export PGUSER=postgres

source .bash_profile

检查版本

psql --version

如果正常显示说明环境变量配置成功。

初始化数据、启动及基本配置

简易初始化(创建实例),在postgres用户下执行:

initdb -D /data/pg16 -w

生产环境建议:

initdb -A md5 -D $PGDATA -E utf8 --locale=C -W

-A 是加密方式
-D 是数据目录
-E 是字符集 (默认即utf8)
执行之后会提示输入密码。

可以按照初始化打印的结果来启动,完整命令:

pg_ctl -D /data/pg16/ -l logfile start

如果配了环境变量也可以直接pg_ctl start来启动,因为pgdata能识别到;

重启:pg_ctl restart
关闭:pg_ctl stop

通过pg_ctl --help可以查看完整的选项,
其中关闭和重启选项中的shutdown modes包括smart、fast、immediate;
smart是最安全的关闭方法,等待所有客户端连接关闭之后才关闭;
fast是用的生产中最多的,自动杀掉连接,回滚未完成事务;
immediate相当于kill -9;
对应的语句:

pg_ctl -D /data/pg16/  stop -ms
pg_ctl -D /data/pg16/  stop -mf
pg_ctl -D /data/pg16/  stop -mi

此外启动数据库还可以通过脚本启动,需要切换回root用户执行(使用此脚本需要修改脚本中prefix、PGDATA等内容。)

/opt/postgresql-16.4/contrib/start-scripts/linux

远程连接还需配置实例级别的访问控制:

cd $PGDATA
vim pg_hba.conf

host DBname username 10.10.10.0/24 md5
host    all             all             0.0.0.0/0               md5

md5的未知写reject就不允许这一条登录;
如果两条有重叠,则按从上到下顺序读取,一旦一条生效,后面的则不会读到。

此外由于默认只监听本地,还需要配置linstener才能监听到,以全部监听为例:

vim postgresql.conf
listen_addresses = '0.0.0.0'

重启实例后生效:

pg_ctl restart -mf

用超管postgres以TCP/IP方式登录验证:

psql -d postgres -h 10.5.208.28 -p 5432 -U postgres

源码安装postgis3.5

解压:

tar -xf postgis-3.5.0.tar.gz

configure:

cd postgis-3.5.0
./configure

可能会出现各种问题。
gis依赖项比较多,官网描述如下:

  • PostgreSQL 12 - 17. A complete installation of PostgreSQL (including server headers) is required. PostgreSQL is available from https://www.postgresql.org .
    For a full PostgreSQL / PostGIS support matrix and PostGIS/GEOS support matrix refer to https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS
  • GNU C compiler (gcc). Some other ANSI C compilers can be used to compile PostGIS, but we find far fewer problems when compiling with gcc.
  • GNU Make (gmake or make). For many systems, GNU make is the default version of make. Check the version by invoking make -v. Other versions of make may not process the PostGIS Makefile properly.
  • Proj reprojection library. Proj 6.1 or above is required. The Proj library is used to provide coordinate reprojection support within PostGIS. Proj is available for download from https://proj.org/ .
  • GEOS geometry library, version 3.8.0 or greater, but GEOS 3.12+ is required to take full advantage of all the new functions and features. GEOS is available for download from https://libgeos.org .
  • LibXML2, version 2.5.x or higher. LibXML2 is currently used in some imports functions (ST_GeomFromGML and ST_GeomFromKML). LibXML2 is available for download from https://gitlab.gnome.org/GNOME/libxml2/-/releases.
  • JSON-C, version 0.9 or higher. JSON-C is currently used to import GeoJSON via the function ST_GeomFromGeoJson. JSON-C is available for download from https://github.com/json-c/json-c/releases/.
  • GDAL, version 3+ is preferred. This is required for raster support. https://gdal.org/download.html.
  • If compiling with PostgreSQL+JIT, LLVM version >=6 is required https://trac.osgeo.org/postgis/ticket/4125.

之前用yum安装:

yum install geos* -y
yum install proj* -y
yum install protobuf-c* -y
...

发现版本不对,下面一一处理。

proj

rpm -qa |grep proj

使用rpm -e --nodeps 选出其中proj相关的低版本包卸载掉。
然后我们去官网下6.1版本以上的。

https://proj.org/en/9.4/download.html

我们这里下载7.2.1版本。
proj-7.2.1依赖sqlite3>=3.11版本
因此我们下载:

https://www.sqlite.org/download.html

选择源码包,本次使用的是sqlite-autoconf-3470000.tar.gz
上传、解压后配置安装目录,编译安装

./configure --prefix=/usr/local
make
make install

配置环境变量:

find / -name "pkgconfig" -print
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH

可将此环境变量写入/etc/profile
sqlite安装完成,然后安装如下依赖:

yum -y install libxslt pkg-devel
yum install libtiff-devel -y
yum install curl-devel -y

然后正式安装。
解压proj,进入解压目录

tar -xf proj-7.2.1.tar.gz
cd proj-7.2.1

生成配置、构建

./configure --prefix=/usr/local/pg16/plugin/proj
make
make install

修改ld.so.conf

echo "/usr/local/pg16/plugin/proj/lib" >> /etc/ld.so.conf
ldconfig

geos

遇到报错:

error: PostGIS requires GEOS >= 3.8.0

需要升级GEOS,先把原版本卸载:

rpm -qa |grep geos
yum remove geos* -y 
rpm -qa |grep geos

如果不卸载,后续虽然编译安装能成功,但加载扩展插件时会报undefined symbol: GEOSVoronoiDiagram的错误。

然后进入官网下载,本次使用3.8:

https://libgeos.org/usage/download/

上传服务器后解压、使用autoconf工具 用configure.ac 文件生成 configure 脚本:

tar -xf geos-3.8.4.tar.bz2
cd geos-3.8.4
autoconf

如果出现error: possibly undefined macro的报错,则运行:

autoreconf --install

然后删除,重新生成configure脚本。

生成configure 脚本后,生成配置、构建

./configure  --prefix=/usr/local/pg16/plugin/geos
make
make install

修改ld.so.conf

echo "/usr/local/pg16/plugin/geos/lib" >> /etc/ld.so.conf
ldconfig

如果不进行此步骤,后续加载扩展插件时会报找不到共享对象文件的错误,
其他依赖同理。

gdal

官网下载地址:

https://gdal.org/en/latest/download_past.html#download-past

要求使用3版本以上,本次使用3.2.3
上传、解压、配置、编译安装:

cd gdal-3.2.3/
./configure --prefix=/usr/local/pg16/plugin/gdal  --with-proj=/usr/local/pg16/plugin/proj
make
make install

修改ld.so.conf

echo "/usr/local/pg16/plugin/gdal/lib" >> /etc/ld.so.conf
ldconfig

protobuf和protobuf-c

protobuf和protobuf-c互为依赖。
要先安装protobuf2.6.1以上的版本后,才能正常编译出protobuf-c的bin、lib等
要求protobuf-c>=1.1.0版本。

检查已安装版本:

rpm -qa |grep protobuf

使用rpm -e --nodeps卸载即可。

下载地址:

https://github.com/protobuf-c/protobuf-c/tags
https://github.com/protocolbuffers/protobuf/tags

这里我们选择protobuf-3.20.3.tar.gz和protobuf-c-1.4.1.tar.gz
上传解压后,先安装protobuf
进入解压后的目录执行:

./autogen.sh
./configure --prefix=/usr/local/protobuf
make
make install 

配环境变量:

echo '/usr/local/protobuf/lib/' >> /etc/ld.so.conf
ldconfig
echo 'export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/' >> /etc/profile
echo 'export PROTOBUF=/usr/local/protobuf' >> /etc/profile
source /etc/profile

再安装protobuf-c

./autogen.sh
./configure --prefix=/usr/local/protobuf-c/
make
make install

配环境变量:

echo "/usr/local/protobuf-c/lib/" >> /etc/ld.so.conf
ldconfig
echo 'export PATH=$CMAKE_HOME/bin:$PROTOBUF_HOME/bin:$PATH:/usr/local/protobuf-c/bin' >> /etc/profile
echo 'export PATH=$CMAKE_HOME/bin:$PROTOBUF_HOME/bin:$PATH:/usr/local/protobuf-c/bin:/usr/local/gadl/bin' >> /etc/profile
source /etc/profile

再次configure可能会出现如下报错,则需要按照下文编译安装指定参数:

configure: error: unable to find protobuf-c/protobuf-c.h using CPPFLAGS. You can disable MVT and Geobuf support using --without-protobuf

json-c和libxml

要求0.9版本及以上,我们使用0.13.1
下载:

https://github.com/json-c/json-c/archive/json-c-0.13.1-20180305.tar.gz

编译安装:

cd json-c-json-c-0.13.1-20180305
./configure --prefix=/usr/local/json-c/
make
make install

修改ld.so.conf

echo "/usr/local/json-c/lib/" >> /etc/ld.so.conf
ldconfig

安装libxml:

yum install libxml2-devel -y

sfcgal

在官方news中发现pg>9.6并且GEOS>3.6中,已经将postgis_sfcgal(三维)与postgis分离。
CGAL、SFCGAL如需要安装请参考:

http://www.icodebang.cn/article/413818
https://zhuanlan.zhihu.com/p/143690286

sfcgal需要cmkae编译,需先安装下cmake
下载地址:

https://github.com/Kitware/CMake/releases/tag/v3.16.9

cmake需要安装openssl-devel

yum install openssl-devel -y

我们下载CMake-3.16.9.tar.gz,上传,解压,然后源码安装:

cd CMake-3.16.9
./configure --prefix=/usr/local/cmake
make 
make install

配环境变量,在/etc/profile添加:

export CMAKE_HOME=/usr/local/cmake
export PATH=$GCC_HOME/bin:$CMAKE_HOME/bin:$PROTOBUF_HOME/bin:$PROTOBUFC_HOME/bin:$PATH

之后source生效。

sfcgal依赖boost,cgal,需要提前编译,编译默认目录,避免编译sfcgal时各种找不到库的问题。
安装boost

yum install boost-devel -y

CGAL下载地址:

https://github.com/CGAL/cgal/tags

本次使用cgal-4.14.3.tar.gz
上传解压后编译安装:

cd cgal-4.14.3
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/cgal
make
make install 

修改ld.so.conf

echo "/usr/local/cgal/lib/" >> /etc/ld.so.conf
ldconfig

SFCGAL下载地址:

https://github.com/Oslandia/SFCGAL/archive/

本次使用v1.3.8.tar.gz
上传解压后编译安装:

cd SFCGAL-1.3.8 
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/sfcgal
make -j 4    
make install   

修改ld.so.conf:

echo "/usr/local/sfcgal/lib64" >> /etc/ld.so.conf
ldconfig

正式安装PostGIS

cd postgis-3.5.0

./configure --prefix=/usr/local/pg16/plugin/postgis --with-pgconfig=/usr/local/pg16/bin/pg_config --with-geosconfig=/usr/local/pg16/plugin/geos/bin/geos-config --with-projdir=/usr/local/pg16/plugin/proj --with-gdalconfig=/usr/local/pg16/plugin/gdal/bin/gdal-config --with-protobufdir=/usr/local/protobuf-c --with-jsondir=/usr/local/json-c --with-sfcgal=/usr/local/sfcgal/bin/sfcgal-config

make 
make install

参考:

https://blog.csdn.net/weixin_44011559/article/details/136856670
https://blog.csdn.net/alwaysbefine/article/details/142470815
https://blog.csdn.net/ws972361669/article/details/129286157
https://www.modb.pro/db/1684329321233195008

加载扩展插件

进入数据库客户端执行:

SELECT name, default_version,installed_version FROM pg_available_extensions WHERE name LIKE 'postgis%' or name LIKE 'address%';

显示可用扩展结果为:

             name             | default_version | installed_version
------------------------------+-----------------+-------------------
 postgis                      | 3.5.0           |
 postgis_tiger_geocoder       | 3.5.0           |
 postgis_raster               | 3.5.0           |
 postgis_topology             | 3.5.0           |
 postgis_sfcgal               | 3.5.0           |
 address_standardizer         | 3.5.0           |
 address_standardizer_data_us | 3.5.0           |
(7 rows)

查看是否已安装:

\dx postgis*

现在尚未加载,需要我们进行加载安装:

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION postgis_sfcgal;

其中postgis_tiger_geocoder会报错:

ERROR:  required extension "fuzzystrmatch" is not installed

我们进入软件目录进行安装:

cd /app/database/postgresql-16.4/contrib/fuzzystrmatch
make
make install

然后加载:

CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;

查看版本详细信息:

SELECT postgis_full_version();

如果需要卸载extension,可以使用以下命令:

DROP EXTENSION postgis;

至此PostGIS 3.5已安装完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容