Linux(CentOS)編譯安裝GDAL3.0.4+Postgresql 12.2+Postgis-3.0.1


    有需要GDAL開發的同學,在linux服務器上,最好還是自己編譯環境,初次編譯是很痛苦,但是在此過程中,對插件之間的版本依賴關系,插件編譯配置、問題定位,解決問題,shell腳本都能夠全面的提升。最后還能得到一個最新版的環境,何樂而不為了!!!

一、環境准備

1、環境要求

Centos系統可以訪問外網。

Centos系統版本:CentOS Linux release 7.3.1611 (Core)

需要安裝的軟件如下:

apache-ant-1.10.12-bin.tar.gz
cgal-4.14.tar.xz
cmake-3.20.6.tar.gz
gdal-3.0.4.tar.gz
geos-3.8.0.tar.bz2
gmp-6.1.2.tar.bz2
json-c-json-c-0.13.1-20180305.tar.gz
libxml2-2.9.10.tar.gz
mpfr-4.0.2.tar.gz
pcre-8.44.tar.gz
postgis-3.0.1.tar.gz
postgresql-12.2.tar.gz
proj-6.3.1.tar.gz
protobuf-c-1.3.3.tar.gz
protobuf-cpp-3.11.4.tar.gz
SFCGAL-1.3.7.tar.gz
sqlite-autoconf-3360000.tar.gz
swig-4.0.1.tar.gz

2、環境安裝

先通過yum基礎插件

yum -y install gcc gcc-c++ gcc-g77 make libtool flex bison autoconf automake bzip2-devel zlib-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel openssl-devel libxml2-devel gettext-devel pcre-devel

二、編譯Postgresql-12.2

以下所有安裝源文件放置均放在/usr/local/src/

1、安裝postgresql數據庫

#用戶組
groupadd postgres
#用戶組添加用戶
useradd -g postgres postgres


mkdir -p /usr/local/pgsql
mkdir /usr/local/pgsql/data
chown -R postgres:postgres /usr/local/pgsql

cd /usr/local/src/
wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz
tar -xzvf postgresql-12.2.tar.gz
cd postgresql-12.2
./configure --prefix=/usr/local/pgsql --without-readline
make && make install

./configure --prefix=/usr/local/pgsql --without-readline,效果:

image

make 效果:

image

make install 效果:

image

2、添加環境變量

vi打開配置文件后,按i插入,ESC退出編譯,:wq保存,:q!不保存,以后每次保存后要刷新環境變量:source /etc/profile

vi /etc/profile
PG_HOME=/usr/local/pgsql

LD_LIBRARY_PATH=$PG_HOME/lib:$LD_LIBRARY_PATH
PATH=$PG_HOME/bin:$PATH

PKG_CONFIG_PATH=$PG_HOME/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH LD_LIBRARY_PATH

source /etc/profile

查看Postgresql版本命令

pg_config --version

image

3、初始化數據庫

#切換用戶
su postgres

#初始化數據庫
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
image

4、設置遠程可訪問數據庫

#切換root
exit

vi /usr/local/pgsql/data/postgresql.conf
listen_address = '*'
port = 5432
vi /usr/local/pgsql/data/pg_hba.conf
host     all             all       0.0.0.0/0                      md5
host     all             all       192.168.1.0/24                 md5
host     all             all       ::1/128                        ident

5、數據庫服務

#切換用戶
su postgres

#啟動數據庫服務器
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

image

#創建數據庫
/usr/local/pgsql/bin/createdb gisdb

#停止數據庫服務
/usr/local/pgsql/bin/pg_ctl stop -D /usr/local/pgsql/data
#重新啟動數據庫
/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data

到這里,數據庫已經安裝成功了,使用navicat或dbeaver連接試試吧!

操作命令說明

pg_ctl stop -D /usr/local/pgsql/data/
pg_ctl start -D /usr/local/pgsql/data/
pg_ctl restart -D /usr/local/pgsql/data/

6、設置Postgresql自啟動

/usr/lib/systemd/system 新建postgresql.service文件,復制以下內容到postgresql.service

[Unit]
Description=PostgreSQL database server
After=network.target
 
[Service]
Type=forking
 
User=postgres
Group=postgres
 
# Port number for server to listen on
Environment=PGPORT=5432
 
# Location of database directory
Environment=PGDATA=/usr/local/pgsql/data
 
# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog
 
# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000
 
#ExecStartPre=/usr/local/pgsql/bin/postgresql-check-db-dir ${PGDATA}
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s
 
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
 
