1

当我在 rails 中运行这个命令时:

CensusBlockGroup.where{st_interects(:the_geom, buffer)}

在 SQL 中运行此命令:

SELECT "census_block_groups".* FROM "census_block_groups"  WHERE (st_intersects("census_block_groups"."proj_shape_3361", '002000000300000d2...'))

我收到此错误:

ActiveRecord::StatementInvalid: PG::AmbiguousFunction: 
ERROR:  function st_intersects(geometry, unknown) is not unique
LINE 1: ...lock_groups".* FROM "census_block_groups"  WHERE (st_interse...
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

我不知道如何添加显式类型转换,老实说,我也不清楚这甚至意味着什么。我看到上面的 st_intersects 函数传入了第二个参数“未知”。也许我可以“投射”它并让它工作......?

我认为问题可能是st_intersects由于其“函数重载”特性,postgresql 中有多个函数定义。我不是第一个在这个系统上安装 postgresql/postgis 的开发人员,我的一个承包商做到了,所以我担心我们可能会重复我们的努力。

我在 Ubuntu“12.04 LTS”VPS 上使用 postgresql 和 postgis 运行 rails 服务器。

我很确定我可以重新安装 postgis 但这会清除我的承包商的代码,这些代码使用 pg_routing 做了一些我不想接触的非常复杂的事情。如果必须,我将启动一个新的 linode 并在其上运行代码,但这似乎有点浪费,甚至可能更像是一种失败。

如果我无法通过消除歧义来正确解决问题(这通常适用于 Mac 和 linux 发行版),我认为另一种解决方案是标记 postgresql 以忽略歧义并选择它遇到的第一个 st_intersects 函数.

其他注意事项:

  • 我在 rgeo 中使用的几何工厂是“Geos”
  • 几何是笛卡尔的,不是地理的

类似的问题(作为一个被 ORM 瘫痪的 Rails 开发人员,这仍然让我摸不着头脑):

4

1 回答 1

1

我从未使用过 Rails,但实际上,在 PostgreSQL 中,函数 ST_Intersects 有一个覆盖,这意味着根据参数的类型,应该调用不同的函数。

在这种情况下,这些是覆盖:

boolean ST_Intersects(geometry geomA,geometry geomB);

布尔 ST_Intersects( 地理 geogA , 地理 geogB );

根据您显示的生成查询,PostgreSQL 可能很难确定要运行哪个函数,添加显式转换(一种指定某个值的类型的方法)将告诉应该调用哪个函数。

要在 PostgreSQL 中做到这一点,只需在值之后使用“::”,如下所示:

几何学:

SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);

因此,请确保两个值都:the_geom几何buffer类型匹配,您应该没问题。也许 ActiveRecord 有办法显式更改类型?或者您可以将查询直接写入 PostgreSQL?

(来源: http: //postgis.net/docs/ST_Intersects.html

于 2015-09-25T16:53:35.510 回答