升级后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_factory
或 RGeo::Cartesian.simple_factory
) .
如果您从https://trac.osgeo.org/geos/下载geos版本3.5.x
并使用 cmake 构建它(需要一段时间,但安装干净),您的生产环境和本地开发环境之间应该具有一致的行为。
如果您使用的是 simple_mercator
工厂,我怀疑球坐标(在纯 ruby 中实现)验证方式的差异能否解释您所看到的行为差异。
关于ruby-on-rails - 获取无效几何图形: LinearRing failed ring test after upgrading rgeo gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58996305/