我有一个类Geocoordinateable,它为模型提供了一些处理地理坐标的有用方法.其中包括接受数组的“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]
事情似乎得救并正确出来.但是,如果我再次查询模型,然后读取地理坐标,则反转纬度/经度:
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)顺序设置,或(经度,纬度)设置为地理坐标对.所以你应该这样做:
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将数据以其内部格式存储,实际上是稍微修改的OGC熟知二进制(WKB)格式,在具有PostGIS定义的几何或地理数据类型的列中,然后数据可以是以最终用户所需的任何形式进行分析和呈现.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。