在rails或sql中克服"ActiveRecord::StatementInvalid: PG::AmbiguousFunction"的方法。 (st_intersects 不是唯一的函数名称)
Methods of overcoming "ActiveRecord::StatementInvalid: PG::AmbiguousFunction" in rails or sql. (st_intersects is not a unique function name)
当我在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 函数正在传递第二个参数 'unknown'。也许我可以 "cast" 让它工作...?
我认为问题可能是postgresql中st_intersects
的函数定义有多个,因为它有"function overloading"的特性。我不是第一个在这个系统上安装 postgresql/postgis 的开发人员,我的一个承包商安装过,所以我担心我们可能重复了我们的工作。
我运行在 Ubuntu“12.04 LTS”VPS.
上使用 postgresql 和 postgis rails 服务器
我很确定我可以重新安装 postgis,但这会清除我的承包商的代码,这些代码用 pg_routing 做一些我不想碰的非常复杂的事情。如果必须的话,我会启动一个新的 linode 和 运行 上面的代码,但这似乎有点浪费,也许更像是一种失败。
如果我无法通过消除歧义来正确解决问题(这通常适用于 mac 和 linux 发行版),我认为另一种解决方案是标记 postgresql 以忽略歧义和只需选择它遇到的第一个 st_intersects 函数。
其他说明:
- 我在 rgeo 中使用的几何工厂是 'Geos'
- 几何是笛卡尔几何,不是地理几何
类似的问题(作为一个 rails 被 ORM 削弱的开发人员,这些问题仍然让我摸不着头脑):
- PostGIS Error: Could not choose a best candidate function
我从未使用过 Rails,但事实上,在 PostgreSQL 中,函数 ST_Intersects 有一个覆盖,这意味着根据参数的类型,将调用不同的函数。
在这种情况下,这些是覆盖:
boolean ST_Intersects( geometry geomA , geometry geomB );
boolean ST_Intersects( geography geogA , geography geogB );
根据您显示的生成的查询,PostgreSQL 可能很难确定要使用哪个函数 运行,添加一个显式转换(一种指定特定值类型的方法)将告诉哪个应该调用函数。
要在 PostgreSQL 中做到这一点,只需在值后使用“::”,如:
几何:
SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);
因此请确保值 :the_geom
和 buffer
都匹配 geometry 类型,您应该没问题。也许 ActiveRecord 有办法显式更改类型?或者您可以将查询直接写入 PostgreSQL?
当我在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 函数正在传递第二个参数 'unknown'。也许我可以 "cast" 让它工作...?
我认为问题可能是postgresql中st_intersects
的函数定义有多个,因为它有"function overloading"的特性。我不是第一个在这个系统上安装 postgresql/postgis 的开发人员,我的一个承包商安装过,所以我担心我们可能重复了我们的工作。
我运行在 Ubuntu“12.04 LTS”VPS.
上使用 postgresql 和 postgis rails 服务器我很确定我可以重新安装 postgis,但这会清除我的承包商的代码,这些代码用 pg_routing 做一些我不想碰的非常复杂的事情。如果必须的话,我会启动一个新的 linode 和 运行 上面的代码,但这似乎有点浪费,也许更像是一种失败。
如果我无法通过消除歧义来正确解决问题(这通常适用于 mac 和 linux 发行版),我认为另一种解决方案是标记 postgresql 以忽略歧义和只需选择它遇到的第一个 st_intersects 函数。
其他说明:
- 我在 rgeo 中使用的几何工厂是 'Geos'
- 几何是笛卡尔几何,不是地理几何
类似的问题(作为一个 rails 被 ORM 削弱的开发人员,这些问题仍然让我摸不着头脑):
- PostGIS Error: Could not choose a best candidate function
我从未使用过 Rails,但事实上,在 PostgreSQL 中,函数 ST_Intersects 有一个覆盖,这意味着根据参数的类型,将调用不同的函数。
在这种情况下,这些是覆盖:
boolean ST_Intersects( geometry geomA , geometry geomB );
boolean ST_Intersects( geography geogA , geography geogB );
根据您显示的生成的查询,PostgreSQL 可能很难确定要使用哪个函数 运行,添加一个显式转换(一种指定特定值类型的方法)将告诉哪个应该调用函数。
要在 PostgreSQL 中做到这一点,只需在值后使用“::”,如:
几何:
SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);
因此请确保值 :the_geom
和 buffer
都匹配 geometry 类型,您应该没问题。也许 ActiveRecord 有办法显式更改类型?或者您可以将查询直接写入 PostgreSQL?