2022-04-08-PostGIS

PostGIS

OGC Geometry几何类型

Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection

WKT 和 WKB

OGC SFA 规范定义了两种用于表示几何值的格式:WKT 和 WKB,他们都包含有关对象的类型和坐标信息

WKT 提供了空间数据的标准文本表示。WKT 的输入和输出由 ST_AsTextST_GeomFromText 函数提供:

INSERT INTO geotable ( geom, name ) VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');

WKB 提供了一种可移植的、全精度的空间数据表示为二进制数据(字节数组)。WKB 的输入和输出由函数 ST_AsBinaryST_GeomFromWKB 提供:

INSERT INTO geotable (geom, name) VALUES (ST_GeomFromWKB('\x0101000000000000000000f03f000000000000f03f', 312), 'A Place');
创建空间表(Spatial Tables)
CREATE TABLE roads (
    id SERIAL PRIMARY KEY,
    name VARCHAR(64),
    geom geometry(LINESTRING,3005)
);

PostGIS 的 geometry 数据类型支持两个可选的类型修饰符:

  • 空间类型修饰符(spatial type modifier)

    限制列中允许的形状和尺寸类型。该值可以是任何受支持的几何类型,比如Point、LineString等

    该修饰符通过添加后缀来支持坐标维数限制:Z、M 和 ZM。例如,“LINESTRINGM”的修饰符只允许具有三个维度的线,并将第三个维度视为度量。

  • SRID修饰符(SRID modifier)

    将空间参考系统SRID限制为特定数字。如果省略,SRID 默认为 0。

地理数据类型

PostGIS 中 geometry 数据类型的基础是平面。平面上两点之间的最短路径是直线。这意味着几何上的函数(面积、距离、长度、交叉点等)是使用直线向量和笛卡尔数学计算的。这使它们更易于实现和更快地执行,但也使它们对于地球球体表面上的数据不准确。

geography 数据类型基于球形模型。球体上两点之间的最短路径是一个大圆弧。地理上的函数(面积、距离、长度、交叉点等)是使用球体上的弧计算的。通过考虑世界的球体形状,这些函数可提供更准确的结果。

创建地理表
CREATE TABLE global_points ( 
    id SERIAL PRIMARY KEY, 
    name VARCHAR(64), 
    location geography(POINT,4326) 
);

INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)'); 
INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)'); 
INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');

geography 类型支持两个可选的类型修饰符:

  • 空间类型修饰符(spatial type modifier)

    限制列中允许的形状和尺寸类型。允许的值为:POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION。

    地理类型不支持曲线、TINS 或 POLYHEDRALSURFACE。该修饰符通过添加后缀来支持坐标维数限制:Z、M 和 ZM。

  • SRID修饰符(SRID modifier)

    将空间参考系统 SRID 限制为特定数字。如果省略,SRID 默认为 4326。

-- 使用 1000 公里容差的距离查询
SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);

-- 距离计算使用 GEOGRAPHY 
SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography); 

-- 距离计算使用 GEOMETRY 
SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geometry, 'POINT(-21.96 64.15)'::geometry); 

通过计算从西雅图到伦敦的航线 (LINESTRING(-122.33 47.606, 0.0 51.5)) 到 Reykjavik (POINT(-21.96 64.15))的距离(地图路线)。

地理类型计算 Reykjavik 和航线飞行路径之间的真实最短距离为 122.235 公里。

几何类型计算 Reykjavik 与绘制在世界平面地图上的航线直线路径距离。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值