PostGIS之Geometry

postgis,geometry · 浏览次数 : 356

小编点评

## PostGIS 几何操作指南 **1.简介** PostGIS 是一个开源空间数据库扩展,允许在 SQL 中运行空间查询。本文将介绍如何创建一个空间表、查询表属性、查询几何类型、维数、空间坐标系代码等。 **2.创建空间表** ```sql CREATE TABLE test(\tid SERIAL PRIMARY KEY,\tname VARCHAR(64),\tgeom geometry); ``` **3.设置坐标系** ```sql SELECT UpdateGeometrySRID('test','geom',4326); ``` **4.插入数据** ```sql ( SELECT 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)))' ) INTO test; ``` **5.查询数据** ```sql SELECT * FROM test; ``` **6.使用几何查看器** ``` 2.2 查询表属性查询几何类型、维数、空间坐标系代码 ``` ```sql SELECT id, name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom)FROM test; ``` **7.查询Point属性查询点的X、Y坐标** ```sql SELECT id, name, ST_X(geom), ST_Y(geom)FROM test WHERE name = 'Point'; ``` **8.查询LineString属性查询LineString属性的函数** ```sql SELECT id, name, ST_Length(geom), ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回 ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回 ST_NPoints(geometry) —— 返回线串的坐标数量 ``` **9.查询Polygon属性查询Polygon属性的函数** ```sql SELECT id, name, ST_Area(geometry), ST_NRings(geometry) —— 返回多边形的面积 ``` **10.查询Collection属性Collection包含:MultiPoint —— 点集合MultiLineString —— 线串集合MultiPolygon —— 多边形集合GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合查询Collection属性的函数主要有 ```sql SELECT id, name, ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量 ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分 ST_Area(geometry) —— 返回多边形的面积 ``` **11.参考资料** * [1] Introduction to PostGIS * [2] PostGIS教程六:几何图形(geometry) - 知乎 (zhihu.com) * [3] PostGIS 3.3.3dev Manual * [4] PostGIS Cheat Sheet

正文

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

与PostGIS之Geometry相似的内容: