【发布时间】:2020-06-09 16:03:16
【问题描述】:
我正在开发的一个应用程序有一个 regions 表,其中包含一个名为 polygon 的几何列。该应用程序通过activerecord-postgis-adapter gem 使用 PostGIS。涉及几何列的 Active Record 迁移会导致架构显示:
t.geometry "polygon", limit: {:srid=>0, :type=>"geometry"}
用户可以通过前端的 Leaflet.js 地图存储圆形、矩形和多边形。创建圆时,浏览器请求包括圆心和半径(以米为单位)。
为了创建一个圆,应用程序将中心和半径与多边形一起存储。为了保存多边形,Region 模型使用以下方法:
def uncached_circle(coordinates, radius)
ActiveRecord::Base.connection.execute("
SELECT ST_Buffer(ST_GeomFromText('#{uncached_point(coordinates.first)}')::geography, #{radius}, 'quad_segs=8')::geometry AS circle;
")[0]["circle"]
end
我遇到了一些问题,其中最紧迫的是某些圈子因LinearRing failed ring test 错误而失败。比如这些请求参数:
{"name"=>"New Orleans, LA", "coordinates"=>[{"lat"=>29.9510658, "lng"=>-90.0715323}], "radius"=>25000, "shape"=>"circle", "format"=>:json, "region"=>{"name"=>"New Orleans, LA", "shape"=>"circle"}}
...从上述方法生成此查询:
SELECT ST_Buffer(ST_GeomFromText('POINT(29.9510658 -90.0715323)')::geography, 25000, 'quad_segs=8')::geometry AS circle;
...失败并出现 LinearRing 错误。另一个以波士顿为中心的圆圈(例如)通过。
我依靠圆的多边形表示来与其他圆进行相交测试。
我没有使用 PostGIS 的经验,经过大量研究和各种尝试后,我无法解决这个问题。我能得到的最接近的方法是将圈子创建查询包装在 ST_MakeValid 中,我认为这是代码异味。
谁能诊断出我做错了什么?很高兴根据需要提供更多详细信息。谢谢。
【问题讨论】:
标签: ruby-on-rails postgresql activerecord geometry postgis