2

将rgeo gem 从 0.6.0升级到 2.1.1 后,我们开始对某些以前从未给我们造成问题的几何图形进行“LinearRing 环测试失败”。(几何数据是从我们无法控制的外部来源生成的,并存储在 PostGIS 表中。)

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 环测试失败

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

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

我检查了其中一些未能通过 LinearRing 测试的几何形状,看来它们由于各种原因而失败。有些可能违反了绕圈顺序,而其他一些我看不出确切的问题。但关键是,这些都是我们以前能够使用的几何图形,现在正在引发错误。我想了解我们如何才能回到更宽松的模式。

笔记:

  • 这只发生在我的 Macbook(GEOS 版本 3.8.0)上,而不发生在我们的 Linux 生产服务器(GEOS 版本 3.5.0)上

参考:

4

2 回答 2

2

这似乎不是rgeogem 的问题,而是geosMac 上的底层库。

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

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

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

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

于 2020-04-13T17:14:46.467 回答
2

您很可能遇到了这个 [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

于 2019-11-24T20:14:13.317 回答