[Install]
WantedBy=multi-user.target
su root
cd /usr/lib/systemd/system
chmod 754 postgresql.service
systemctl enable postgresql.service

7、其它一些操作命令說明

啟動,停止,重啟

systemctl  start  postgresql.service 
systemctl  stop  postgresql.service
systemctl  restart   postgresql.service

修改數據庫密碼

su - postgres
psql -U postgres
ALTER USER postgres WITH PASSWORD '123456'
\q

三、編譯GDAL依賴

CentOs7安裝unzip

yum install -y unzip zip

1、安裝 sqlite3

wget https://www.sqlite.org/2020/sqlite-autoconf-3360000.tar.gz tar –zxvf sqlite-autoconf-3360000.tar.gz cd sqlite-autoconf-3360000 bash ./configure --prefix=/usr/local/pgsql/plugin/sqlite3 make && make install

#軟連接到/usr/bin目錄

ln -s /usr/local/pgsql/plugin/sqlite3/bin/sqlite3 /usr/bin/sqlite3 echo "/usr/local/pgsql/plugin/sqlite3/lib" > /etc/ld.so.conf.d/sqlite3.conf ldconfig

#查看版本號

sqlite3 -version

bash ./configure --prefix=/usr/local/pgsql/plugin/sqlite3 命令結果:

image

make 命令結果:

image

make install 命令結果:

image

2、安裝 json-c-0.13.1

wget https://github.com/json-c/json-c/archive/json-c-0.13.1-20180305.tar.gz
tar -xzvf  json-c-0.13.1-20180305.tar.gz
cd json-c-json-c-0.13.1-20180305
bash ./configure --prefix=/usr/local/pgsql/plugin/json-c
make && make install
echo "/usr/local/pgsql/plugin/json-c/lib" > /etc/ld.so.conf.d/json-c-0.13.1.conf
ldconfig

bash ./configure --prefix=/usr/local/pgsql/plugin/json-c,命令效果:

image

make 命令效果:

image

make install 命令效果:

image

3、編譯 protobuf-3.11.4,protobuf-c 1.3.3

  • 編譯protobuf-3.11.4

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-cpp-3.11.4.tar.gz
tar -xzvf  protobuf-cpp-3.11.4.tar.gz
cd protobuf-3.11.4
bash ./configure
make && make install

bash ./configure 命令效果:

image

make 命令效果:

image

make install 命令效果:

image

  • 編譯protobuf-c 1.3.3

wget https://github.com/protobuf-c/protobuf-c/releases/download/v1.3.3/protobuf-c-1.3.3.tar.gz
tar -xzvf  protobuf-c-1.3.3.tar.gz
cd protobuf-c-1.3.3
bash ./configure
make && make install

bash ./configure 報錯:

image

vi /etc/profile 添加配置

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

source /etc/profile 配置生效。

.configure 命令正常效果:

image

make 命令效果:

image

make install 命令效果:

image

4、安裝Proj 6.3.1

wget https://download.osgeo.org/proj/proj-6.3.1.tar.gz
tar -xf proj-6.3.1.tar.gz
cd proj-6.3.1
./configure --prefix=/usr/local/pgsql/plugin/proj
make && make install
echo "/usr/local/pgsql/plugin/proj/lib" > /etc/ld.so.conf.d/proj-6.3.1.conf
ldconfig

./configure --prefix=/usr/local/pgsql/plugin/proj 命令報錯,提示sqlite3版本太低,必須大於等於3.11,當前版本為3.7.17

image

解決方法:升級sqlite版本。如果再出現以下提示,應該是在安裝sqlite3時指定了安裝目錄,個別命令沒有安裝全面。

image

重新安裝sqlite3

wget https://www.sqlite.org/2020/sqlite-autoconf-3360000.tar.gz
tar –zxvf sqlite-autoconf-3360000.tar.gz
cd sqlite-autoconf-3360000
./configure --prefix=/usr/local/pgsql/plugin/sqlite3
make && make install

#查看版本號
sqlite3 -version

進入 /usr/local/src/proj-6.3.1目錄, ./configure --prefix=/usr/local/pgsql/plugin/proj 命令正常效果:

image

make 命令效果:

image

make install 命令效果:

image

5、安裝GEOS 3.8.0

wget http://download.osgeo.org/geos/geos-3.8.0.tar.bz2
tar -jxf geos-3.8.0.tar.bz2
cd geos-3.8.0
./configure --prefix=/usr/local/pgsql/plugin/geos
make && make install
echo "/usr/local/pgsql/plugin/geos/lib" > /etc/ld.so.conf.d/geos-3.8.0.conf
ldconfig

