PostGIS几何类型&操作符&基本函数整理

本文详细介绍PostgreSQL中几何类型的基础知识,包括点、线、线段、矩形、路径、多边形和圆的定义及表现形式。此外,还介绍了几何操作符的功能和用法,以及各种几何函数和类型转换函数的应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

一、几何类型

1、点(point)

2、线(line)

3、线段(lseg)

4、矩形(box)

5、路径(path)

6、多边形(polygon)

7、圆(circle)

示例:

二、几何操作符

三、几何函数

四、几何类型转换函数


 

PostgreSQL支持的几何类型如下表:

名字

存储空间

描述

表现形式

point

16字节

平面上的点

(x,y)

line

32字节

直线

{A,B,C}

lseg

32字节

线段

((x1,y1),(x2,y2))

box

32字节

矩形

((x1,y1),(x2,y2))

path

16+16n字节

闭合路径(与多边形相似)

((x1,y1),...)

path

16+16n字节

开放路径

[(x1,y1),...]

polygon

40+16n字节

多边形(与闭合路径相似)

((x1,y1),...)

circle

24字节

<(x,y),r> 

(中心点与半径)

 

详细说明:

1、点(point)

点是几何类型的基本二维构建块。point使用以下任一语法指定类型的值:

(x,y)
   x,y

其中xy是相应的坐标,作为浮点数。

使用第一种语法输出点。

 

2、线(line)

线由线性方程Ax + By + C= 0表示,其中AB不都为零。类型的值 line以下列形式输入和输出:

{ A,B,C}

或者,可以使用以下任何形式进行输入:

