当前仓库属于暂停状态,部分功能使用受限,详情请查阅 仓库状态说明
125 Star 46 Fork 161

openGauss/openGauss-third_party
暂停

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

PostGIS概述

openGauss提供PostGIS Extension(版本为PostGIS-2.4.2)。PostGIS Extension是PostgreSQL的空间数据库扩展,提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符。PostGIS Extension完全遵循OpenGIS规范。

PostGIS安装

注意事项:

postgis扩展的安装高度依赖openGauss-third_party_binarylibs,你可以根据相应指导进行操作。 请注意,如果在没有构建的情况下使用提供的库,可能会出现“找不到 xxxx.la”等错误,在这种情况下,您需要将相应的文件复制到该目标。

安装准备:

Postgis插件依赖下列工具 (最低版本要求).

  • GCC-7.3. zlib.autoconf.automake

  • Geos 3.6.2

  • Proj 4.9.2

  • Json 0.12.1

  • Libxml2 2.7.1

  • Gdal 1.11.0

对于它们的安装,您可以自由选择自己安装,我们将只提供“Geos.Proj.Json.Libxml.Gdal 1.11.0”安装的脚本,您可以在之后选择通过脚本安装 “ GCC-7.3.zlib.autoconf.automake ”安装在环境中。

通过脚本编译安装:

  1. 从网站下载源代码 postgis-xc-master-2020-09-17.tar.gz

    https://opengauss.obs.cn-south-1.myhuaweicloud.com/dependency/postgis-xc-master-2020-09-17.tar.gz

  2. 将其复制到 $GAUSSHOME/ 路径,解压 tar.gz 并重命名为 postgis-xc

  3. 配置环境变量,根据代码下载位置添加***__***。

    export CODE_BASE=________     # Path of the openGauss-server file
    export THIRDPARTY=________    # Path of the third-party file
    export BINARYLIBS=________    # Path of the binarylibs file
    export GAUSSHOME=________    # Path of opengauss installation
    export LD_LIBRARY_PATH=$GAUSSHOME/lib:$GAUSSHOME/install/geos/lib:$GAUSSHOME/install/proj4/lib:$GAUSSHOME/install/gdal/lib:$GAUSSHOME/install/libxml2/lib/:$LD_LIBRARY_PATH
    
  4. 编译安装postgis:

    cd $GAUSSHOME/postgis-xc
    然后按照"Compile and Install by Youself"选项执行
    
  5. PostGIS 安装完成.

用户手动编译和安装:

  1. 从网站下载源代码 postgis-xc-master-2020-09-17.tar.gz:
cd $GAUSSHOME
wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/dependency/postgis-xc-master-2020-09-17.tar.gz
  1. 解压,并重命名为 postgis-xc
cd $GAUSSHOME
tar -zxvf  postgis-xc-master-2020-09-17.tar.gz
mv postgis-xc-master  postgis-xc
  1. 安装依赖工具。 如果您的系统是 openeuler_aarch64,请记住添加“--build=aarch64-unknown-linux-gnu”。 这些工具将安装在 $GAUSSHOME/install 目录下:
# 应用patch补丁
cd $GAUSSHOME/postgis-xc
# 由于raster插件相关的文件非Linux格式,所以在patch之前,需要先进行格式转换,若无dos2unix则先安装此工具
dos2unix postgis-2.4.2/postgis_raster--2.4.2.sql
patch -p1 < $THIRDPARTY/gpl_dependency/postgis/postgis_2.4.2-2.patch
# 如果使用含有dolphin插件的数据库进行postgis安装,还需要应用额外的dolphin补丁
patch -p1 < $THIRDPARTY/gpl_dependency/postgis/dolphin.patch

#复制依赖文件:
cp $THIRDPARTY/gpl_dependency/postgis/extension_dependency.h $GAUSSHOME/include/postgresql/server/

#安装 geos
cd $GAUSSHOME/postgis-xc/geos-3.6.2
chmod +x ./configure
./configure --prefix=$GAUSSHOME/install/geos
make -sj
make install -sj

#安装 proj
cd $GAUSSHOME/postgis-xc/proj-4.9.2
chmod +x ./configure
./configure --prefix=$GAUSSHOME/install/proj
make -sj
make install -sj

#安装 json
cd $GAUSSHOME/postgis-xc/json-c-json-c-0.12.1-20160607
chmod +x ./configure
./configure --prefix=$GAUSSHOME/install/json
make -sj
make install -sj

#安装 libxml2
cd $GAUSSHOME/postgis-xc/libxml2-2.7.1
chmod +x ./configure
./configure --prefix=$GAUSSHOME/install/libxml2
make -sj
make install -sj