在解壓 *.tar.bz2文件時報錯如下,解決方法:yum -y install bzip2

image

./configure --prefix=/usr/local/pgsql/plugin/geos 命令效果:

image

make 命令效果:

image

make install 命令效果:

image

6、安裝SFCGAL 1.3.7

由於SFCGAL需要依賴Boost、CGAL、GMP、MPFR這四個軟件,所以具體總共需要安裝以下四個軟件:
boost-devel.x86_64
gmp-devel.x86_64
mpfr-devel.x86_64
CGAL-4.14


6.1 Boost-1.5.3

yum install boost boost-devel

6.2 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
bash ./configure --enable-cxx
make && make install

./configure --enable-cxx 命令效果:

image

make 命令效果:

image

make install 命令效果:

image

6.3 MPFR-4.0.2

wget https://www.mpfr.org/mpfr-current/mpfr-4.0.2.tar.gz
tar -xzvf  mpfr-4.0.2.tar.gz
cd mpfr-4.0.2
./configure
make && make install

make install 命令效果:

image

6.4 cgal-4.14

wget http://distfiles.macports.org/cgal/cgal-4.14.tar.xz
xz -d cgal-4.14.tar.xz 
tar xvf cgal-4.14.tar 
cd CGAL-4.14
mkdir build && cd build
cmake ..
make && make install

cmake .. 命令提示未找到,具體安裝步驟參考:https://blog.csdn.net/llwy1428/article/details/95473542

image

如果使用yum安裝cmake,默認版本是:cmake version 2.8.12.2,在執行cmake ..命令時報以下錯誤 

image

  • 安裝新版本cmake
wget https://cmake.org/files/v3.17/cmake-3.17.4.tar.gz
tar -zxvf cmake-3.17.4.tar.gz
cd cmake-3.17.4
./configure --prefix=/usr/local/cmake
make 
make install
#創建鏈接
ln -s /usr/local/cmake/bin/cmake /usr/bin/cmake
  • 修改環境變量,查看版本

vim /etc/profile

export CMAKE_HOME=/usr/local/cmake
export PATH=$PATH:$CMAKE_HOME/bin

#使配置生效
source /etc/profile
#查看版本
cmake –version

接下來繼續安裝cgal-4.14,進入/usr/local/src/CGAL-4.14/build,執行cmake .. 命令正常效果:

image

make 命令效果:

image

make install 命令效果:

image

安裝過程中可能會出現以下錯誤

image

解決方法: 修改/usr/include/boost/ cstdint.hpp 44行代碼為:

image

#if defined(BOOST_HAS_STDINT_H) \
&& (!defined(__GLIBC__) \
|| defined(__GLIBC_HAVE_LONG_LONG) \
|| (defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 17)))))

6.5 SFCGAL 1.3.7

wget  https://github.com/Oslandia/SFCGAL/archive/v1.3.7.tar.gz
tar -zxvf SFCGAL-1.3.7.tar.gz
cd SFCGAL-1.3.7  
mkdir build && cd build 
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/sfcgal ..
make  && make install
echo "/usr/local/sfcgal/lib64" > /etc/ld.so.conf.d/sfcgal-1.3.7.conf
ldconfig

make 命令效果:

image

make install 命令效果:

image

7、pcre-8.44安裝

wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
tar -xzvf  pcre-8.44.tar.gz
cd pcre-8.44
./configure --enable-utf8 --prefix=/usr/local/pcre
make && make intall
echo "/usr/local/pcre/lib" > /etc/ld.so.conf.d/pcre-8.44.conf
ldconfig

./configure --enable-utf8 --prefix=/usr/local/pcre 命令效果:

image

make 命令效果:

image

make install 命令效果:

image

8、libxml2-2.9.10安裝

wget http://xmlsoft.org/sources/libxml2-2.9.10.tar.gz
tar -xzvf  libxml2-2.9.10.tar.gz
cd libxml2-2.9.10
./configure --prefix=/usr/local/libxml2
make && make intall
echo "/usr/local/libxml2/lib" > /etc/ld.so.conf.d/libxml2-2.9.10.conf
ldconfig

make命令,遇到錯誤提示“libxml.c:14:20: fatal error: Python.h: No such file or directory”

image

解決方法如下:

# 可以先查看一下含python-devel的包
yum search python | grep python-devel

