PostgreSQL 教程: PostGIS 基础用法

十月 22, 2024

摘要:在本教程中,您将学习 PostGIS 的一些基础用法。

目录

介绍

PostGIS 是 PostgreSQL 最强大的扩展之一,它可以将数据库转换为 GIS(地理信息系统)。

在本教程中,我们加载了 2020 年纽约市人口普查数据的数据包。如果您想更深入地了解,此数据也是 PostGIS.net 教程的一部分。

本教程包含相当多的数据,加载需要一些时间,因此请耐心等待。

查找单点

SELECT name, ST_AsText(geom)
  FROM nyc_subway_stations
  LIMIT 10;

计算面积

以平方米为单位

SELECT ST_Area(geom)
  FROM nyc_neighborhoods
  WHERE name = 'West Village';

计算长度

SELECT ST_Length(geom)
  FROM nyc_streets
  WHERE name = 'Columbus Cir';

纽约市的街道长度,按类型汇总是多少?

SELECT type, Sum(ST_Length(geom)) AS length
FROM nyc_streets
GROUP BY type
ORDER BY length DESC;

空间参考标识符 (SRID)

在转换坐标数据(比如使用ST_GeomFromText())时,需要一种从纬度/经度转换为内部表示的标准化方法。PostGIS 在安装时会附带一个 spatial_ref_sys 空间参考表,其中包含最常见的、在 GIS 产品中标准化的空间参考。在本例中,我们使用 26918 的 id,它是以北美为中心的投影的常用投影。

从一个点外推

找到该点

SELECT name, ST_AsText(geom)
FROM nyc_subway_stations
WHERE name = 'Broad St';
   name   |                 st_astext                  
----------+--------------------------------------------
 Broad St | POINT(583571.9059213118 4506714.341192182)
(1 row)

查找该点的市区和行政区名称。

SELECT name, boroname
FROM nyc_neighborhoods
WHERE ST_Intersects(geom, ST_GeomFromText('POINT(583571 4506714)',26918));

空间联接

SELECT
  subways.name AS subway_name,
  neighborhoods.name AS neighborhood_name,
  neighborhoods.boroname AS borough
FROM nyc_neighborhoods AS neighborhoods
JOIN nyc_subway_stations AS subways
ON ST_Contains(neighborhoods.geom, subways.geom)
WHERE subways.name = 'Broad St';

距离

从一个点到另一个点

SELECT ST_Distance(a.geom, b.geom)
FROM nyc_streets a, nyc_streets b
WHERE a.name = 'Columbus Cir'
AND b.name = 'Atlantic Commons';

或者通过距离找到附近的东西。例如,距离 Broad Street 车站 10 米的街道(距某个点的距离)。

SELECT name
FROM nyc_streets
WHERE ST_DWithin(
        geom,
        ST_GeomFromText('POINT(583571 4506714)', 26918),
        10
      );

想要进一步测试 QGIS 或更多 postgis 查询,请参阅 使用 PostGIS 进行基础的地理空间数据查询