[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
  ( x1 , y1 ) , ( x2 , y2 )
    x1 , y1   ,   x2 , y2

其中(x1y1)和(x2y2)是线上的两个不同点。

 

3、线段(lseg)

线段由成对的点表示,这些点是段的端点。lseg类型的值使用下列语法中的任何一种来指定:

[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
  ( x1 , y1 ) , ( x2 , y2 )
    x1 , y1   ,   x2 , y2

其中(x1y1)和(x2y2)是线段的端点。

使用第一种语法输出线段。

 

4、矩形(box)

矩形是由矩形的对角线的点对来表示的。box 使用下列语法中的任何一种来指定类型的值:

( ( x1 , y1 ) , ( x2 , y2 ) )
  ( x1 , y1 ) , ( x2 , y2 )
    x1 , y1   ,   x2 , y2

其中(x1y1)和(x2y2)是矩形的任意两个相对的角。

使用第二种语法输出矩形。

可以在输入时提供任两个相对的角,但是值将根据需要重新排序,以便按顺序存储右上角和左下角。

所以建议在输入时提供右上角和左下角。

 

5、路径(path)

路径由连接点列表表示。路径可以是开放的(其中列表中的第一和最后一个点被认为是未连接的),或者是闭合的(其中第一和最后一个点被认为是连接的)。

path使用以下任何语法指定类型的值:

[ ( x1 , y1 ) , ... , ( xn , yn ) ]
( ( x1 , y1 ) , ... , ( xn , yn ) )
  ( x1 , y1 ) , ... , ( xn , yn )
  ( x1 , y1   , ... ,   xn , yn )
    x1 , y1   , ... ,   xn , yn

其中点是包括路径的线段的端点。方括号([])表示开放路径,而圆括号(())表示闭合路径。当省略最外面的括号时,如在第三到第五语法中,假设闭合路径。

其中点是包括路径的线段的端点。方括号([])表示开放路径,而小括号(())表示闭合路径。当最外括号被省略时,如在第三到第五语法中,表示默认为一条闭合路径。

根据需要,建议使用第一或第二语法输出路径。

 

6、多边形(polygon)

多边形由点列表(多边形的顶点)表示。多边形与闭合路径非常相似,但存储方式不同,并且具有自己的一组支持程序。

polygon使用以下任何一种语法指定类型的值:

( ( x1 , y1 ) , ... , ( xn , yn ) )
  ( x1 , y1 ) , ... , ( xn , yn )
  ( x1 , y1   , ... ,   xn , yn )
    x1 , y1   , ... ,   xn , yn

其中点是包括多边形边界的线段的端点。

建议使用第一种语法输出多边形。

 

7、圆(circle)

圆由中心点和半径表示。circle使用以下任何一种语法指定类型的值:

< ( x , y ) , r >
( ( x , y ) , r )
  ( x , y ) , r
    x , y   , r

其中(xy)是中心点,r是圆的半径。

建议使用第一种语法输出圆。

 

示例:

test=# select point'(1,1)';
 point 
-------
 (1,1)
(1 row)

test=# select line'{1,1,1}';
  line   
---------
 {1,1,1}
(1 row)

test=# select lseg'(1,1),(2,2)';
     lseg      
---------------
 [(1,1),(2,2)]
(1 row)

test=# select box'(1,1),(2,2)';
     box     
-------------
 (2,2),(1,1)
(1 row)

test=# select path'(1,1),(2,2),(2,1)';
        path         
---------------------
 ((1,1),(2,2),(2,1))
(1 row)

test=# select path'[(1,1),(2,2),(2,1)]';
        path         
---------------------
 [(1,1),(2,2),(2,1)]
(1 row)

test=# select polygon'((1,1),(2,2),(2,1))';
       polygon       
---------------------
 ((1,1),(2,2),(2,1))
(1 row)

test=# select circle'<(0,0),1>';
  circle   
-----------
 <(0,0),1>
(1 row)

 

二、几何操作符

操作符

描述

示例

结果

+

平移

select box '((0,0),(1,1))' + point '(2.0,0)';

(3,1),(2,0)

-

平移

select box '((0,0),(1,1))' - point '(2.0,0)';

(-1,1),(-2,0)

*

伸缩/旋转

select box '((0,0),(1,1))' * point '(2.0,0)';

(2,2),(0,0)

/

伸缩/旋转

select box '((0,0),(2,2))' / point '(2.0,0)';

(1,1),(0,0)

#

交点或者交面

select box'((1,-1),(-1,1))' # box'((1,1),(-1,-1))';

(1,1),(-1,-1)

#

pathpolygon的顶点数

select #path'((1,1),(2,2),(2,1))';

3

@-@

长度或周长

select @-@ path'((1,1),(2,2),(2,1))';

3.41421356237309

@@

中心

select @@ circle'<(0,0),1>';

(0,0)

##

第一个操作数和第二个操作数的最近点

select point '(0,0)' ## lseg '((2,0),(0,2))';

(1,1)

<->

间距

select circle '<(0,0),1>' <-> circle '<(5,0),1>';

3

&&

是否有重叠

select box '((0,0),(1,1))' && box '((0,0),(2,2))';

t

<<

是否严格在左

select circle '((0,0),1)' << circle '((5,0),1)';

t

>>

是否严格在右

select circle '((0,0),1)' >> circle '((5,0),1)';

f

&<

是否没有延伸到右边

select box '((0,0),(1,1))' &< box '((0,0),(2,2))';

t

&>

是否没有延伸到左边

select box '((0,0),(3,3))' &> box '((0,0),(2,2))';

t

<<|

是否严格在下

select box '((0,0),(3,3))' <<| box '((3,4),(5,5))';

t

|>>

是否严格在上

select box '((3,4),(5,5))' |>> box '((0,0),(3,3))';

t

&<|

是否没有延伸到上面

select box '((0,0),(1,1))' &<| box '((0,0),(2,2))';

t

|&>

是否没有延伸到下面

select box '((0,0),(3,3))' |&> box '((0,0),(2,2))';

t

<^

是否低于(允许接触)

select box '((0,0),(3,3))' <^ box '((3,3),(4,4))';

t

>^

是否高于(允许接触)

select box '((0,0),(3,3))' >^ box '((3,3),(4,4))';

f

?#

是否相交

select lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))';

