PostGIS 是一个功能强大的开源空间数据库,可用于存储、查询和分析地理空间数据。 对于需要存储和分析大量地理空间数据的组织来说,这是一个流行的选择。
但是,正确使用 PostGIS 以充分利用它很重要。 在本文中,我们将讨论 10 个 PostGIS 最佳实践,它们将帮助你充分利用 PostGIS 数据库。 我们将讨论数据类型、索引和查询优化等主题。
推荐:用 NSDT设计器 快速搭建可编程3D场景。
1、创建PostGIS空间索引以获得更快的查询性能
空间索引是存储表中要素空间位置的数据结构。 它们允许 PostGIS 快速识别哪些记录与给定查询匹配,而不是必须搜索表中的每条记录。 这使得查询更快、更高效。
创建空间索引相对简单。 你需要做的就是使用带有 GIST 选项的 CREATE INDEX 命令。 例如,如果你有一个名为“cities”的表,其中有一列名为“geom”,可以创建这样的索引:
CREATE INDEX cities_gist ON cities USING GIST (geom);
创建索引后,只要在表上运行查询,就会自动使用它。 这意味着任何时候你在某个区域或距离内查询表中的要素时,查询都会比没有索引快得多。
2、利用PostGIS栅格函数存储和操作大型数据集
PostGIS 栅格函数旨在有效地存储和操作大型数据集。 这是因为 PostGIS 以分块格式存储数据,这样可以在需要时更快地访问单个分块。 此外,PostGIS 可以使用空间索引快速定位数据集中的特定图块。
PostGIS 栅格函数还允许用户对数据执行各种操作,例如重采样、重投影和镶嵌。 这些操作可用于将数据转换为不同的格式或分辨率,使其更易于使用。 此外,PostGIS 提供了用于分析数据的工具,例如计算统计数据、执行图像处理和创建可视化。
3、利用 ST_AsMVT 创建矢量切片
ST_AsMVT 是一个 PostGIS 函数,允许用户从他们的 PostGIS 数据创建矢量切片。 矢量切片是小型轻量级文件,可用于快速高效地在网络上呈现大量地理数据。 通过利用 ST_AsMVT,用户无需编写任何额外代码或使用外部工具即可利用该技术。
使用 ST_AsMVT 创建矢量切片的过程相对简单。 用户只需定义他们想要生成的瓦片的参数(例如缩放级别、边界框和层名称),然后调用 ST_AsMVT 函数。 然后该函数将返回所请求图块的二进制表示形式,该图块可以直接提供给客户端。 这使得实时提供动态地图变得容易,而无需预先生成所有可能的图块。
4、预先聚合PostGIS表中的数据以减少查询时间
在 PostGIS 表中预先聚合数据可以通过减少需要处理的数据量来帮助减少查询时间。 通过预聚合数据,你实质上是在创建一个汇总表,其中仅包含分析所需的必要信息。 这意味着当运行查询时,它只需要处理汇总数据而不是所有原始数据点。
在 PostGIS 中预先聚合数据的方法是使用 SQL 查询。 你可以使用 SUM 或 AVG 等聚合函数创建一个新表,然后将此表连接到所需列上的原始表。 这将使你能够快速将数据汇总到一个表中,然后可以将其用于进一步分析。
此外,你还可以使用 PostGIS 函数(例如 ST_Union 和 ST_ClusterIntersects)将具有相似特征的几何组合在一起。 如果你想分析比单个特征更高级别的数据,这会很有用。 例如,你可以将一定半径内的所有建筑物组合在一起,然后计算这些建筑物的平均高度。
5、利用 PostGIS 的内置几何验证功能
PostGIS 是一个功能强大的空间数据库,允许用户存储和查询地理空间数据。 它为操作、分析和验证几何数据提供了广泛的功能。 PostGIS 的内置几何验证功能旨在确保数据库中存储的数据的准确性和完整性。 这些函数可用于检查几何数据是否满足特定条件,例如在指定区域内或具有特定大小。
使用这些函数有助于防止在处理地理空间数据时发生错误。 例如,如果应用程序要求多边形具有四个边,则使用 ST_IsValid 函数将有助于确保只有具有四个边的多边形被接受到数据库中。 这可以防止任何无效数据进入系统并导致问题发生。
此外,使用 PostGIS 的内置几何验证功能可以通过减少手动检查所花费的时间来提高性能。 通过自动化流程,开发人员可以将精力集中在其他任务上,而不是手动检查每条数据。
6、利用PostGIS强大的SQL/MM标准兼容功能
PostGIS 是 PostgreSQL 数据库的开源扩展,增加了对地理对象的支持。 它允许用户在关系数据库中存储、查询和操作空间数据。 通过利用符合 SQL/MM 标准的功能,PostGIS 可用于轻松执行复杂的空间分析任务。
SQL/MM (Spatial) 是表示和操作数据库中空间数据的国际标准。 它定义了一组函数和运算符,允许用户使用存储在数据库中的空间数据。 这些功能旨在通过跨不同数据库提供一致的界面,使处理空间数据变得更加容易。
使用这些函数可以编写可跨不同数据库移植的查询。 这意味着如果你需要从一个数据库切换到另一个数据库,只要它们使用相同的 SQL/MM 函数,你的查询仍然可以工作。 此外,使用 SQL/MM 函数可确保你的查询针对性能进行了优化,因为该函数的底层实现已经针对特定数据库进行了优化。
7、尽可能使用 PostGIS 的原生几何类型
PostGIS 是一个功能强大的地理空间数据库,允许用户存储、查询和操作空间数据。 它为点、线、多边形和栅格等最常见的地理空间类型提供本地支持。 通过使用 PostGIS 的原生几何类型而不是文本或其他格式,用户可以利用 PostGIS 的内置函数和运算符,这些函数和运算符针对这些类型进行了优化。 这使得对数据执行复杂的查询和分析变得更加容易。
使用 PostGIS 的原生地理空间类型还有助于提高查询大型数据集时的性能。 由于 PostGIS 旨在处理这些类型,因此它可以快速处理它们而无需将它们从另一种格式转换。 此外,由于 PostGIS 以其本机格式存储数据,因此在对其执行操作之前无需将数据解析为不同的格式。 这减少了处理数据所需的时间并提高了整体性能。
8、考虑使用 PostGIS 扩展
例如,pgRouting 是 PostGIS 的开源扩展,它提供了一组功能和工具来解决路由问题。 它允许用户找到两点之间的最短路径,计算沿某条路线行驶的成本,甚至可以规划多站路线。 pgRouting 还支持高级功能,例如网络分析、车辆路线和转弯限制。
将 pgRouting 与 PostGIS 结合使用可以更轻松地存储、查询和分析空间数据。 这种组合使用户能够快速创建复杂的查询并对他们的数据执行复杂的分析。 例如,他们可以轻松计算出两点之间的距离或确定从一点到另一点的最佳路线。 此外,pgRouting 对网络分析的支持意味着用户可以识别高流量密度区域或为新设施找到最佳位置。
9、将 PostGIS 数据存储在单独的Schema中
使用 PostGIS 时,将空间数据和非空间数据分开很重要。 这有助于确保数据库保持有序和高效。 通过将两种类型的数据保存在不同的模式中,可以针对每种类型的数据优化查询。 例如,空间数据的查询可能需要比非空间数据的查询更复杂的计算,因此将它们放在不同的模式中允许查询优化器相应地优化查询。
它还可以更轻松地管理权限。 当所有空间数据都存储在一个模式中时,授予或撤销对该模式的访问权限比管理单个表要简单得多。 此外,如果有多个用户访问同一个数据库,他们可以拥有自己的模式和自己的一组权限。
为 PostGIS 数据创建单独的模式相对简单。 你需要做的就是在数据库中创建一个新模式,然后将相关表移入其中。 一旦表被移动,任何引用这些表的现有视图或函数都需要更新以使用新的模式名称。 最后,任何需要访问 PostGIS 数据的用户都应该被授予新模式的权限。
10、对复杂查询使用存储过程
存储过程是预编译的 SQL 语句,可以从数据库中调用。 这意味着它们可以重复使用和共享,使它们成为管理复杂查询的有效方式。 与多次运行相同的查询相比,存储过程还提供更好的性能,因为代码已经为执行进行了编译和优化。
在 PostGIS 中使用存储过程允许用户利用其强大的空间功能。 例如,如果你需要计算两点之间的距离,可以创建一个使用 ST_Distance() 函数的存储过程。 与每次需要运行时写出整个查询相比,这将节省时间和资源。
此外,存储过程可以通过只允许特定用户访问特定查询来帮助提高安全性。 这可以防止未经授权的用户访问敏感数据或执行具有潜在危险的命令。
原文链接:10个PostGIS最佳实践 — BimAnt