【问题标题】:postgres - ERROR: operator does not existpostgres - 错误:运算符不存在
【发布时间】:2011-02-09 13:58:36
【问题描述】:

再一次,我有一个在本地运行良好的函数,但是将它移到网上会产生很大的错误...从有人指出我传递的参数数量不准确的响应中得到提示,我在这种情况下仔细检查以确定我将 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;

【问题讨论】:

  • 如果这听起来有点刺耳,我很抱歉,但你真的读过错误信息吗???
  • 你有没有弄清楚发生了什么?发生在我身上。 cubeearthdistance 均由 pg_available_extensions 安装和验证。重新启动 PostgreSQL。 [42883] ERROR: operator does not exist: point &lt;@&gt; point。 Windows 上的 PostgreSQL v11 可能存在问题?

标签: postgresql postgis


【解决方案1】:

以下是确切的命令:

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 创建的。根据documentation

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

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

【讨论】:

  • 这不起作用。 cubeearthdistance 均由 pg_available_extensions 安装和验证。重新启动 PostgreSQL。 [42883] ERROR: operator does not exist: point &lt;@&gt; point。 Windows 上的 PostgreSQL v11 可能存在问题?是的,经度/纬度按正确顺序排列。
  • 这不是一个糟糕的设计,它是默认的。 Postgis 默认为 Long Lat。我们通常谈论 x,y,在这种情况下分别是 Long Lat。
【解决方案2】:

&lt;@&gt; 运算符由 earthdistance 扩展提供。 您需要在生产数据库上调用create extension earthdistance;

【讨论】:

  • 是的,但它仍然会引发错误。 cubeearthdistance 均由 pg_available_extensions 安装和验证。重新启动 PostgreSQL。 [42883] ERROR: operator does not exist: point &lt;@&gt; point。 Windows 上的 PostgreSQL v11 可能存在问题?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    以下是解决此问题的步骤

    1. 运行下面的命令二检查扩展名(cube & earthdistance
    SELECT * FROM pg_available_extensions ORDER BY "name"
    
    1. 如果列表中仍然显示两个扩展名(cubeearthdistance),请运行以下命令:
    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;
    

    【讨论】:

      【解决方案5】:

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

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

      在标记的位置需要一个运算符,但您的运算符要么未定义,要么具有其他参数类型。 Postgres 本身只知道 &lt;@@&gt; 包含运算符。看here他们的解释。

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

      【讨论】:

      • 无益的答案。 cubeearthdistance 均由 pg_available_extensions 安装和验证。重新启动 PostgreSQL。 [42883] ERROR: operator does not exist: point &lt;@&gt; point。 Windows 上的 PostgreSQL v11 可能存在问题?是的,经度/纬度按正确顺序排列(长在前)。
      【解决方案6】:

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

      OPERATOR(schema.<@>)
      

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

      SHOW search_path;
      

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

      【讨论】:

        【解决方案7】:

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

        • 如果存在 earthdistance,则删除扩展;
        • 如果存在多维数据集则删除扩展;
        • 创建扩展多维数据集架构 pg_catalog;
        • 创建扩展 earthdistance 架构 pg_catalog;

        【讨论】:

        • 这个问题有点老(10年)所以,我不知道你的答案是否仍然相关。
        猜你喜欢
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 2020-08-24
        • 2014-04-05
        • 2016-02-28
        • 2012-08-11
        相关资源
        最近更新 更多