5

繰り返しますが、私はローカルで正常に動作する関数を持っていますが、それをオンラインに移動すると大きなエラーが発生します.誰かが私が渡した引数の数を指摘した応答から手がかりを得て、私は二重-この状況でチェックして、関数自体に5つの引数を渡していることを確認しました...

Query failed: ERROR: operator does not exist: point <@> point HINT: No operator matches the given name and argument type(s). You may need to add explicit type casts.

クエリは次のとおりです。

BEGIN; SELECT zip_proximity_sum('zc',                                                                                                                                                                  
    (SELECT g.lat FROM geocoded g                                                                                                                                                                              
    LEFT JOIN masterfile m ON g.recordid = m.id                                                                                                                                                                
    WHERE m.zip = '10050' ORDER BY m.id LIMIT 1),                                                                                                                                                             
    (SELECT g.lon FROM geocoded g                                                                                                                                                                              
    LEFT JOIN masterfile m ON g.recordid = m.id                                                                                                                                                                
    WHERE m.zip = '10050' ORDER BY m.id LIMIT 1),                                                                                                                                                             
    (SELECT m.zip FROM geocoded g                                                                                                                                                                              
    LEFT JOIN masterfile m ON g.recordid = m.id                                                                                                                                                                
    WHERE m.zip = '10050' ORDER BY m.id LIMIT 1)                                                                                                                                                              
    ,10);

PG 関数は次のとおりです。

CREATE OR REPLACE FUNCTION zip_proximity_sum(refcursor, numeric, numeric, character, numeric)
  RETURNS refcursor AS
$BODY$ 
    BEGIN 

        OPEN $1 FOR 
            SELECT r.zip, point($2,$3) <@> point(g.lat, g.lon) AS distance
            FROM
            geocoded g LEFT JOIN masterfile r ON g.recordid = r.id 
            WHERE (geo_distance( point($2,$3),point(g.lat,g.lon)) < $5)
            ORDER BY r.zip, distance;
        RETURN $1; 
    END; 
    $BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
4

7 に答える 7

11

正確なコマンドは次のとおりです。

create extension cube;
create extension earthdistance;
select (point(-0.1277,51.5073) <@> point(-74.006,40.7144)) as distance;

     distance     
------------------
 3461.10547602474
(1 row)

LONGITUDE FIRSTpointsで作成されていることに注意してください。ドキュメントごと:

ポイントは (経度、緯度) として取得され、その逆ではありません。これは、経度が x 軸、緯度が y 軸の直感的な考えに近いためです。

これはひどいデザインです...しかし、それはそうです。

于 2014-08-05T13:47:38.433 に答える
1

postgis がオンライン サーバーに正しくインストールされていることを確認しますか?

于 2010-04-19T07:42:45.583 に答える
0

エラーのポイントは、ストアドプロシージャのselectステートメントです。

SELECT r.zip, point($2,$3) <@> point(g.lat, g.lon) AS distance
                            ^

マークされた位置では、演算子が必要ですが、演算子が定義されていないか、他の引数タイプがあります。Postgres自体は、<@および@>包含演算子のみを認識しています。彼らの説明はここを見てください。

達成しようとしていることについて詳しく教えてください。

于 2010-04-19T08:36:32.537 に答える