【问题标题】:Length Linestring in meters with rails - invalid geometry HINT长度线串,以米为单位,带导轨 - 无效几何
【发布时间】:2018-05-19 14:51:00
【问题描述】:

我试图找到以米为单位的线串长度

在我的控制器中显示:

def show
  @track = Track.friendly.find(params[:id])
  @track_length = Track.find_by_sql ["SELECT ST_Length('path') FROM tracks WHERE id = ?", @track.id]
end

我的节目视图:

<p>Track id : <%= @track.id%></p>
<p>Longueur : <%= @track_length %></p>
<p>Linestring : <%= @track.path %></p>

返回:

PG::InternalError: ERROR: parse error - invalid geometry HINT: "pa"

【问题讨论】:

    标签: ruby-on-rails postgis


    【解决方案1】:

    我会以不同的方式解决这个问题。在您的班级Track 中添加如下方法:

    class Track 
    
      def length 
        @length ||= calculate_length 
      end 
    
      def calculate_length 
        length_sql = <<-SQL 
          select st_length(path) as length from tracks where id=#{self.id}
        SQL
        Track.connection.execute(length_sql).first["length"]
      end   
    end
    

    所以我们记住了长度(记住它)。如果@length没有设置,我们计算长度,否则就返回之前计算的值。

    然后在你看来,你可以做类似的事情

    <p>Track id : <%= @track.id%></p>
    <p>Longueur : <%= '%.02f' % @track.length %>m</p>
    <p>Longueur : <%= '%.02f' % (@track.length/1000) %>km</p>
    

    【讨论】:

    • 我尝试做同样的事情,但我有一个错误:未定义的局部变量或方法 `sql' for #
    • 好....但您必须为路径指定 ::geography :选择 (st_length(path::geography)/1000) 作为 id=#{self.id} 的轨道的长度,否则该函数不返回米而是度数。 ;)
    • 是的,这取决于您使用的坐标系。
    【解决方案2】:

    我找到了答案:

    在控制器中:

    @track_length = Track.find_by_sql(["SELECT (ST_Length(path::geography)/1000)  AS length FROM tracks WHERE id = ?", @track.id])
    

    在节目中:

    <p>Longueur : <%= number_with_precision(@track_length.first.length, precision: 2) %> kilomètres</p>
    

    也许有更好的解决方案,但它有效;)

    【讨论】:

      猜你喜欢
      • 2016-05-31
      • 1970-01-01
      • 2020-09-14
      • 2011-11-14
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多