PostGIS在PostgreSQL上的目的是什么?


49

PostgreSQL已经支持空间数据类型,运算符和索引。

PostGIS到底提供了什么,使得有必要作为PostgreSQL的扩展而存在?

为什么我们不都使用PostgreSQL的空间功能?


2
PostGIS提供了这些空间数据类型,运算符和索引...
DPSSpatial

5
不,他在谈论本地PostgreSQL几何类型。
埃文·卡罗尔

4
简短的答案是,PostGIS(现在)的功能是PgSQL类型的10倍。长答案涵盖了以下问题:“为什么要开发新类型,而不仅仅是改进已经存在的类型”。
保罗·拉姆齐

1
Java Spring框架也发生了同样的事情。Java具有缺陷/缺失功能。Spring修复了许多Java缺陷并添加了有用的功能。Java复制了Spring的修订+功能。人们然后问为什么春天存在...
尼尔·麦圭根

Answers:


86

如果将宇宙重新缠绕到2001年初,不仅让PostGIS的发明者看到未来,而且让PgSQL的PSC看到未来,那么PostGIS可能是PgSQL上的一系列补丁。但是至少,如果我们最初是作为核心的补丁开始的,那么我们遇到的第一件事就是:

  • 核心PgSQL区域不支持漏洞,但是GIS模型确实需要漏洞,我们可以更改吗?

核心PgSQL会说:“不,当然不是,区域具有现有的易于理解的语义,我们不能像这样进行向后不兼容的更改”。

作为非核心开发人员,PostGIS能够淘汰多年的每月和每月六个月的发行版,而PgSQL核心随着年度和更长的发行版而下降。由于我们在项目中拥有提交权限,因此我们还可以随时添加所需的任何功能,但是在PgSQL中获得提交权限需要很长时间。

到PostGIS展示足够的外部价值时,PgSQL内核便开始对自己说:“呵呵,作为一个附加功能,将其包含在内核中将是一件很不错的事”,已经有如此多的代码具有与标准不同的标准和样式。 PgSQL(更不用说使用不兼容的许可证了),合并的想法实际上是不可能的。

取而代之的是,PostGIS已成为“真正的大型复杂扩展”的典型示例,该扩展可帮助PgSQL保持模块化和可扩展性。当核心PgSQL评估某些更改时,经常会问到“如何影响PostGIS之类的问题”。这也是一件好事,也许还不如PostGIS作为核心的一部分那么好,但是足够好。

还有其他原因,例如PgSQL核心不愿看到的一长串依赖关系,他们本来希望不断改善的普遍较低的代码一致性和API清洁度。即使从概念上来说,PostGIS对于PgSQL来说也是一个巨大的障碍,无法一口吞下。


另外... PostGIS是C ++。这将是PostgreSQL合并的最佳选择,无论是否应该如此。依赖关系也会完全阻止它-GDAL?哈!我什至不能让内核同意依赖Perl> 5.8.0。即使您具有承诺权限,开发速度也很慢;提交者不仅可以免费获得树上所有推销的东西,还必须经过代码审查,并在数月或数年内获得重大变更。有一些代码质量上的好处,但它肯定不会很快发展。
Craig Ringer'1

核心Pg不断重塑事物是一个特别的问题,以避免依赖更多的外部库。因为这意味着在$ dead_architecture上带有$ weird_vendor_compiler的$ ancient_unix_42必须支持它,所以所有buildfarm成员都需要更新,等等。这是成熟且稳定的问题之一。
Craig Ringer

@CraigRinger为什么您认为PostGIS是C ++?:-)
NicklasAvén17年

是...不是吗?我可以发誓。但可以肯定的是,它看起来并不像它。我的错。无论如何,我实际上都喜欢(适度和克制)使用C ++。
Craig Ringer'1

4
在一段时间内,PostGIS拥有一些C ++,以便与GEOS绑定。一旦GEOS添加自己的C API,这些作品均取了PostGIS变成了“纯” C.
保罗·拉姆齐

34

事实并非如此,PostgreSQL不支持Spatial数据类型。它支持几何类型。这些对于某些事情来说是完美的,但它们与现实世界的坐标系统完全分开。本机类型

更新资料

