运算符不存在:地理 <-> 地理

operator does not exist: geography <-> geography

我有类型为

的 postgresql 列
geography(Point,4326)

我使用

向其中插入了一些行
POINT(LONG LAT)

该数据已成功插入,我可以毫无问题地检索它,现在我想使用以下查询获取到特定点的最近条目

SELECT "cafes".* FROM "cafes" ORDER BY "latlng" <-> (SELECT latlng FROM cafes WHERE id = '3') LIMIT 1

但我收到以下错误

ERROR:  operator does not exist: geography <-> geography
LINE 1: ...es".* FROM "cafes" ORDER BY "latlng" <-> (SELEC...
                                                         ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

<-> "distance between" 运算符适用于 PostgreSQL 几何数据类型,不适用于 PostGIS geography 数据类型。对于 geography 数据类型,您可以使用 PostGIS 函数 ST_Distance() 并找到最小值。

WITH this_cafe (latlng) AS (
  SELECT latlng FROM cafes WHERE id = '3'
)
SELECT cafes.*, ST_Distance(cafes.latlng, this_cafe.latlng, 'false') AS dist
FROM cafes, this_cafe
ORDER BY dist ASC
LIMIT 1

请注意,函数的第三个参数 useSpheroid 设置为 false,这将使函数更快。这不太可能影响结果,因为咖啡馆往往彼此靠近。

这假设只有 1 家咖啡馆 id = 3。如果可以有更多,则将 CTE 限制为 return 仅 1 行。