【问题标题】:Active Record and PostGIS ST_BUFFER: LinearRing failed ring testActive Record 和 PostGIS ST_BUFFER:LinearRing 环测试失败
【发布时间】: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


    【解决方案1】:

    我相信您正在切换坐标对的顺序。它应该是lon,lat 而不是lat,lon

    所以,尝试使用 POINT(-90.0715323 29.9510658)not POINT(29.9510658 -90.0715323) 进行查询:

    SELECT 
      ST_Buffer('POINT(-90.0715323 29.9510658)'::geography, 
                25000, 
                'quad_segs=8')::geometry AS circle;
    

    延伸阅读:WGS84 (EPSG:4326)

    【讨论】:

    • 非常感谢。这就是问题所在。为了让前端的一切正常工作,我还必须反转发送回浏览器的坐标。 Leaflet 需要 lat/lng(而 postgis 需要 lng/lat)。
    • 出于好奇,你知道为什么坐标反转会导致ST_BUFFER输出一个椭圆吗?
    • @Ephs05msm 问题是您的纬度值超出范围,最小值为 -90,而您的纬度值为 90.07。所以,从某种意义上说,你的观点“无处可去”。
    • 这是有道理的。谢谢你的解释。在某些情况下,即使中心点坐标颠倒,缓冲区也是有效的。发生这种情况时,我看到了一个椭圆。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多