20年前,postgis用户邮件列表(当时托管在yahoogroups.com上)上的第一封电子邮件发出,宣布了PostGIS的第一个编号版本。
PostGIS的早期历史与一家前几年成立的咨询公司Refractions Research紧密相连。这家公司的早期合同是与不列颠哥伦比亚省(BC)的省政府管理人员签订的,由于BC省政府的特殊原因,他们不愿意使用ESRI软件,因此这个资讯公司积累的技能和经验超出了大多数 "GIS公司 "的业务。
公司擅长数据库,以及FME,擅长Perl,还有Java。这家公司是当地开发的(现在已经不存在了)数据分析工具Facet的专家,因为这是他们头四年左右的主要业务。
Facet工具是BC政府在20世纪90年代末委托Facet开发的 "watershed analysis atlas"的关键部分。该公司作为分包商工作,建立了分析程序,将几十个环境层吸进去,按分水岭切分,然后输出每个分水岭都有的整齐的表格和地图。考虑到那个时代的计算能力,他们不得不使用多个工作站来运行全省范围内的最终分析。为了管理工作队列并跟踪中间结果,把它们全部放入PostgreSQL的表格中。
把空间数据的碎片作为Blobs放到PostgreSQL中,是PostGIS的灵感来源。很明显,他们已经有了一个交互式的实时分析引擎,数据库中所有这些处理过的数据,如果他们能对这些数据做更多的处理,而不仅仅是把它们塞进去再取出来。
也许我们应该做空间数据库?
阅读2000年左右的空间数据库,你会发现:
- 当时有Oracle 8i空间数据选项(SDO)。
- 有一个OpenGIS Simple Features for SQL规范(SFSQL)。
- 除此之外就没有什么了。
这导致了他们的两个计划,其中一个成功了,另一个没有。
首先,他们开始探索不列颠哥伦比亚省政府是否有机会让一个咨询公司掌握Oracle的空间功能。BC省实际上是以Oracle作为所有政府事务的标准化的官方数据库。但是,尽管他们与当地的销售代表合作寻找可能对空间功能感兴趣的地方,还是没有找到。
现有的大型Oracle部门(财政、司法)不做空间工作,而空间性很强的自然资源部门(森林、环境)仍然深陷于 "GIS是特殊的 "的思维空间,不认为 "空间数据库 "有任何用途。事实证明,这可能是一件好事。
他们的第二个空间数据库计划是探索OpenGIS Simple Features for SQL规范中所描述的任何空间模型是否真的实用。除了描述空间类型和功能外,该规范还描述了三种存储表的空间部分的方法。
- 在一组边表中(方案1a),每个特征被分解为x和y,存储在数字表的行和列中。
- 在一个 "二进制大对象"(BLOB)中(方案1b)。
- 在一个 "几何类型 "中(方案2)。
由于分水岭的工作给了他们使用PostgreSQL的经验,所以用该数据库进行了测试,探索:能否在数据库中存储空间数据,并足够有效地将其提取出来,以制作一个基于数据库的空间查看器。
对于查看器的部分,使用一个叫做JShape的Java小程序进行所有的实验。他们很喜欢JShape,并为客户建立了一些小的地图查看器网页,所以把它与动态数据源而不是文件联系起来,是一个相当令人期待的举措。
所有的开发工作都是在该团队创办公司时贷款1万美元购买的可靠的Sun Ultra 10上进行的。当时,他们的收入有很大一部分来自Facet软件的编程,该软件只在Sun硬件上运行)。
- 第一个实验,把数据切碎成边表,然后重新组合起来显示,结果令人失望。它实在是太慢了,无法使用。
- 第二个实验,使用PostgreSQL BLOB接口来存储对象,速度快了很多,但还是有点令人失望。而且也没有明显的方法来为数据添加索引。
突破性进展
团队几乎没有进展:他们已经尝试了PostgreSQL用户级文档中解释的所有东西。团队中经验丰富的开发人员,比如Dave Blasby,他学过计算机科学(团队中的大多数人都有数学和物理学学位),看了PostgreSQL的代码和contrib部分,说只要给他点时间,他可能可以做一个自定义类型。
于是他花了几天时间进行尝试。他成功了!
当Dave有了一个工作原型后,团队把它连接到自己的小程序上。即使加载了相当大的表格在空间数据周围放大并绘制地图,它的速度也非常快。这是只在UNIX工作站上的XWindows显示器上见过的东西,而现在却在普通PC上的小程序中实现了,这很惊人。
团队已经很好地利用了PostgreSQL数据库,但PostgreSQL的扩展没有商业生态系统,所以PostGIS最好的商业用途似乎是把它作为开放源码 "放出去",看看它是否能产生一些内向的客户流量。
当时,Refractions可能有6名员工,他们中的许多人都做出了很多贡献。
- Dave Blasby继续打磨代码,增加了一些看起来有意义的额外功能。
- Jeff Lounsbury,另外一个会写C语言的工作人员,承担了将Shape files转换为SQL的工具的任务,以使加载空间数据更容易。
- 还有同事承担了为代码设置Makefile的工作,把它移到CVS库中,编写文档,并为开放源代码做好准备。
- Chris Hodgson,也在其他地方忙碌。
发布
最后,在5月31日,Dave发出了初始发布公告。这就是PostGIS 0.1,如果你愿意可以下载它。这第一个版本有一个 "geometry"类型,一个使用PostgreSQL GIST API的空间索引。还有以下函数:
- npoints(GEOMETRY)
- nrings(GEOMETRY)
- mem_size(GEOMETRY)
- numb_sub_objs(GEOMETRY)
- summary(GEOMETRY)
- length3d(GEOMETRY)
- length2d(GEOMETRY)
- area2d(GEOMETRY)
- perimeter3d(GEOMETRY)
- perimeter2d(GEOMETRY)
- truly_inside(GEOMETRY, GEOMETRY)
唯一的分析函数"true_inside() "只是测试一个点是否在一个多边形内。(关于PostGIS如何获得现在的许多其他分析函数的历史,参见Martin Davis博客上的JTS和GEOS的历史。)
通过阅读2001年的那些早期邮件列表帖子,PostGIS融入更广泛的开源地理空间生态系统的速度之快令人惊叹。在发布的第一个月内,有来自GDAL的Frank Warmerdam和MapServer的Daniel Morissette的帖子。来自Java GeoTools/GeoServer生态系统的开发者们也很早就出现了。
人们对开源空间数据库有巨大的需求,一切都在恰好正确的时间出现了。