【问题标题】:Postgis latitude/longitude read out reversedPostgis 纬度/经度读反了
【发布时间】:2015-07-08 06:17:08
【问题描述】:

我有一个类,Geocoordinateable,它为模型提供了一些处理地理坐标的有用方法。其中包括接受数组的“geocoordinates=”。

https://gist.github.com/mboyle/58dd3add830bbdeef316

您可以调用“地理坐标”来获取数组中的坐标:

irb(main):056:0> b.geocoordinates
=> [-118.25, 34.197]

当我像这样分配坐标时:

irb(main):058:0> b.geocoordinates = [34.197, -118.25]
   (1.8ms)  
 UPDATE users
 SET geocoordinates = 'SRID=4326;POINT(' || 34.197 || ' ' || -118.25 || ')'
 WHERE id = 347708

   (0.7ms)  
 UPDATE activities
 SET geocoordinates = users.geocoordinates
 FROM users
 WHERE activities.user_id = users.id
 AND users.id = 347708
 AND NOT postgis.ST_Equals(activities.geocoordinates, users.geocoordinates)

=> [34.197, -118.25]

事情似乎可以保存并正确显示。但是,如果我再次查询模型,然后读取地理坐标,则纬度/经度会反转:

irb(main):059:0> b = User.find(b.id)
irb(main):060:0> b.geocoordinates
   (0.7ms)  
 SELECT postgis.ST_Y(geocoordinates) AS latitude, postgis.ST_X(geocoordinates) AS longitude
 FROM users
 WHERE id = 347708

=> [-118.25, 34.197]

我一生都无法理解为什么会发生这种情况。有人知道吗?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord postgis


    【解决方案1】:

    在 PostGIS 中,坐标按 (X, Y) 顺序设置,对于地理坐标对则按 (经度、纬度) 顺序设置。所以你应该这样做:

    UPDATE users
    SET geocoordinates = 'SRID=4326;POINT(' || -118.25 || ' ' || 34.197 || ')'
    WHERE id = 347708
    

    然后可能也是:

    irb(main):058:0> b.geocoordinates = [-118.25, 34.197]
    

    请注意,PostGIS 以 OGC 指定的众所周知的文本 (WKT) 格式提取文本数据。该标准规定了 (X,Y) 或 (lon,lat) 顺序。所以这不是一个选择,它需要使 PostGIS 能够摄取由其他 OGC 兼容软件生成的 WKT 文件。摄取 WKT 后,PostGIS 将数据以其内部格式存储在具有 PostGIS 定义的 geometrygeography 数据类型的列中,实际上是稍微修改的 OGC 众所周知的二进制 (WKB) 格式,并且然后可以分析数据并以最终用户所需的任何形式呈现。

    【讨论】:

    • 其实输出是(Y, X) -- (lat, lon),见ruby SQL-Output:SELECT postgis.ST_Y(geocoordinates) AS latitude, postgis.ST_X(geocoordinates) AS longitude
    • @maze-le 输出确实是 (lat, lon) 因为 PostGIS 函数明确要求它。然而,输入应该是 (lon, lat),至少在 UPDATE 语句中,因为这就是 WKT 字符串 ("SRID=4326;POINT(lon lat)") 的解释方式。请参阅更新答案中的说明。
    猜你喜欢
    • 2015-11-13
    • 2019-11-05
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多