Rails搭配PostGIS时LineString坐标超出±90度被自动截断问题
问题原因
- 你对WKT坐标顺序的理解有误:
LINESTRING内的坐标顺序是经度 纬度,不是纬度 经度。纬度的合法范围固定为[-90, 90],经度的合法范围才是[-180, 180],你把-122.1放在了纬度的位置,自然会被截断为边界值-90.0。 - 你的猜测正确,
geographic: true标记对应PostGIS的GEOGRAPHY类型,该类型严格遵循WGS84坐标系的范围约束,超出合法范围的坐标会被自动修正到区间内。
解决方案
方案一:保留地理坐标特性(推荐,适合绝大多数业务场景)
如果你需要使用球面距离计算、空间相交判断等地理运算能力,不需要改表结构,仅需要将WKT内的坐标顺序调整为正确的「经度 纬度」即可:
# 修正后的坐标顺序:LINESTRING (经度 纬度, 经度 纬度...) linestring = "LINESTRING (-122.1 48.0, -90.0 47.74, -90.0 47.52, -90.0 47.35)" bsr = BlockedSearchRegion.create!(name: 'new region', path: linestring)
方案二:存储无范围约束的平面坐标
如果你确实需要存储超出WGS84标准范围的自定义坐标,可以修改表结构,将字段改为无坐标范围约束的GEOMETRY类型:
# 调整字段属性的迁移代码 change_table :blocked_search_regions do |t| t.change :path, :line_string, geographic: false end
原有GIST索引无需修改,可同时兼容GEOGRAPHY和GEOMETRY类型。注意该方案下后续空间运算需要自行处理投影规则,无法直接使用球面地理运算接口。
内容的提问来源于stack exchange,提问作者spacemonkeys
相关产品推荐
相关产品推荐

