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;

使用几何查看器查看:

2.2 查询表属性

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

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

2.3 查询Point属性

查询点的X、Y坐标:

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

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';

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';

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';

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';

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';

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';

3. 参考资料

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

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

[3]PostGIS 3.3.3dev Manual

[4]PostGIS Cheat Sheet

PostGIS之Geometry的更多相关文章

  1. PostGIS解析Geometry几何对象

    一.Geometry转WKT select st_astext(geom) where tableName; 二.PostGIS常用函数 wkt转geometry st_geomfromtext(wk ...

  2. PostGIS 操作geometry方法

    WKT定义几何对象格式: POINT(0 0) ——点 LINESTRING(0 0,1 1,1 2) ——线 POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2 ...

  3. (转)postgresql+postgis空间数据库使用总结

    转载地址:https://blog.csdn.net/qq_36588972/article/details/78902195 参考资料: pgrouting路径导航 https://www.cnbl ...

  4. postgresql,postgis,geoserver 发布地图服务,并用.net mvc openlayers3进行显示

    1.所需工具 postgres版本 9.6.1 对应的postgis geoserver 2.8.2 openlayers3 2.将postgres postgis ,geosever安装好,再用如下 ...

  5. PostGIS导入导出SHP文件常用命令

    SHP导入POSTGIS数据库 引用 直接导入数据库 shp2pgsql  -I -s 2437 -W GBK shop_point.shp public.ntable | psql -U postg ...

  6. 将PostGIS转化为GeoJSON

    #!/usr/bin/env python # -*- coding: utf-8 -*- import psycopg2 import json from geojson import loads, ...

  7. Linux 平台PostGIS安装

    1.前提条件: postgresql 9.6.1 已经通过源码方式安装完成并可成功运行. 2. other OS packets OS: CentOS 6.4 X64 X64: libxml2-dev ...

  8. PostgreSQL+PostGIS的使用 函数清单

    一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...

  9. QSQL导出mapfile和mapfile中PostGIS连接的一点心得

    昨天弄QSQL导出mapfile,一直遇到下图的错误 原因是QGIS在渲染图层时候使用了新的符号,在图层上右键-属性,如下图将符号修改就OK了 然后我尝试使用QGIS连接本机PostGIS数据,结果老 ...

  10. PostgreSQL9.1 with PostGIS 2.1.4 for mapping coordinates on linux/ubuntu 已经打包成deb 可下载

    For location based service, I try to use postgresql with postgis. You can download postgis from here ...

随机推荐

  1. 【Java SE进阶】Day10 缓冲流、转换流、序列化流 、打印流

    一.缓冲流 1.概述 比普通流更强大的IO流,可以增加读写的效率 组成 缓冲输入流:BufferedInputStream.BufferedReader 缓冲输出流:BufferedOutputStr ...

  2. 【重难点】函数式接口、函数式编程、匿名内部类、Lambda表达式、语法糖

    一.函数式接口 1.概念 仅有一个抽象方法的接口 适用于函数式编程(Lambda表达式) 常见:Runnable.Comparator<>.生产型接口Producer的get方法.消费型接 ...

  3. 基于EasyCode定制Mybatisplus全自动单表实现:新增/批量新增/修改/批量删除/分页查询/ID查询

    基于EasyCode定制Mybatisplus全自动单表实现CRUD接口 分页查询 ID查询 新增 批量新增 修改 批量删除 注意使用了MybatisPlus的自动填充功能,和insertBatchS ...

  4. ChatGPT 加图数据库 NebulaGraph 预测 2022 世界杯冠军球队

    一次利用 ChatGPT 给出数据抓取代码,借助 NebulaGraph 图数据库与图算法预测体坛赛事的尝试. 作者:古思为 蹭 ChatGPT 热度 最近因为世界杯正在进行,我受到这篇 Cambri ...

  5. windowserver中PowerShell禁止脚本执行的解决方法

    最近工作中在上线项目的时候安装Exceptionless时,运行powershell脚本,发现报错: 报错提示:You cannot run this script on the current sy ...

  6. java中的instanceof方法

    本文主要讲述java中的instanceof()方法. 示例代码如下: public class InstanceTest { public static void main(String[] arg ...

  7. 使用pip命令安装库时提示Could not build wheels for six, since package 'wheel' is not installed

    在使用pip命令安装库时提示Could not build wheels for six, since package 'wheel' is not installed 解决以上问题可用 pip in ...

  8. 【机器学习】李宏毅——Domain Adaptation(领域自适应)

    在前面介绍的模型中,一般我们都会假设训练资料和测试资料符合相同的分布,这样模型才能够有较好的效果.而如果训练资料和测试资料是来自于不同的分布,这样就会让模型在测试集上的效果很差,这种问题称为Domai ...

  9. 基于 Traefik 如何实现 path 末尾自动加斜杠?

    前言 Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易. Traefik 可以与现有的多种基础设施组件(Docker.Swarm 模式.Kubernetes.Mara ...

  10. visualstudio2017 community版本,有点失去信心了,同样两行代码,外观看不出任何区别,但是一个报错

    不多废话,先上代码 注意查看函数fputs_FILE,该函数的两行代码fopen_s是同样的,但事实上: 第一条fopen_s执行起来会报错,但是第二条就不会!!! /* 练习:获取用户键盘输入,写入 ...