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)

请注意,它points是使用LONGITUDE FIRST创建的。根据文档

点被视为(经度,纬度)而不是反之亦然,因为经度更接近 x 轴的直观概念,纬度更接近 y 轴。

这是糟糕的设计......但就是这样。

于 2014-08-05T13:47:38.433 回答
4

<@>运算符由扩展earthdistance提供。您需要调用create extension earthdistance;生产数据库。

于 2014-02-13T14:21:04.030 回答
1

您确定在线服务器上正确安装了 postgis 吗?

于 2010-04-19T07:42:45.583 回答
1

以下是解决此问题的步骤

  1. 运行下面的命令二检查扩展名(cube& earthdistance
SELECT * FROM pg_available_extensions ORDER BY "name"
  1. cube如果列表中仍然显示两个扩展名 ( & ),请运行以下命令earthdistance
CREATE EXTENSION cube;
CREATE EXTENSION earthdistance;
  1. 创建表并插入值
  • 创建位置表
CREATE TABLE location (
    id serial PRIMARY KEY,
    name varchar(50) NOT NULL,
    longitude double precision NOT NULL,
    latitude double precision NOT NULL
);
  • 向我们插入一些数据(#CHA 周围的网站)
INSERT INTO location(name, latitude, longitude)
VALUES ('SupplyHog HQ', 35.0472780, -85.3071590)
,('Chickamauga Dam', 35.0975557,-85.2197027)
,('Five Points Mtn Biking', 34.851249, -85.423983)
,('Harrison Bay State Park', 35.179631, -85.114359)
,('Mojo Burrito', 35.0094040,-85.3275640)
,('Rock Creek', 35.0556150,-85.2803290);
  1. 运行选择查询你会得到结果
  • 创建点时,它是point(long, lat)
SELECT *, point(-85.3078294, 35.0609500) <@> point(longitude, latitude)::point as distance 
FROM location
WHERE (point(-85.3078294, 35.0609500) <@> point(longitude, latitude)) < 10
ORDER BY distance;
于 2020-12-01T09:56:19.577 回答
0

错误点是存储过程中的 select 语句:

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

在标记的位置需要一个运算符,但您的运算符要么未定义,要么具有其他参数类型。Postgres 本身只知道<@@>包含运算符。在这里寻找他们的解释。

您能否详细说明您要达到的目标。

于 2010-04-19T08:36:32.537 回答
0

您需要在 pg_catalog 架构下创建扩展。这样它们就可以在全球范围内使用。请执行以下命令:

  • 如果存在 earthdistance,则丢弃扩展;
  • 如果存在多维数据集,则删除扩展名;
  • 创建扩展多维数据集模式 pg_catalog;
  • 创建扩展earthdistance模式pg_catalog;
于 2021-01-13T06:19:12.353 回答
0

您需要像这样限定 <@> 运算符:

OPERATOR(schema.<@>)

如果创建扩展的架构未在 search_path 中列出:

SHOW search_path;

https://www.postgresql.org/docs/current/ddl-schemas.html

于 2020-03-18T19:44:37.670 回答