ruby-on-rails - 获取无效几何图形: LinearRing failed ring test after upgrading rgeo gem

标签 ruby-on-rails ruby postgis geos rgeo

升级后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 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 ,而与其他人相比,我无法察觉到确切的问题。但关键是,这些都是我们以前能够处理的几何图形,但现在却出现了错误。我想了解如何才能回到更宽松的模式。

注释:

  • 这种情况仅发生在我的 Macbook(GEOS 版本 3.8.0)上,但不会发生在我们的 Linux 生产服务器(GEOS 版本 3.5.0)上

引用文献:

最佳答案

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

geos 3.8.x 的方式似乎有所不同(3.8.1 是 Homebrew 大约 4 中的最新版本/13/2020)和早期版本的 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

关于ruby-on-rails - 获取无效几何图形: LinearRing failed ring test after upgrading rgeo gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58996305/

相关文章:

ruby-on-rails - 针对单个存储桶的读写权限的 AWS S3 IAM 策略

arrays - 更改 .each 循环中引用的数组元素的值?

ruby-on-rails - 如何修改在操作中在 Controller 中设置的 `params`?

ruby-on-rails - <> 在 Ruby 中是什么意思?

sql - 从多个表中获取数据

ruby-on-rails - 在前一个请求完成之前,当前类是否可以被新请求覆盖?

ruby-on-rails - 从 rails 3.2.0 升级到 3.2.2 时出现 "new"路由问题

ruby-on-rails - 有人在 Solaris 10x86 上安装了 Rails 3

oracle - 如何将几何字段从 postgresql(PostGIS) 迁移到 sdo 几何字段 oracle

postgresql - 有效地将点分配给多边形