获取 InvalidGeometry:升级 rgeo 后 LinearRing 环测试失败 gem

Getting InvalidGeometry: LinearRing failed ring test after upgrading rgeo gem

rgeo gem 从 0.6.0 升级到 2.1.1 后,我们开始在某些几何图形上获得 'LinearRing failed ring test',这些几何图形以前从未给我们带来过问题。 (几何数据是从我们无法控制的外部来源生成的,并存储在 PostGIS table 中。)

rgeo 初始值设定项:

GEO_FACTORY = RGeo::Geographic.simple_mercator_factory
PROJECTION_FACTORY = GEO_FACTORY.projection_factory
RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config|
  config.default = PROJECTION_FACTORY
end

示例代码:

district = District.first
# Convert projected geometry to geographic geometry
geographic_geometry = GEO_FACTORY.unproject(district.geometry)

RGeo::Error::InvalidGeometry: LinearRing failed ring test

我也尝试使用以下选项初始化工厂,但错误仍然存​​在:

FACTORY = RGeo::Geographic.simple_mercator_factory(uses_lenient_assertions:true)
FACTORY = RGeo::Geographic.simple_mercator_factory(lenient_multi_polygon_assertions:true)

我检查了其中一些未通过 LinearRing 测试的几何体,它们似乎由于多种原因而失败。有些可能违反了 ring winding order,而对于其他一些我无法察觉确切的问题。但关键是,这些都是我们之前能够处理的几何图形,现在却出现了错误。我想了解我们如何 return 到更宽松的模式。

备注:

参考资料:

您很可能遇到了这个 [1] 错误。重现需要 Mac OS 并显示您遇到的错误:

  RGeo::Error::InvalidGeometry (LinearRing failed ring test)

问题与拉取请求 [2] 相关联,它发现了 Float 与 BigDecimal 差异的问题。不知何故,当包含足够多的小数时,浮点数并不那么精确。

旁注: 拉取请求只有 26 天了,所以它仍然是开放的,因此你暂时需要从分支构建它.


来源:

[1] https://github.com/rgeo/rgeo/issues/212

[2] https://github.com/rgeo/rgeo/pull/213

这似乎不是 rgeo gem 的问题,而是 mac.

上的基础 geos 库的问题

geos 3.8.x3.8.1 是 Homebrew 大约 4/13/2020 的最新版本)和 3.8.x 的早期版本似乎有所不同=11=] 库处理确定多边形有效性的 is_simple 计算。这会影响由 CAPI 支持的任何 RGeo 工厂(其中大多数工厂,但不包括 RGeo::Geographic.spherical_factoryRGeo::Cartesian.simple_factory)。

如果您从 https://trac.osgeo.org/geos/ 下载版本 3.5.x 的 geos 并使用 cmake 构建它(需要一段时间但安装干净),您的生产环境和本地开发环境之间的行为应该一致。

如果您使用的是 simple_mercator 工厂,我怀疑球坐标(在纯 ruby 中实现)验证方式的差异能否解释您所看到的行为差异。

看到这个问题:https://github.com/rgeo/rgeo/issues/218