Postgis latitude/longitude 读出反转
Postgis latitude/longitude read out reversed
我有一个 class,地理坐标,它为模型提供了一些处理地理坐标的有用方法。其中包括接受数组的 "geocoordinates=" 。
https://gist.github.com/mboyle/58dd3add830bbdeef316
您可以调用"geocoordinates"获取数组中的坐标:
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]
事情似乎保存并正确出现。但是,如果我再次查询模型,然后读取地理坐标,则 lat/long 会反转:
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]
我一辈子都无法理解为什么会这样。有人知道吗?
在 PostGIS 中,坐标按 (X, Y) 顺序设置,或按 (longitude, latitude) 地理坐标对设置。所以你应该这样做:
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 指定的 Well-Known Text (WKT) 格式提取文本数据。该标准规定了 (X,Y) 或 (lon,lat) 顺序。所以这不是一个选择,它需要使 PostGIS 能够摄取由其他符合 OGC 标准的软件生成的 WKT 文件。摄取 WKT 后,PostGIS 以其内部格式存储数据,实际上是一种略微修改的 OGC 知名二进制 (WKB) 格式,在具有 PostGIS 定义的 geometry
或 geography
数据的列中类型,然后可以分析数据并以最终用户所需的任何形式呈现。
我有一个 class,地理坐标,它为模型提供了一些处理地理坐标的有用方法。其中包括接受数组的 "geocoordinates=" 。
https://gist.github.com/mboyle/58dd3add830bbdeef316
您可以调用"geocoordinates"获取数组中的坐标:
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]
事情似乎保存并正确出现。但是,如果我再次查询模型,然后读取地理坐标,则 lat/long 会反转:
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]
我一辈子都无法理解为什么会这样。有人知道吗?
在 PostGIS 中,坐标按 (X, Y) 顺序设置,或按 (longitude, latitude) 地理坐标对设置。所以你应该这样做:
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 指定的 Well-Known Text (WKT) 格式提取文本数据。该标准规定了 (X,Y) 或 (lon,lat) 顺序。所以这不是一个选择,它需要使 PostGIS 能够摄取由其他符合 OGC 标准的软件生成的 WKT 文件。摄取 WKT 后,PostGIS 以其内部格式存储数据,实际上是一种略微修改的 OGC 知名二进制 (WKB) 格式,在具有 PostGIS 定义的 geometry
或 geography
数据的列中类型,然后可以分析数据并以最终用户所需的任何形式呈现。