1

PostGis と共に PostgreSQL をインストールしました。以下を実行してみます。

SELECT N1.edname AS "Borders Royal Exchange A"
FROM eds_census2011 N1, eds_census2011 N2
WHERE Touch(N1.the_geom, N2.the_geom)
AND N2 = 'Royal Exchange A'

そして、(以下の) エラーが表示されます。Postgres に追加する必要があるもの、または何かを有効にする必要があるものはありますか?

ERROR:  function touch(geometry, geometry) does not exist
LINE 3: WHERE Touch(N1.the_geom, N2.the_geom)
              ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

********** Error **********

ERROR: function touch(geometry, geometry) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 96
4

2 に答える 2

2

次の 2 つのクエリを実行して (上記のクエリを実行しているのと同じセッションで)、問題を突き止めます。

関数はどのスキーマに存在しますtouch()か?

SELECT p.proname, n.nspname
FROM   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  proname = 'touch';

search_path私の役割の現在のスキーマは何ですか:

SHOW search_path;

関数が存在する場合、search_pathPostgres がそれを見つけることができるように、スキーマが最新である必要があります。を適応させる方法はsearch_path
search_path は識別子の解決と「現在のスキーマ」にどのように影響しますか

ところで、Touch()Postgis マニュアルの関数リファレンスに関数が見つかりません。ST_Touches()と呼ばれるものがあります。あなたがそれを意味した可能性はありますか?

このクエリのコストは O(N²) であることに注意してください。これは、eds_census2011. 条件N2.edname = 'Royal Exchange A'が十分に選択的である場合、これは問題になりません。

また、次のWHEREような追加の項目と結合する行を除外することもできます。

AND N1.pk_id <> N2.pk_id 

更新後のエラー

更新されたクエリはより理にかなっています。

SELECT N1.edname AS "Borders Royal Exchange A"
FROM   eds_census2011 N1, eds_census2011 N2
WHERE  ST_Touches(N1.the_geom, N2.the_geom)=1
AND    N2.edname = 'Royal Exchange A';

ただし、をST_Touches()返すbooleanため、Where 句は次のようにする必要があります。

WHERE  ST_Touches(N1.the_geom, N2.the_geom)
于 2013-05-09T21:03:26.290 に答える
0

わかりました-みんなのおかげで、次を使用しました:

SELECT N1.edname AS "Borders Royal Exchange A"
FROM eds_census2011 N1, eds_census2011 N2
WHERE ST_Touches(N1.the_geom, N2.the_geom)
AND N2.edname = 'Royal Exchange A'
于 2013-05-09T21:40:27.313 に答える