#安装 gdal
cd $GAUSSHOME/postgis-xc/gdal-1.11.0
chmod +x ./configure
chmod +x ./install-sh
./configure --prefix=$GAUSSHOME/install/gdal --with-xml2=$GAUSSHOME/install/libxml2/bin/xml2-config --with-geos=$GAUSSHOME/install/geos/bin/geos-config --with-static_proj4=$GAUSSHOME/install/proj CFLAGS='-O2 -fpermissive -pthread'
make -sj
make install -sj

报错提示:
如果gdal编译失败,出现类似报错:
[by0314@s37 gdal-1.11.0]$ make -sj
/usr/bin/grep: /data/gcc2/target/gcc7.3/lib/../lib64/libstdc++.la: Permission denied
/usr/bin/sed: can't read /data/gcc2/target/gcc7.3/lib/../lib64/libstdc++.la: Permission denied
libtool: link: `/data/gcc2/target/gcc7.3/lib/../lib64/libstdc++.la' is not a valid libtool archive
make[1]: *** [GNUmakefile:41: libgdal.la] Error 1
make: *** [GNUmakefile:50: check-lib] Error 2
编译出现类似/data/gcc2/target/gcc7.3/lib/../lib64/libstdc++.la 找不到,可以自建目录,将libstdc++.la拷贝进去,然后再make -sj
(如果libstdc++.so出现类似问题,按同样方法处理)
如果gdal make时有除此之外的报错,可以尝试多次执行make -sj,还有问题可以尝试使用make -s

  1. 安装 postgis,如果你的系统是 openeuler_aarch64,记得添加“--build=aarch64-unknown-linux-gnu”,并用你的系统类型补全“____”:
cd $GAUSSHOME/postgis-xc/postgis-2.4.2
sed -i -e 's/-Werror//g' $GAUSSHOME/lib/postgresql/pgxs/src/Makefile.global

#complile
./configure --prefix=$GAUSSHOME/install/pggis2.4.2 --with-pgconfig=$GAUSSHOME/bin/pg_config --with-projdir=$GAUSSHOME/install/proj --with-geosconfig=$GAUSSHOME/install/geos/bin/geos-config --with-jsondir=$GAUSSHOME/install/json \
                     --with-xml2config=$GAUSSHOME/install/libxml2/bin/xml2-config --with-raster --with-gdalconfig=$GAUSSHOME/install/gdal/bin/gdal-config --with-topology --without-address-standardizer \
                     CFLAGS='-O2 -fpermissive -DPGXC -pthread -D_THREAD_SAFE -D__STDC_FORMAT_MACROS -DMEMORY_CONTEXT_CHECKING -w' CC=g++

make -sj 
make install -sj

注意:

  • 需要将 openGauss 缺少的头文件从其源码包中拷贝到数据库对应的 Include 目录下。

  • 若出现 postgis_topology.c:249:54: error:base operand of '->' has non-pointer type 'FormData_pg_attribute' ...的报错,

    则将 postgis-2.4.2/topology/postgis_topology.c 下249行的最后一个箭头操作符“->”改为点操作符“.”,然后重新编译。

  topo->geometryOID = SPI_tuptable->tupdesc->attrs[3]->atttypid;

改为:

  topo->geometryOID = SPI_tuptable->tupdesc->attrs[3].atttypid;
  1. 将文件复制到 opengauss 安装文件夹:
cp $GAUSSHOME/install/json/lib/libjson-c.so.2 $GAUSSHOME/lib/libjson-c.so.2
cp $GAUSSHOME/install/geos/lib/libgeos_c.so.1 $GAUSSHOME/lib/libgeos_c.so.1
cp $GAUSSHOME/install/proj/lib/libproj.so.9 $GAUSSHOME/lib/libproj.so.9
cp $GAUSSHOME/install/geos/lib/libgeos-3.6.2.so $GAUSSHOME/lib/libgeos-3.6.2.so
cp $GAUSSHOME/install/gdal/lib/libgdal.so.1.18.0 $GAUSSHOME/lib/libgdal.so.1
cp $GAUSSHOME/install/pggis2.4.2/lib/liblwgeom-2.4.so.0 $GAUSSHOME/lib/liblwgeom-2.4.so.0
cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis.control $GAUSSHOME/share/postgresql/extension/
cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis--2.4.2.sql $GAUSSHOME/share/postgresql/extension/

rm -f $GAUSSHOME/share/postgresql/extension/postgis_raster--2.*.sql
cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis_raster--2.4.2.sql $GAUSSHOME/share/postgresql/extension/postgis_raster--2.4.2.sql
cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis_raster.control $GAUSSHOME/share/postgresql/extension/postgis_raster.control

rm -f $GAUSSHOME/share/postgresql/extension/postgis_topology--2.*.sql
cp $GAUSSHOME/postgis-xc/postgis-2.4.2/extensions/postgis_topology/sql/postgis_topology--2.4.2.sql $GAUSSHOME/share/postgresql/extension/postgis_topology--2.4.2.sql
cp $GAUSSHOME/postgis-xc/postgis-2.4.2/extensions/postgis_topology/postgis_topology.control $GAUSSHOME/share/postgresql/extension/postgis_topology.control

PostGIS使用

创建Extension

创建PostGIS Extension可直接使用CREATE EXTENSION命令进行创建:

CREATE EXTENSION postgis;

使能PostGIS中的栅格功能,可直接使用CREATE EXTENSION命令进行创建:

CREATE EXTENSION postgis_raster;

使能PostGIS中的拓扑功能,使用CREATE EXTENSION命令进行创建之前先执行:

-- 使用CREATE  EXTENSION命令进行创建之前先执行
set behavior_compat_options='bind_procedure_searchpath';
CREATE EXTENSION postgis_topology;

使用Extension

PostGIS Extension函数调用格式为:

SELECT GisFunction (Param1, Param2,......);

其中GisFunction为函数名,Param1、Param2等为函数参数名。

下列SQL语句展示PostGIS的简单使用,对于各函数的具体使用,请参考《PostGIS-2.4.2用户手册》

示例1:几何表的创建。

CREATE TABLE cities ( id integer, city_name varchar(50) );
SELECT AddGeometryColumn('cities', 'position', 4326, 'POINT', 2);

示例2:几何数据的插入。

INSERT INTO cities (id, position, city_name) VALUES (1,ST_GeomFromText('POINT(-9.5 23)',4326),'CityA');
INSERT INTO cities (id, position, city_name) VALUES (2,ST_GeomFromText('POINT(-10.6 40.3)',4326),'CityB');
INSERT INTO cities (id, position, city_name) VALUES (3,ST_GeomFromText('POINT(20.8 30.3)',4326), 'CityC');

示例3:计算三个城市间任意两个城市距离。

SELECT p1.city_name,p2.city_name,ST_Distance(p1.position,p2.position) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;

删除Extension

在GaussDB A中删除PostGIS Extension的方法如下所示:

DROP EXTENSION postgis [CASCADE];

如果Extension被其它对象依赖(如创建的几何表),需要加入CASCADE(级联)关键字,删除所有依赖对象。

若要完全删除PostGIS Extension,则需由omm用户使用gs_om工具移除PostGIS及其依赖的动态链接库,格式如下:

gs_om -t postgis -m rmlib

PostGIS支持和限制

支持数据类型

GaussDB A的PostGIS Extension支持如下数据类型:

  • box2d

  • box3d

  • geometry_dump

  • geometry

  • geography

  • raster

  • 栅格相关的三个GUC参数postgis.gdal_datapath、postgis.gdal_enabled_drivers及postgis.enable_outdb_rasters内部已经完全使能,使用时不用再手动设置。

  • 创建Postgis和使用Postgis不是同一个用户时,请设置如下guc参数:SET behavior_compat_options = 'bind_procedure_searchpath';

支持的操作符和函数列表

表1 PostGIS Extension 支持的操作符和函数列表

函数分类 包含函数
Management Functions AddGeometryColumn、DropGeometryColumn、DropGeometryTable、PostGIS_Full_Version、PostGIS_GEOS_Version、PostGIS_Liblwgeom_Version、PostGIS_Lib_Build_Date、PostGIS_Lib_Version、PostGIS_PROJ_Version、PostGIS_Scripts_Build_Date、PostGIS_Scripts_Installed、PostGIS_Version、PostGIS_LibXML_Version、PostGIS_Scripts_Released、Populate_Geometry_Columns 、UpdateGeometrySRID
Geometry Constructors ST_BdPolyFromText 、ST_BdMPolyFromText 、ST_Box2dFromGeoHash、ST_GeogFromText、ST_GeographyFromText、ST_GeogFromWKB、ST_GeomCollFromText、ST_GeomFromEWKB、ST_GeomFromEWKT、ST_GeometryFromText、ST_GeomFromGeoHash、ST_GeomFromGML、ST_GeomFromGeoJSON、ST_GeomFromKML、ST_GMLToSQL、ST_GeomFromText 、ST_GeomFromWKB、ST_LineFromMultiPoint、ST_LineFromText、ST_LineFromWKB、ST_LinestringFromWKB、ST_MakeBox2D、ST_3DMakeBox、ST_MakeEnvelope、ST_MakePolygon、ST_MakePoint、ST_MakePointM、ST_MLineFromText、ST_MPointFromText、ST_MPolyFromText、ST_Point、ST_PointFromGeoHash、ST_PointFromText、ST_PointFromWKB、ST_Polygon、ST_PolygonFromText、ST_WKBToSQL、ST_WKTToSQL
Geometry Accessors GeometryType、ST_Boundary、ST_CoordDim、ST_Dimension、ST_EndPoint、ST_Envelope、ST_ExteriorRing、ST_GeometryN、ST_GeometryType、ST_InteriorRingN、ST_IsClosed、ST_IsCollection、ST_IsEmpty、ST_IsRing、ST_IsSimple、ST_IsValid、ST_IsValidReason、ST_IsValidDetail、ST_M、ST_NDims、ST_NPoints、ST_NRings、ST_NumGeometries、ST_NumInteriorRings、ST_NumInteriorRing、ST_NumPatches、ST_NumPoints、ST_PatchN、ST_PointN、ST_SRID、ST_StartPoint、ST_Summary、ST_X、ST_XMax、ST_XMin、ST_Y、ST_YMax、ST_YMin、ST_Z、ST_ZMax、ST_Zmflag、ST_ZMin
Geometry Editors ST_AddPoint、ST_Affine、ST_Force2D、ST_Force3D、ST_Force3DZ、ST_Force3DM、ST_Force4D、ST_ForceCollection、ST_ForceSFS、ST_ForceRHR、ST_LineMerge、ST_CollectionExtract、ST_CollectionHomogenize、ST_Multi、ST_RemovePoint、ST_Reverse、ST_Rotate、ST_RotateX、ST_RotateY、ST_RotateZ、ST_Scale、ST_Segmentize、ST_SetPoint、ST_SetSRID、ST_SnapToGrid、ST_Snap、ST_Transform、ST_Translate、ST_TransScale
Geometry Outputs ST_AsBinary、ST_AsEWKB、ST_AsEWKT、ST_AsGeoJSON、ST_AsGML、ST_AsHEXEWKB、ST_AsKML、ST_AsLatLonText 、ST_AsSVG、ST_AsText、ST_AsX3D、ST_GeoHash
Operators &&、&&&、&<、&<|、&>、<<、<<|、=、>>、@ 、|&> 、|>>、~、~=、<->、<#>
Spatial Relationships and Measurements ST_3DClosestPoint、ST_3DDistance、ST_3DDWithin、ST_3DDFullyWithin、ST_3DIntersects、ST_3DLongestLine、ST_3DMaxDistance、ST_3DShortestLine、ST_Area、ST_Azimuth、ST_Centroid、ST_ClosestPoint、ST_Contains、ST_ContainsProperly、ST_Covers、ST_CoveredBy、ST_Crosses、ST_LineCrossingDirection、ST_Disjoint、ST_Distance、ST_HausdorffDistance、ST_MaxDistance、ST_DistanceSphere、ST_DistanceSpheroid、ST_DFullyWithin、ST_DWithin、ST_Equals、ST_HasArc、ST_Intersects、ST_Length、ST_Length2D、ST_3DLength、ST_Length_Spheroid、ST_Length2D_Spheroid、ST_3DLength_Spheroid、ST_LongestLine、ST_OrderingEquals、ST_Overlaps、ST_Perimeter、ST_Perimeter2D、ST_3DPerimeter、ST_PointOnSurface、ST_Project、ST_Relate、ST_RelateMatch、ST_ShortestLine、ST_Touches、ST_Within
Geometry Processing ST_Buffer、ST_BuildArea、ST_Collect、ST_ConcaveHull、ST_ConvexHull、ST_CurveToLine、ST_DelaunayTriangles、ST_Difference、ST_Dump、ST_DumpPoints、ST_DumpRings、ST_FlipCoordinates、ST_Intersection、ST_LineToCurve、ST_MakeValid、ST_MemUnion、ST_MinimumBoundingCircle、ST_Polygonize、ST_Node、ST_OffsetCurve、ST_RemoveRepeatedPoints、ST_SharedPaths、ST_Shift_Longitude、ST_Simplify、ST_SimplifyPreserveTopology、ST_Split、ST_SymDifference、ST_Union、ST_UnaryUnion
Linear Referencing ST_LineInterpolatePoint、ST_LineLocatePoint、ST_LineSubstring、ST_LocateAlong、ST_LocateBetween、ST_LocateBetweenElevations、ST_InterpolatePoint、ST_AddMeasure
Miscellaneous Functions ST_Accum、Box2D、Box3D、ST_Expand、ST_Extent、ST_3Dextent、Find_SRID、ST_MemSize
Exceptional Functions PostGIS_AddBBox、PostGIS_DropBBox、PostGIS_HasBBox
Raster Management Functions AddRasterConstraints、DropRasterConstraints、AddOverviewConstraints、DropOverviewConstraints、PostGIS_GDAL_Version、PostGIS_Raster_Lib_Build_Date、PostGIS_Raster_Lib_Version、ST_GDALDrivers、UpdateRasterSRID
Raster Constructors ST_AddBand、ST_AsRaster、ST_Band、ST_MakeEmptyRaster、ST_Tile、ST_FromGDALRaster
Raster Accessors ST_GeoReference、ST_Height、ST_IsEmpty、ST_MetaData、ST_NumBands、ST_PixelHeight、ST_PixelWidth、ST_ScaleX、ST_ScaleY、ST_RasterToWorldCoord、ST_RasterToWorldCoordX、ST_RasterToWorldCoordY、ST_Rotation、ST_SkewX、ST_SkewY、ST_SRID、ST_Summary、ST_UpperLeftX、ST_UpperLeftY、ST_Width、ST_WorldToRasterCoord、ST_WorldToRasterCoordX、ST_WorldToRasterCoordY
Raster Band Accessors ST_BandMetaData、ST_BandNoDataValue、ST_BandIsNoData、ST_BandPath、ST_BandPixelType、ST_HasNoBand
Raster Pixel Accessors and Setters ST_PixelAsPolygon、ST_PixelAsPolygons、ST_PixelAsPoint、ST_PixelAsPoints、ST_PixelAsCentroid、ST_PixelAsCentroids、ST_Value、ST_NearestValue、ST_Neighborhood、ST_SetValue、ST_SetValues、ST_DumpValues、ST_PixelOfValue
Raster Editors ST_SetGeoReference、ST_SetRotation、ST_SetScale、ST_SetSkew、ST_SetSRID、ST_SetUpperLeft、ST_Resample、ST_Rescale、ST_Reskew、ST_SnapToGrid、ST_Resize、ST_Transform
Raster Band Editors ST_SetBandNoDataValue、ST_SetBandIsNoData
Raster Band Statistics and Analytics ST_Count、ST_CountAgg、ST_Histogram、ST_Quantile、ST_SummaryStats、ST_SummaryStatsAgg、ST_ValueCount
Raster Outputs ST_AsBinary、ST_AsGDALRaster、ST_AsJPEG、ST_AsPNG、ST_AsTIFF
Raster Processing ST_Clip、ST_ColorMap、ST_Intersection、ST_MapAlgebra、ST_Reclass、ST_Union、ST_Distinct4ma、ST_InvDistWeight4ma、ST_Max4ma、ST_Mean4ma、ST_Min4ma、ST_MinDist4ma、ST_Range4ma、ST_StdDev4ma、ST_Sum4ma、ST_Aspect、ST_HillShade、ST_Roughness、ST_Slope、ST_TPI、ST_TRI、Box3D、ST_ConvexHull、ST_DumpAsPolygons、ST_Envelope、ST_MinConvexHull、ST_Polygon、ST_Contains、ST_ContainsProperly、ST_Covers、ST_CoveredBy、ST_Disjoint、ST_Intersects、ST_Overlaps、ST_Touches、ST_SameAlignment、ST_NotSameAlignmentReason、ST_Within、ST_DWithin、ST_DFullyWithin
Raster Operators &&、&<、&>、=、@、~=、~

空间索引

GaussDB A数据库的PostGIS Extension支持GIST (Generalized Search Tree) 空间索引(分区表除外)。相比于B-tree索引,GIST索引适应于任意类型的非常规数据结构,可有效提高几何和地理数据信息的检索效率。

使用如下命令创建GIST索引:

CREATE INDEX indexname ON tablename USING GIST ( geometryfield );

扩展限制

  • 只支持行存表;
  • 不支持BRIN索引;
  • spatial_ref_sys表在扩容期间只支持查询操作。
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/opengauss/openGauss-third_party.git
git@gitee.com:opengauss/openGauss-third_party.git
opengauss
openGauss-third_party
openGauss-third_party
master

搜索帮助