8.5. web上的WPS、Turf.js和空间数据处理

自由/开源软件和专有的地理信息系统软件都提供空间数据处理功能,如缓冲、并集、等高线、插值等。在前面的课程中,您使用QGIS和GDAL调用了其中一些。但是如果你想让人们通过网络浏览器运行这些功能呢?例如,假设您希望允许web地图的用户绘制一个多边形,然后查看该多边形内的总人口和诊所数量的计算。你可以将地理信息系统公开给许多人,而不需要他们安装任何地理信息系统软件。

OGC发布了一个规范,用于通过web服务调用空间数据处理。它被称为Web处理服务(WPS)规范。与您了解的其他OGC服务一样,它提供了一组可以调用的操作列表。这些是:GetCapabilities、DescribeProcess和Execute。当然,Execute操作是启动请求以实际执行处理的操作。服务器负责处理数据并将结果作为响应发送回。GML可用于在请求或响应中传输关于向量特征的信息。

正如您可能从运行GDAL和ArcToolbox工具中了解到的,空间数据处理函数有时需要许多输入参数。例如,缓冲区进程可能要求您指定缓冲区的宽度、是否将其应用于特征的两侧、端部是否应封顶或圆角等。每个工具都有自己的参数集和用于描述它们的语法。由于输入可能非常长和复杂(特别是如果包含几何图形),有时您可以将输入放在它们自己的XML文件中并将其发送到服务器,而不是像您在前面的课程中看到的WMS和WFS那样将所有参数作为GET请求放入URL。一些服务器和浏览器对HTTP GET请求的长度设置了限制,而HTTP POST请求通常要长得多。

WPS规范本身并没有说明WPS必须支持哪种类型的空间数据处理操作。这取决于构建和管理服务的人。可以包含数百种潜在操作。首次使用WPS时,可以调用GetCapabilities操作来找出可用的进程。

8.5.1. WPS服务器

GeoServer提供了WPS extension 揭示了自由/开源软件的一系列空间过程JTS Topology Suite ,以及GeoServer专门开发的一些其他进程。我们不会在本课程中安装此扩展,但如果您认为可以在工作场所或其他学术工作中使用此扩展,我建议您浏览文档。

Zoo Open WPS PlatformPyWPS 是FOSS WPS实现的其他示例。在专有领域,Esri ArcGIS服务器可以从您从ArcToolbox工具或脚本创建的ModelBuilder模型中提供WPS。

8.5.2. WPS客户端

有一些基于GUI的WPS客户端可供选择,允许您在文本框或下拉列表中选择工具并提供它们的参数。QGIS has a WPS plugin 这样可以工作,允许您从桌面调用WPS。

当直接从Web应用程序调用WPS时,某些Web Map API提供了可以帮助您的帮助程序类或库。 Leaflet 不是其中之一(我将在一分钟内解决)。OpenLayers通过使用 OpenLayers.WPSClient 支持WPS。实例化此对象时,将提供WPS服务器的URL。然后,您设置JavaScript对象,其中包含要调用的流程的所有参数。最后,您执行该过程并指定应对结果进行的处理。请参见网上提供的 OpenLayers开发人员示例

即使您使用WPS客户机插件、库或对象,您仍然需要熟悉流程及其文档,以便为参数提供正确的语法。语法上的一个错误会破坏整个处理操作。此外,WPS服务器和客户机通常处于早期阶段或成熟期,或者是专为不需要GUI和大量文档的高级用户设计的。

8.5.3. Turf.js作为WPS备选方案

许多空间处理操作相当普遍,并且GIS Web开发人员非常希望在不使用WPS的情况下调用这些操作。`Turf.js <http://turfjs.org/>`_ 库因在JavaScript环境中直接对GeoJSON向量进行地理处理而广受欢迎。换句话说,Turf与WPS不同,因为客户端计算机运行处理代码,而不是服务器。Turf是由Mapbox开发的,但可以在开放的 MIT许可 下自由使用和修改。通过Turf.js可用的操作包括分解,合并,相交,缓冲,聚合,计算质心等。

您可以将Turf.js下载到您自己的计算机上,或者通过 CDN 在线访问它。由于Turf.js可在GeoJSON上运行,因此非常适合Leaflet。大多数明显的Turf.js开发人员示例都是使用Mapbox的API展示的(出于明显的原因),但是从Leaflet调用它们的方式本质上是相同的。例如,以下代码段来自 Turf.js分析演练

// Using Turf, find the nearest hospital to library clicked
var nearestHospital = turf.nearest(e.layer.feature, hospitalFeatures);

在这种情况下,turf.nearest()函数的两个参数都是GeoJSON对象:一个表示类库建筑,另一个表示一组医院建筑。函数找到离单击的库最近的医院,并将其返回为GeoJSON。基本上,使用哪个API来显示输出GeoJSON并不重要。

8.5.4. 性能注意事项

在web上实现任何类型的空间数据处理之前,请考虑可以对数据进行预处理的方法,以消除实时计算的需要。当您在web上调用空间处理时,它会使您的服务器繁忙,并增加最终用户等待时间。在上面的示例中,可能可以在桌面GIS环境中预先计算离每个库最近的医院,并将其存储在库属性表中。然后您的代码只需要读取属性,而不是执行处理。

在某些情况下,由于要公开的分析参数和可能性的广泛性,预计算没有意义(例如,如果有20种不同的功能,您希望允许人们在库附近找到,或者,如果一个人可以键入某些不在原始数据集中的库的地址;因此,是否允许实时空间处理的决定应根据具体情况作出。

8.5.5. 在学期计划中实施空间数据处理

除非您以前有过使用WPS的经验,否则建议您将其集成到您的学期项目中,因为这将花费很短的时间。Turf.js实现将更适合术语项目的范围,因为它可以用更少的代码很快地实现。

这两种技术都不是项目的需求,尽管它们在许多场景中可能提供有用的功能。