【问题标题】:PostGIS geography query returns a string valuePostGIS 地理查询返回一个字符串值
【发布时间】:2014-07-06 01:51:34
【问题描述】:

我有一个奇怪的问题。我的应用程序中的 lonlat 列在开发服务器上运行良好——它的输出是 POINT(X Y) 的形式。但是当我将数据移动到生产服务器时,输出很奇怪!

ActionView::Template::Error(“0101000020E6100000541B9C887E7A52C02920ED7F80614440”的未定义方法“lon”:字符串):

使用 SRID: 4326 编码的 lonlat 值正在作为字符串读取。我几乎可以肯定,在将数据从开发迁移到生产期间,数据存在损坏,因为在迁移之前这不是问题。

有谁知道数据库架构或列可能会导致此问题吗?

【问题讨论】:

  • 如何在服务器之间移动数据?在新服务器中,列仍然是几何图形?在您的应用中,您是如何阅读专栏的?
  • 我分两步移动数据。首先,我转储数据库的模式 (pg_dump --schema-only -C -c) 并使用psql 在远程服务器中恢复它。其次,我用pg_dump --data-only -C 将数据转储出来,并执行与上述相同的操作来恢复它。
  • 远程服务器上的 lonlat 列还是输入geometry(Point,4326)
  • 我只记得我做了另一件事。在移动数据之前,我终止了与服务器的所有其他连接——包括 Rails 应用程序的连接。不确定这是否会导致我的问题。我的感觉是模式 search_path 与此有关。如果重新建立连接时postgis不在搜索路径中,那么app就不能使用postgis功能了吧?
  • 但是当我在本地终止连接时,应用程序似乎运行正常。所以......我仍然不确定发生了什么。

标签: postgresql postgis


【解决方案1】:

几何字段将其数据存储为 WKB。要查看 WKT 表示,您需要将查询更改为类似

select ST_Astext(the_geom) as geometry from table

但是,我不知道为什么在您的开发中,您会在 WKB 二进制数据和 WKT 字符串之间进行某种隐式转换。 ¿ 你使用的是什么版本的 postgres 和 postgis?

您的应用服务器中的语言是什么?

你使用的是那个 ActiveRecord 吗?

【讨论】:

  • 是的,它是 ActiveRecord。我在我的应用服务器上使用 Ruby on Rails。它已部署到 Heroku。难道是postgis没有添加到search_path?因为这是我注意到的唯一问题,虽然我不知道为什么我的数据迁移脚本不会导出 search_path...
  • PostGIS 版本为 2.1.2。 Postgresql 版本是 9.3。
【解决方案2】:

我建议你尝试类似的东西

float ST_X(geometry a_point);

为了确保您可以正确读取数据并确定问题是出在数据字段还是其他地方。

如果您确定问题出在几何列,我也会尝试一步完成pg_dump

您可以使用带有选项的 pg_dump

--exclude-table-data=reg_expresion_ _tablename_  
--exclude-table-data=schema.reg_expresion_ _tablename_

这将带来所有架构定义,但排除表数据并仅从表中带来您需要的数据。

【讨论】:

    【解决方案3】:

    事实证明,当我终止与服务器的连接以迁移数据时,Rails 在重新连接时没有设置模式搜索路径(意味着没有发现 postgis 扩展)。我不得不重启服务器来解决这个问题。

    【讨论】:

    • 最好将 Postgis 函数安装到 template1 中,这样可以确保任何新的 dbs 都默认拥有它们,并且可以避免您在 search_paths 周围看到的一些问题。
    • @JohnBarça 好主意!谢谢。
    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 2020-07-27
    • 2011-07-17
    • 2021-09-02
    • 1970-01-01
    • 2013-09-14
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多