PostGIS之Geometry

1. 概述

PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询

PostGIS官网:About PostGIS | PostGIS

PostGIS官方教程:PostGIS 简介 — Introduction to PostGIS

PostGIS相关教程:文章目录汇总 - 知乎 (zhihu.com)

本文基于官方教程描述PostGIS中的Geometry

2. 几何操作

2.1 创建一个空间表

创建空间表test

CREATE TABLE test(
	id SERIAL PRIMARY KEY,
	name VARCHAR(64),
	geom geometry
);

设置坐标系WGS-84,代码4326

SELECT UpdateGeometrySRID('test','geom',4326);

使用SQL插入数据:

INSERT INTO test VALUES(0, 'Point', 'POINT(0 0)'),
  (1, 'Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'),
  (2, 'Polygon', 'POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
  (3, 'PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))'),
  (4, 'Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0)))');

查询数据:

SELECT * FROM test;

image-20230103170909164

使用几何查看器查看:

image-20230103171018002

2.2 查询表属性

查询几何类型、维数、空间坐标系代码

SELECT id, name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom)
FROM test;

image-20230103230402194

2.3 查询Point属性

查询点的X、Y坐标:

SELECT id, name, ST_X(geom), ST_Y(geom)
FROM test WHERE name = 'Point';

image-20230103231407133

2.4 查询LineString属性

查询LineString属性的的函数主要有:

  • ST_Length(geometry) —— 返回线串的长度
  • ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回
  • ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回
  • ST_NPoints(geometry) —— 返回线串的坐标数量
SELECT id, name, ST_Length(geom), ST_StartPoint(geom), ST_EndPoint(geom), ST_NPoints(geom)
FROM test WHERE ST_GeometryType(geom) = 'ST_LineString';

image-20230103231953550

2.5 查询Polygon属性

查询Polygon属性的函数主要有:

  • ST_Area(geometry) —— 返回多边形的面积
  • ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)
  • ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环
  • ST_InteriorRingN(geometry, n) —— 以线串形式返回指定的内部环
  • ST_Perimeter(geometry) —— 返回所有环的长度
SELECT id, name, ST_Area(geom), ST_NRings(geom), ST_AsText(ST_ExteriorRing(geom)),
ST_InteriorRingN(geom, 1), ST_Perimeter(geom)
FROM test WHERE ST_GeometryType(geom) = 'ST_Polygon';

image-20230103233625230

2.6 查询Collection属性

Collection包含:

  • MultiPoint —— 点集合
  • MultiLineString —— 线串集合
  • MultiPolygon —— 多边形集合
  • GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合

查询Collection属性的函数主要有:

  • ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量
  • ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分
  • ST_Area(geometry) —— 返回集合中所有多边形组成部分的总面积
  • ST_Length(geometry) —— 返回所有线段组成部分的总长度
SELECT id, name, ST_NumGeometries(geom), ST_GeometryN(geom, 1), ST_Area(geom), ST_Length(geom) 
FROM test WHERE ST_GeometryType(geom) = 'ST_GeometryCollection';

image-20230103234423721

2.7 Geometry数据格式

2.7.1 WKT

PostGIS支持Well-known text(WKT),主要函数有:

  • ST_GeomFromText(text, srid) —— 返回geometry
  • ST_AsText(geometry) —— 返回text
  • ST_AsEWKT(geometry) —— 返回带有srid的text
SELECT ST_GeomFromText('Point(1 0)',4326), ST_AsText(geom), ST_AsEWKT(geom)
FROM test WHERE ST_GeometryType(geom) = 'ST_Point';

image-20230103235230044

2.7.2 WKB

Well-known binary(WKB

  • ST_GeomFromWKB(bytea) —— 返回geometry
  • ST_AsBinary(geometry) —— 返回bytea
  • ST_AsEWKB(geometry) —— 返回bytea
SELECT ST_AsBinary(geom), ST_AsEWKB(geom), ST_GeomFromWKB(ST_AsBinary(geom))
FROM test WHERE ST_GeometryType(geom) = 'ST_Point';

image-20230103235934268

2.7.3 GML、KML、GeoJSON和SVG

Geographic Mark-up Language(GML

  • ST_GeomFromGML(text) —— 返回geometry
  • ST_AsGML(geometry) —— 返回text

Keyhole Mark-up Language(KML

  • ST_GeomFromKML(text) —— 返回geometry
  • ST_AsKML(geometry) —— 返回text

GeoJson

  • ST_AsGeoJSON(geometry) —— 返回text

Scalable Vector Graphics(SVG

  • ST_AsSVG(geometry) —— 返回text
SELECT ST_AsGML(geom), ST_AsKML(geom), ST_AsGeoJson(geom), ST_AsSVG(geom)
FROM test WHERE ST_GeometryType(geom) = 'ST_Point';

image-20230104001327247

3. 参考资料

[1]9. 几何(Geometries) — Introduction to PostGIS

[2]PostGIS教程六:几何图形(geometry) - 知乎 (zhihu.com)

[3]PostGIS 3.3.3dev Manual

[4]PostGIS Cheat Sheet

posted @ 2023-01-01 20:59  当时明月在曾照彩云归  阅读(744)  评论(0编辑  收藏  举报