t

?-

是否水平对齐

select ?- lseg '((-1,1),(1,1))';

t

?-

两边图形是否水平对齐

select point '(1,0)' ?- point '(0,0)';

t

?|

是否竖直对齐

select ?| lseg '((-1,0),(1,0))';

f

?|

两边图形是否竖直对齐

select point '(0,1)' ?| point '(0,0)';

t

?-|

是否垂直

select lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))';

t

?||

是否平行

select lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))';

t

@>

是否包含

select circle '((0,0),2)' @> point '(1,1)';

t

<@

是否包含于或在图形上

select point '(1,1)' <@ circle '((0,0),2)';

t

~=

是否相同

select polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))';

t

 

三、几何函数

函数

返回值类型

描述

示例

结果

area(object)

double precision

面积

select area(circle'((0,0),1)');

3.14159265358979

center(object)

point

中心

select center(box'(0,0),(1,1)');

(0.5,0.5)

diameter(circle)

double precision

直径

select diameter(circle '((0,0),2.0)');

4

height(box)

double precision

矩形竖直高度

select height(box '((0,0),(1,1))');

1

isclosed(path)

boolean

是否为闭合路径

select isclosed(path '((0,0),(1,1),(2,0))');

t

isopen(path)

boolean

是否为开放路径

select isopen(path '[(0,0),(1,1),(2,0)]');

t

length(object)

double precision

长度

select length(path '((-1,0),(1,0))');

4

npoints(path)

int

path中的顶点数

select npoints(path '[(0,0),(1,1),(2,0)]');

3

npoints(polygon)

int

多边形的顶点数

select npoints(polygon '((1,1),(0,0))');

2

pclose(path)

path

将开放path转换为闭合path

select pclose(path '[(0,0),(1,1),(2,0)]');

 ((0,0),(1,1),(2,0))

popen(path)

path

将闭合path转换为开放path

select popen(path '((0,0),(1,1),(2,0))');

[(0,0),(1,1),(2,0)]

radius(circle)

double precision

圆半径

select radius(circle '((0,0),2.0)');

2

width(box)

double precision

矩形的水平长度

select width(box '((0,0),(1,1))');

1

 

四、几何类型转换函数

函数

返回

类型

描述

示例

结果

box(circle)

box

圆形转矩形

select box(circle '((0,0),2.0)');

(1.41421356237309,1.41421356237309),(-1.41421356237309,-1.41421356237309)

box(point)

box

点转空矩形

select box(point '(0,0)');

(0,0),(0,0)

box(pointpoint)

box

点转矩形

select box(point '(0,0)', point '(1,1)');

(1,1),(0,0)

box(polygon)

box

多边形转矩形

select box(polygon '((0,0),(1,1),(2,0))');

(2,1),(0,0)

bound_box(boxbox)

box

将两个矩形转换成一个边界矩形

select bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))');

(4,4),(0,0)

circle(box)

circle

矩形转圆形

select circle(box '((0,0),(1,1))');

<(0.5,0.5),0.707106781186548>

circle(pointdouble precision)

circle

圆心与半径转圆形

select circle(point '(0,0)', 2.0);

<(0,0),2>

circle(polygon)

circle

多边形转圆形

select circle(polygon '((0,0),(1,1),(2,0))');

<(1,0.333333333333333),0.924950591148529>

line(pointpoint)

line

点转直线

select line(point '(-1,0)', point '(1,0)');

{0,-1,0}

lseg(box)

lseg

矩形转线段

select lseg(box '((-1,0),(1,0))');

[(1,0),(-1,0)]

lseg(pointpoint)

lseg

点转线段

select lseg(point '(-1,0)', point '(1,0)');

[(-1,0),(1,0)]

path(polygon)

path

多边形转path

select path(polygon '((0,0),(1,1),(2,0))');

