【问题标题】:Getting InvalidGeometry: LinearRing failed ring test after upgrading rgeo gem获取 InvalidGeometry:LinearRing 升级 rgeo gem 后环测试失败
【发布时间】:2020-03-18 15:32:43
【问题描述】:

在将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 测试的几何形状,并且似乎由于各种原因它们未能通过。有些人可能违反ring winding order,而其他人我看不出确切的问题。但关键是,这些都是我们之前能够使用的几何图形,现在正在引发错误。我想了解我们如何才能回到更宽松的模式。

注意事项:

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

参考:

【问题讨论】:

    标签: ruby-on-rails ruby postgis geos rgeo


    【解决方案1】:

    这似乎不是 rgeo gem 的问题,而是你 Mac 上的底层 geos 库。

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

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

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

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

    【讨论】:

    • 我认为你是对的,非常感谢!我已经准备好让问题溜走,因为我认为它不会影响生产,但现在我知道我将不得不准备某种解决方法。将在github.com/rgeo/rgeo/issues/218 发表进一步的想法
    【解决方案2】:

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

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

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

    旁注:拉取请求只有 26 天,所以它仍然是开放的,因此你现在需要从分支构建它。 p>


    来源:

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

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

    【讨论】:

    • 我不确定跨平台错误是由浮点问题引起的(我也遇到过)。以下在 osx 和 linux 上都会引发异常:RGeo::Geographic.spherical_factory.parse_wkt('POLYGON((-93.572755591195 44.615834475162, -93.571098455347 44.613948476312, -93.571098455347 44.613948476313, -93.571098455347 44.613948476314, -93.571325365812 44.615739119667, -93.572627021193 44.613957229694, -93.572755591195 44.615834475162))') 但其他工厂 (RGeo::Geographic.simple_mercator_factory) 不同。它们在 osx 而不是 Linux 上抛出异常。
    • 我在mac和linux之间的区别上面的评论是不正确的。区别在于版本 3.8.x 与旧版本的 geos。这似乎是一个跨平台问题,因为自制软件在大多数 linux 发行版之前更新了版本,但是一旦 3.8 在 linux 发行版中下降(即 Ubuntu 的 focal),同样的问题将在那里可见。
    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2019-03-02
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2017-05-31
    • 2015-05-16
    相关资源
    最近更新 更多