获取 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 到更宽松的模式。
备注:
- 这只发生在我的 Macbook(GEOS 版本 3.8.0)上,而不是在我们的 Linux 生产服务器(GEOS 版本 3.5.0)上
参考资料:
您很可能遇到了这个 [1] 错误。重现需要 Mac OS 并显示您遇到的错误:
RGeo::Error::InvalidGeometry (LinearRing failed ring test)
问题与拉取请求 [2] 相关联,它发现了 Float 与 BigDecimal 差异的问题。不知何故,当包含足够多的小数时,浮点数并不那么精确。
旁注: 拉取请求只有 26 天了,所以它仍然是开放的,因此你暂时需要从分支构建它.
来源:
这似乎不是 rgeo
gem 的问题,而是 mac.
上的基础 geos
库的问题
geos
3.8.x
(3.8.1
是 Homebrew 大约 4/13/2020 的最新版本)和 3.8.x
的早期版本似乎有所不同=11=] 库处理确定多边形有效性的 is_simple
计算。这会影响由 CAPI 支持的任何 RGeo
工厂(其中大多数工厂,但不包括 RGeo::Geographic.spherical_factory
或 RGeo::Cartesian.simple_factory
)。
如果您从 https://trac.osgeo.org/geos/ 下载版本 3.5.x
的 geos 并使用 cmake 构建它(需要一段时间但安装干净),您的生产环境和本地开发环境之间的行为应该一致。
如果您使用的是 simple_mercator
工厂,我怀疑球坐标(在纯 ruby 中实现)验证方式的差异能否解释您所看到的行为差异。
将 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 到更宽松的模式。
备注:
- 这只发生在我的 Macbook(GEOS 版本 3.8.0)上,而不是在我们的 Linux 生产服务器(GEOS 版本 3.5.0)上
参考资料:
您很可能遇到了这个 [1] 错误。重现需要 Mac OS 并显示您遇到的错误:
RGeo::Error::InvalidGeometry (LinearRing failed ring test)
问题与拉取请求 [2] 相关联,它发现了 Float 与 BigDecimal 差异的问题。不知何故,当包含足够多的小数时,浮点数并不那么精确。
旁注: 拉取请求只有 26 天了,所以它仍然是开放的,因此你暂时需要从分支构建它.
来源:
这似乎不是 rgeo
gem 的问题,而是 mac.
geos
库的问题
geos
3.8.x
(3.8.1
是 Homebrew 大约 4/13/2020 的最新版本)和 3.8.x
的早期版本似乎有所不同=11=] 库处理确定多边形有效性的 is_simple
计算。这会影响由 CAPI 支持的任何 RGeo
工厂(其中大多数工厂,但不包括 RGeo::Geographic.spherical_factory
或 RGeo::Cartesian.simple_factory
)。
如果您从 https://trac.osgeo.org/geos/ 下载版本 3.5.x
的 geos 并使用 cmake 构建它(需要一段时间但安装干净),您的生产环境和本地开发环境之间的行为应该一致。
如果您使用的是 simple_mercator
工厂,我怀疑球坐标(在纯 ruby 中实现)验证方式的差异能否解释您所看到的行为差异。