至于索引问题,在FAQ中

为什么不支持PostgreSQL R-Tree索引?

PostGIS的早期版本使用PostgreSQL R-Tree索引。但是,自版本0.6起,PostgreSQL R-Trees已被完全丢弃,并且通过GiST上的R-Tree提供了空间索引。

我们的测试表明,本地R-Tree和GiST的搜索速度相当。本地PostgreSQL R-Tree有两个限制,这使它们不适合与GIS功能一起使用(请注意,这些限制是由于当前PostgreSQL本地R-Tree实现,而不是通常的R-Tree概念引起的):

  • PostgreSQL中的R-Tree索引不能处理大于8K的功能。GiST索引可以使用“有损”技巧将边界框替换为要素本身。

  • PostgreSQL中的R-Tree索引不是“空安全的”,因此在包含空几何的几何列上建立索引将失败。[GiST索引为null安全]


您能否扩展到最后一点-有关GiST索引的那一点?PostgreSQL提供R-Tree,现在通过GiST索引提供R-Tree,所以我对此感到困惑。
Zeruno

已使用常见问题解答中的直接文字进行了更新。
埃文·卡罗尔

1
GiST API是access / gist.h提供的PostgreSQL东西。您可以在PostGIS中
Evan Carroll

3
尽管PostGIS确实具有自己的rtree-on-gist实施,但它与PgSQL所使用的那种对图形对象的核心支持非常相似,原因很简单,最初我们复制了它们。
保罗·拉姆齐

1
@Zeruno,不,在PgSQL中修改rtree分隔符不会更改PostGIS的行为,因为我们在gserialized_gist_picksplit_2d()中拥有自己的分隔符。您不会认为它与PgSQL并没有什么不同。
保罗·拉姆齐

8

PostGISPostgreSQL对象关系数据库的空间数据库扩展程序 。它增加了对地理对象的支持,允许在SQL中运行位置查询。

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';

除了基本的位置意识外,PostGIS还提供了许多其他竞争性空间数据库(如Oracle Locator / Spatial和SQL Server)中很少见的功能。有关更多详细信息,请参见PostGIS功能列表

PostGIS功能列表还扩展了这些功能:

PostGIS向PostgreSQL数据库添加了额外的类型(几何,地理,栅格和其他类型)。它还添加了适用于这些空间类型的函数,运算符和索引增强功能。这些附加功能,运算符,索引绑定和类型增强了核心PostgreSQL DBMS的功能,使其成为一种快速,功能丰富且健壮的空间数据库管理系统。

功能列表

PostGIS 2+系列提供:

  • 矢量和栅格数据的处理和分析功能,用于拼接,切块,变形,重分类以及使用SQL栅格地图代数的功能进行收集/联合,以进行细粒度的栅格处理
  • 向量和栅格数据的空间重投影SQL可调用函数通过命令行和GUI打包工具支持导入/导出ESRI shapefile向量数据,并通过其他第三方开放源代码工具支持更多格式
  • 用于从多种标准格式导入栅格数据的打包命令行:GeoTiff,NetCDF,PNG,JPG

  • 使用SQL为标准文本格式(例如KML,GML,GeoJSON,GeoHash和WKT)呈现和导入矢量数据支持功能以各种标准格式GeoTIFF,PNG,JPG,NetCDF渲染栅格数据,仅举几例

  • 无缝的栅格/矢量SQL可调用函数,用于按几何区域挤出像素值,按区域运行统计信息,按几何剪切栅格以及对栅格进行矢量化3D对象支持,空间索引和功能网络拓扑支持打包的Tiger Loader / Geocoder / Reverse Geocoder /利用美国人口普查老虎数据

此外,本文已经提到的要点/部分。我想补充的PostGIS的网站上提到它是如何工作

由于PostGIS是用C语言编写的,因此它可以使用C和C ++中的其他库,而且使用起来很自由。PostGIS取决于:

  • 用于多种几何处理算法的GEOS
  • Proj.4用于坐标重新投影功能
  • GDAL用于栅格处理和格式支持
  • LibXML2用于XML解析
  • JSON-C用于JSON解析
  • SFCGAL提供扩展的3D支持和其他地理处理算法
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.