MultiLineString ZM字段更新后始终为nil的问题求助
问题解决:RGeo处理带ZM维度的MultiLineString字段报错
问题核心
问题根源是默认的RGeo工厂不支持Z(高程)和M(度量)维度,而你的zmpath字段是multi_line_string ZM类型,导致RGeo无法正确解析WKT字符串,进而触发undefined method 'factory' for nil:NilClass错误;pgAdmin表单显示为空是因为默认组件不兼容ZM类型的几何数据展示,但数据实际已存入数据库。
解决方案
修改RGeo的工厂配置,为Track模型的zmpath字段单独指定支持ZM维度的地理工厂:
RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config| # 默认工厂保持原有配置 config.default = RGeo::Geographic.spherical_factory(srid: 4326) # 为Track模型的zmpath字段配置支持ZM的专属工厂 config.register(RGeo::Geographic.spherical_factory( srid: 4326, has_z: true, has_m: true ), model: Track, column: :zmpath) end
实用操作说明
应用端更新数据:配置完成后,两种方式都能正常更新字段:
# 方式1:直接传入ZM格式WKT字符串 Track.find(9).update_columns(zmpath: "MULTILINESTRING ZM ((0 0 4 6,5 5 4 6),(10 10 4 6,5 5 4 6,0 0 4 6),(0 0 4 6,10 10 4 6,10 0 4 6))") # 方式2:用RGeo构造几何对象(更安全,能提前校验格式) factory = RGeo::Geographic.spherical_factory(srid:4326, has_z:true, has_m:true) multi_line = factory.parse_wkt("MULTILINESTRING ZM ((0 0 4 6,5 5 4 6),(10 10 4 6,5 5 4 6,0 0 4 6),(0 0 4 6,10 10 4 6,10 0 4 6))") Track.find(9).update_columns(zmpath: multi_line)pgAdmin数据查看:如果需要在pgAdmin中查看该字段内容,可执行SQL查询
SELECT ST_AsText(zmpath) FROM tracks WHERE id=9;,或者在几何查看器中手动选择ZM维度类型来展示。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