# 64位安裝python-devel.x86_64,32位安裝python-devel.i686,我這里安裝:
sudo yum install python-devel.x86_64

# 進入/usr/include/python2.7看一下現在有沒有Python.h,版本不同目錄名不同,我這里是2.7版本。
# 其實也可以看到很多.h文件,python需要庫或頭文件都在這個地方。

make 命令正常效果:

image

make install 命令效果:

image

9、編譯gdal.jar進行 java開發,不需要開發,可以跳過

9.1、 ant 1.10.12

wget https://mirrors.tuna.tsinghua.edu.cn/apache//ant/binaries/apache-ant-1.10.12-bin.tar.gz
tar -zxvf apache-ant-1.10.12-bin.tar.gz
mv apache-ant-1.10.12 /usr/local/ant

9.2、swig 4.0.1

wget http://prdownloads.sourceforge.net/swig/swig-4.0.1.tar.gz
tar -zxvf  swig-4.0.1.tar.gz
cd swig-4.0.1
bash ./configure --prefix=/usr/local/swig --without-pcre
make && make install
./configure --prefix=/usr/local/swig --without-pcre 命令效果:

image

make 命令效果:

image

make install 命令效果:

image

9.3、配置profile

vim /etc/profile

ANT_HOME=/usr/local/ant
SWIG_HOME=/usr/local/swig

PATH=$ANT_HOME/bin:$SWIG_HOME/bin:$PATH

export ANT_HOME SWIG_HOME

source /etc/profile

查看版本
ant –version

image
swig –version

image

四、安裝GDAL 3.0.4

1、編譯gdal

wget http://download.osgeo.org/gdal/3.0.4/gdal-3.0.4.tar.gz
tar -xf gdal-3.0.4.tar.gz
cd gdal-3.0.4
bash ./configure --prefix=/usr/local/pgsql/plugin/gdal --with-proj=/usr/local/pgsql/plugin/proj --with-geos=/usr/local/pgsql/plugin/geos/bin/geos-config --with-libjson-c=/usr/local/pgsql/plugin/json-c
make && make install
echo "/usr/local/pgsql/plugin/gdal/lib" > /etc/ld.so.conf.d/gdal-3.0.4.conf
ldconfig

make 命令效果:

image

make install 命令效果:

image

2、配置GDAL環境變量

通過vi /etc/profile去配置gdal/lib、gdal/bin、gdal/data吧,也可以把profile下載到本地改完再上傳

GDAL_HOME=/usr/local/pgsql/plugin/gdal
GDAL_DATA=$GDAL_HOME/share/gdal

LD_LIBRARY_PATH=$GDAL_HOME/lib:/usr/local/lib64:$JRE_HOME/lib:$LD_LIBRARY_PATH

PATH=$GDAL_HOME/bin:$PATH

export  PATH LD_LIBRARY_PATH GDAL_DATA

3、GDAL安裝完成,看看版本號和支持的數據格式吧

gdalinfo –version

image
ogr2ogr --formats

image

  • 如只編譯GDAL的同學,下面的內容可以不用看了,安裝PostGIS的同學,請繼續

五、編譯安裝PostGIS

1、編譯

wget https://download.osgeo.org/postgis/source/postgis-3.0.1.tar.gz
tar -xvzf postgis-3.0.1.tar.gz
cd postgis-3.0.1
./configure --with-pgconfig=/usr/local/pgsql/bin/pg_config --with-geosconfig=/usr/local/pgsql/plugin/geos/bin/geos-config  --with-projdir=/usr/local/pgsql/plugin/proj --with-gdalconfig=/usr/local/pgsql/plugin/gdal/bin/gdal-config --with-jsondir=/usr/local/pgsql/plugin/json-c --with-pcredir=/usr/local/pcre
make && make install

./configure 命令效果:

image

image

make 命令效果:

image

make install 命令效果:

image

如果編譯安裝PostGIS報錯:

