20180728更新
根据我们的idc机器配置,推荐版本如下
PostgreSQL 9.4.11 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.6 20110731 (Red Hat 4.
4.6-4), 64-bit
POSTGIS="2.2.1 r14555" GEOS="3.6.1-CAPI-1.10.1 r0" PROJ="Rel. 4.7.1, 23 September 2009" GDAL="G
DAL 2.1.3, released 2017/20/01" LIBXML="2.7.6" TOPOLOGY RASTER
各组件查询命令如下:
psql -V
gdalinfo --version
geos-config --version
proj
postgres和postgis的版本号需要进入到psql控制台
su
su – postgres
psql
postgres:select version();(需要进入到带postgis扩展的数据库中)
postgis:select PostGIS_full_version();
几个模块的关系
GDAL&OGR库支持了大多数地理数据格式的读写,OGR并没有对特征之间的空间关系计算提供原生支持。
Geos库扩展了OGR库的几何计算功能,为空间计算提供了接口。
PostGIS 则是PostgreSQL的一个扩展,目的是使PostgreSQL支持空间数据的存储和使用
1,安装postgresql数据库
直接安装9.0以上版本的比较方便,如果是从8.4升级,会有所麻烦,请参考下面链接
http://people.planetpostgresql.org/devrim/index.php?/archives/50-Upgrading-from-8.4-to-9.0-on-Fedora-Red-Hat-CentOS-using-RPMs.html#comments
进行操作
编译过程中如果有错误提示需要哪些库,要先安装缺失的库,查看Error内容可以得到
如果想迁移postgresql默认数据库的位置
采用
http://stackoverflow.com/questions/16678872/how-can-i-move-postgresql-data-to-another-directory-on-ubuntu-over-amazon-ec2
的方法建立软链接最为方便
完成后,调用
chown postgres:postgres /new/path/to/data
chmod 700 /new/path/to/data
如果不成功,那么chmod指向父级文件夹
chmod 700 /new/path/to
9.4直接安装方法
./configure
make
su
make install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test
2,安装ogr2ogr
安装ogr2ogr需要gdal,geos,等一系列库的支持,按照
https://github.com/wavded/ogre/wiki/Compiling-a-recent-ogr2ogr-from-source-on-CentOS-(RHEL)
按照文章开始的版本安装
20180730更新
安装gdal时必须安装对postgres的支持,默认不会安装,要不用ogr2ogr导入postgres数据库时会提示
ERROR 1: Unable to find driver `PostgreSQL'.
安装方法:指定pg_config文件
./configure --with-pg=/path/to/pg_config ...
./make clean(重装必须先clean,第一次安装不需要)
./make
./make install
参考https://gis.stackexchange.com/questions/33346/how-can-i-update-ogr2ogr-to-include-the-postgresql-driver
20180727更新
安装geos
wget http://download.osgeo.org/geos/geos-3.6.2.tar.bz2
bunzip2 geos-3.6.2.tar.bz2
tar xvf geos-3.6.2.tar
cd geos-3.6.2
./configure && make && sudo make install
sudo ldconfig
3,安装postgis的支持
wget http://postgis.net/stuff/postgis-2.2.1dev.tar.gz
tar -xvzf postgis-2.2.1dev.tar.gz
tar xvfz postgis-2.2.1dev.tar.gz
cd postgis-2.2.1dev
./configure
make
make install
postgis2.2需要postgres9.1以上版本的支持,如果装的是8.4,先按照步骤1更新。如果是先更新的postgresql版本,然后再安装的postgis,会遇到pg_config的问题,需要将9.*版本的pg_config拷贝到/usr/bin/下面,原来8.4的pg_config先备份,因为编译程序需要调用pg_config找到一些头文件及库的位置
或者直接在configure的时候指定位置
./configure --with-pgconfig=/usr/pgsql-9.4/bin/pg_config
20180728更新
把pg_config拷贝到/usr/bin下,再configure,可能会提示
configure: error: the PGXS Makefile /usr/lib/pgxs/src/makefiles/pgxs.mk cannot be found. Please install the PostgreSQL server development packages and re-run configure.
需要改成./configure --with-pgconfig的方式,好像就没啥问题了
4,安装完postgis后,创建支持postgis的模板数据库template_postgis
命令行命令
su
su – postgres
psql
CREATE DATABASE template_postgis
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
TEMPLATE = template0
LC_COLLATE = 'C'
LC_CTYPE = 'C'
CONNECTION LIMIT = -1;
ALTER DATABASE template_postgis
SET search_path = "$user", public, topology, tiger;
然后shell调用
psql -d template_postgis -c "CREATE EXTENSION postgis;"
psql -d template_postgis -c "CREATE EXTENSION postgis_topology;"
然后数据库内调用
template_postgis=> select version();
version
-------------------------------------------------------------
PostgreSQL 9.0.2, compiled by Visual C++ build 1500, 32-bit
(1 行记录)
--查看PostGIS的版本信息
template_postgis=> select postgis_full_version();
postgis_full_version
--------------------------------------------------------------------------------
POSTGIS="1.5.2" GEOS="3.2.2-CAPI-1.6.2" PROJ="Rel. 4.6.1, 21 August 2008" LIBXML="2.7.6" USE_STATS
验证是否安装成功,出现以上信息,说明安装成功了,这样template_postgis就成为支持postgis的模板数据库了
5,今后需要创建支持 postgis数据库,就需要以template_postgis库为模板创建
CREATE DATABASE specialguidance WITH OWNER = tracks ENCODING = 'UTF8' TABLESPACE = pg_default TEMPLATE = template_postgis LC_COLLATE = 'C' LC_CTYPE = 'C' CONNECTION LIMIT = -1;
6,通过ogr2ogr命令导入mif到数据库中
ogr2ogr -f "PostgreSQL" PG:"host=localhost dbname=15Q4_15M10W4_NAV2_MIFG_151023 user=postgres password=111111" -overwrite /data4/upload/15Q4_15M10W4_NAV2_MIFG_151023/level2/anhui/road/Ranhui.mif
在导入之后检查表的结构,如果里面的有wkb_geometry geometry(Geometry,900914)这样的字段定义,而不是wkb_geometry bytea这样的字段定义,就代表导入成功了,否则就是还有问题。
20180805更新
近期将postgresql环境从idc A机器迁移到idc B机器,最后导入mif数据的时候发现速度特别慢,差了几十倍,两台机器测试过性能,磁盘和cpu的性能基本一致,但是查看系统占用发现B机器上的CUP占用总是很低,网上搜索到两篇文章和这个情况类似
SSL设置导致的问题:http://www.postgresql-archive.org/Low-CPU-Usage-td2065261.html
类型转换导致的问题:https://gis.stackexchange.com/questions/256716/ogr2ogr-slow-to-load-arcgis-file-geodatabase-data-into-postgresql
最后分别试验了都不行。AB机器上的postgresql及其插件完全一致,配置文件也一致。
后面查到根本原因是因为-skipfailures参数,When you use -skipfailures, the -gt parameter is ignored and virtually set to 1 so that transactions only take into account one single feature at a time.同样都使用了这个参数,在AB上表现差别很大,具体为什么原因还不清楚。
解决办法,加入参数,--config OGR_SQLITE_SYNCHRONOUS OFF
https://www.mail-archive.com/[email protected]&q=subject:%22%5C%5Bgdal%5C-dev%5C%5D+Re%5C%3A+Slow+writing+into+Spatialite+with+%5C-skipfailures%22&o=newest&f=1
经验教训:如果能够确定两台机器的硬件环境和数据库环境完全一致,优先尝试调用程序的参数的修改会带来什么影响!