((0,0),(1,1),(2,0))

point(double precisiondouble precision)

point

创建点

select point(23.4, -44.5);

(23.4,-44.5)

point(box)

point

矩形中心点

select point(box '((-1,0),(1,0))');

(0,0)

point(circle)

point

圆中心点

select point(circle '((0,0),2.0)');

(0,0)

point(lseg)

point

线段中心点

select point(lseg '((-1,0),(1,0))');

(0,0)

point(polygon)

point

多边形的中心

select point(polygon '((0,0),(1,1),(2,0))');

(1,0.333333333333333)

polygon(box)

polygon

矩形转4点多边形

select polygon(box '((0,0),(1,1))');

((0,0),(0,1),(1,1),(1,0))

polygon(circle)

polygon

圆形转12点多边形

select polygon(circle '((0,0),2.0)');

 

polygon(nptscircle)

polygon

圆形转npts点多边形

select polygon(12, circle '((0,0),2.0)');

 

polygon(path)

polygon

path转多边形

select polygon(path '((0,0),(1,1),(2,0))');

((0,0),(1,1),(2,0))

 

&lt;think&gt;好的,用户想了解PostGIS中的数据类型支持与用法,我需要结合之前的回答和提供的引用内容来整理一个清晰的回答。首先,用户之前的问题是关于ST_开头的函数与其他函数的对比,现在转向数据类型,我需要确保覆盖主要的数据类型,比如geometry和geography,还有栅格数据。 根据引用1,geometry类型的信息存储在geometry_columns表中,遵循OGC规范,用户在创建时会自动维护这个表。应该提到这一点,说明如何查看和管理geometry类型。 引用2提到了在MyBatis中使用TypeHandler处理PostGIS数据类型,特别是如何转换WKT格式。这可能和用户的实际应用相关,但用户现在的问题更偏向理论,所以可能需要简要提到如何与应用程序交互,比如通过WKT或WKB。 引用3讨论了geography类型转换为geometry来使用ST_X函数,这说明两种类型的区别和使用场景,比如地理坐标系和平面坐标系的差异,以及何时需要转换。 引用4提到了栅格数据,虽然引用不完整,但需要补充PostGIS的栅格支持,比如raster类型和相关函数。 接下来,我需要组织数据类型部分,可能分为几何、地理、栅格,以及复合类型如GeometryCollection。还要对比geometry和geography的不同,比如计算距离时的不同方法,以及空间函数的支持情况。 另外,用户可能想知道如何创建这些类型的字段,比如建表语句,以及如何插入数据,比如使用ST_GeomFromText等函数。引用1中的geometry_columns表需要解释,确保用户知道如何查询现有空间表的信息。 还要注意常见问题,比如选择geometry还是geography,可能的应用场景,比如地理分析使用geography,而平面地图使用geometry。同时,栅格数据的应用场景,如遥感或高程数据存储。 需要确保回答结构清晰,分点说明,并给出示例SQL语句,帮助用户理解如何实际操作。比如创建表、插入数据、查询等步骤,以及如何转换类型。 最后,相关问题部分要引导用户深入,比如性能优化、类型转换的影响,以及空间索引的应用。这些问题可以帮助用户进一步学习,解决实际中可能遇到的问题。&lt;/think&gt;### PostGIS数据类型详解及使用指南 --- #### 一、核心数据类型分类 PostGIS支持**几何(Geometry)**、**地理(Geography)**和**栅格(Raster)**三大类空间数据类型,满足不同的空间计算需求。 1. **几何类型(Geometry)** - **定义**:基于平面坐标系(如Web墨卡托),用于二维平面空间计算 - **适用场景**:地图可视化、工程测量、平面分析(如$ST\_Area$计算平面面积) - **子类型**: - 点(`POINT`)、线(`LINESTRING`)、面(`POLYGON`) - 集合类型(`MULTIPOINT`, `GEOMETRYCOLLECTION`等) - **元数据管理**:通过`geometry_columns`表自动记录所有几何字段的坐标系(SRID)、几何类型等信息[^1] ```sql -- 查看所有几何字段定义 SELECT * FROM geometry_columns; ``` 2. **地理类型(Geography)** - **定义**:基于地理坐标系(如WGS84),支持球面距离计算(如$ST\_Distance$返回米制单位) - **适用场景**:地球表面距离/面积计算(如计算两个城市间的实际距离) - **限制**:部分几何函数需先转换为Geometry类型[^3] ```sql -- 地理类型几何后提取坐标 SELECT ST_X(geog::geometry) AS longitude FROM city; ``` 3. **栅格类型(Raster)** - **定义**:存储像元矩阵数据(如卫星影像、高程模型) - **功能支持**:波段运算、栅格代数、与矢量数据叠加分析[^4] - **典型函数**:`ST_Intersects`(栅矢叠加分析)、`ST_Clip`(按几何裁剪栅格) --- #### 二、数据类型选择对比 | 特征 | Geometry | Geography | Raster | |---------------|----------------------|----------------------|---------------------| | **坐标系** | 平面坐标系(SRID) | 地理坐标系(SRID=4326) | 任意坐标系 | | **计算方式** | 平面几何计算 | 球面地理计算 | 像元矩阵运算 | | **性能** | 高(适合局部地图) | 低(需球面计算) | 中等(依赖数据量) | | **典型函数** | `ST_Area`, `ST_Length` | `ST_Distance` | `ST_Union`, `ST_Reclass` | --- #### 三、数据类型操作实践 1. **创建空间表** ```sql -- 创建包含几何字段的表 CREATE TABLE roads ( id SERIAL PRIMARY KEY, name VARCHAR(64), geom GEOMETRY(LINESTRING, 3857) -- 指定类型和坐标系 ); ``` 2. **数据插入方法** - **WKT格式**(人类可读): ```sql INSERT INTO roads (geom) VALUES (ST_GeomFromText(&#39;LINESTRING(0 0, 10 10)&#39;, 3857)); ``` - **WKB格式**(二进制高效): ```sql INSERT INTO roads (geom) VALUES (ST_GeomFromEWKB(E&#39;\\x0010...&#39;)); ``` 3. **类型转换** - **隐式转换**:部分函数自动处理类型转换 ```sql SELECT ST_Distance(geom::geography, target_geog) FROM points; ``` - **显式转换**:使用`::`操作符或转换函数 ```sql SELECT ST_AsText(geom) FROM (SELECT geog::geometry AS geom FROM cities) t; ``` --- #### 四、应用开发集成 1. **Java类型映射** - **实体类设计**:使用`org.postgis.Geometry`类型或自定义类型处理器[^2] ```java public class Road { private PGgeometry geom; // PostGIS几何对象 // WKT格式转换方法 public String getGeomAsWKT() { return geom.getGeometry().toWKT(); } } ``` 2. **空间索引** - 使用`CREATE INDEX`加速空间查询: ```sql CREATE INDEX roads_geom_gist ON roads USING GIST (geom); ``` --- #### 五、常见问题解答 **Q1: 何时选择Geometry/Geography?** - 需要球面距离计算(如GPS轨迹分析)&rarr; Geography - 平面地图可视化或局部区域分析&rarr; Geometry **Q2: 如何解决函数不兼容问题?** - 使用显式类型转换:`geog::geometry` - 检查函数文档(如`ST_Distance`支持两种类型但计算结果不同) --- ### 流程图:数据类型选择决策 ```mermaid graph TD A[是否需要处理地球表面距离/面积?] --&gt;|是| B[使用Geography类型] A --&gt;|否| C{是否涉及栅格分析?} C --&gt;|是| D[使用Raster类型] C --&gt;|否| E[使用Geometry类型] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老油条

您的鼓励将是我创作的大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值