undefined reference to `sqlite3_column_origin_name',解決鏈接參考:https://www.cnblogs.com/xuanmanstein/p/13227545.html

具體做法是在源碼文件夾下

cd /usr/local/src/sqlite-autoconf-3360000
vi ./sqlite3.c

添加

#define SQLITE_CORE 1
#define SQLITE_AMALGAMATION 1
#ifndef SQLITE_PRIVATE
# define SQLITE_PRIVATE static
#endif

image

然后 再

./configure
make
make install


2、安裝fuzzystrmatch擴展

cd /usr/local/src/postgresql-12.2/contrib/fuzzystrmatch
make && make install

make 命令效果:

image

make install 命令效果:

image

3、創建PostGiS數據庫

  • 為了PostGIS插件生效,停止啟動服務
systemctl  stop  postgresql.service

systemctl  start  postgresql.service
  • 創建數據庫
#切換postgres用戶
su  postgres
#登錄PG數據庫
psql
# 創建數據庫
create database postgis;
#切換到postgis庫中
\c postgis
#顯示一下擴展模塊
\dx

image

4、創建Postgresql擴展

create extension postgis;
create extension postgis_topology;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;

4.1、錯誤

create extension postgis; 報錯如下:

could not load library "/usr/local/pgsql/lib/postgis-3.so": libprotobuf-c.so.1

image
vi /etc/ld.so.conf
#依賴庫比較多時,就直接把依賴庫lib加入系統共享庫,如

/usr/local/lib

ldconfig

image

重新啟動postgresql數據庫。

4.2 擴展成功創建

image

六、發布gdal項目、讀取TIF高程文件,根據經緯度獲取海拔

1、必須正常執行以下步驟

       三、編譯GDAL依賴

       四、編譯GDAL 3.0.4

2、編譯生成gdal.jar

2.1 配置java.opt

修改文件:/usr/local/src/gdal-3.0.4/swig/java/java.opt,修改JAVA_HOME的值為java的根目錄
JAVA_HOME = /usr/local/jdk1.8.0_281

2.2 編譯

cd /usr/local/src/gdal-3.0.4/swig/java
make && make install

3、JavaWeb應用的 gdal環境配置

3.1、整理文件,把生成的文件放置到gdal/java目錄

mkdir -p /usr/local/pgsql/plugin/gdal/java
cp /usr/local/src/gdal-3.0.4/swig/java/gdal.jar  /usr/local/pgsql/plugin/gdal/java
cp /usr/local/src/gdal-3.0.4/swig/java/.libs/*.so /usr/local/pgsql/plugin/gdal/java

3.2、在centos下, java.library.path/usr/local/jdk1.8.0_281/lib/amd64,放置libgdalalljni.so到此目錄,javaWeb項目從這里加載libgdalalljni.so動態庫

cp /usr/local/src/gdal-3.0.4/swig/java/.libs/*.so /usr/local/jdk1.8.0_281/lib/amd64

3.3、把/swig/java中生成的gdal.jar文件復制到jre/lib/ext,jvm啟動加載

cp /usr/local/src/gdal-3.0.4/swig/java/gdal.jar  /usr/local/jdk1.8.0_281/jre/lib/ext

vi /etc/profile
CLASS_PATH=$JAVA_HOME/jre/lib/ext/gdal.jar:$CLASS_PATH
source /etc/profile

3.4、在/usr/local/gdal-3.0.4/swig/java/目錄下復制gdal.jar、libgdalalljni.so文件到項目resources/gdal/linux

image

4、啟動JavaWeb看看吧

  • 載入動態庫libgdalalljni.so

http://192.168.1.82:8080/gdal/api/gdal/load

  • 注冊gdal驅動

http://192.168.1.82:8080/gdal/api/gdal/register

  • shp轉geojson

http://192.168.1.82:8080/gdal/api/gdal/test/shp

  • 根據經緯度查詢海拔

http://192.168.1.82:8080/gdal/api/gdal/selectAltitude?lon=101.971729&lat=38.246638

image

2698296E-FA90-447a-9C19-551F9B3B903B

5、可能出現的問題

  • 錯誤1: java.lang.UnsatisfiedLinkError: Native Library /usr/java/packages/lib/amd64/libgdalalljni.so already loaded in another classloader
jvm啟動時已經加載過libgdalalljni.so,不能能再次加載了,在linux系統上無需代碼加載libgdalalljni.so
  • 錯誤2:libpq.so.5: cannot open shared object file: No such file or directory 原因是未設置pg庫到系統動態庫配置請設置ld.so.conf
echo '/usr/local/pgsql/lib' >> /etc/ld.so.conf
ldconfig
  • 錯誤3:nested exception is java.lang.UnsatisfiedLinkError: org.gdal.ogr.ogrJNI.RegisterAll()V
gdal.jar未放置到/usr/local/jdk1.8.0_281/jre/lib/ext

vi /etc/profile
CLASS_PATH=$JAVA_HOME/jre/lib/ext/gdal.jar:$CLASS_PATH
source /etc/profile


項目源碼:
https://github.com/hlb3696/geodb-gdal.git


免責聲明!

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



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