繁体   English   中英

如何在 PostgreSQL 中找到基于给定纬度和给定距离的记录

[英]How to find records based on given latitude and longitude with given distance in PostgreSQL

我正在使用这个公式。

SELECT id, ( 3959 * acos( cos( radians(14.685327) ) * cos( radians( latitude ) ) 
    * cos( radians( longitude ) - radians(80.054889) ) + sin( radians(14.685327) ) * sin(radians(latitude)) ) ) AS distance 
FROM kr_user
HAVING distance < 50
ORDER BY distance

但是我收到以下错误:

ERROR: function radians(character varying) does not exist
LINE 1: ..., ( 3959 * acos( cos( radians(14.685327) ) * cos( radians( l...
                                       ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

如何解决这个问题。 或对此的任何其他建议。 我为此使用 laravel 平台。

我猜你的纬度和经度列是 varchar 类型而不是数字类型(如 14.685327 是)。

所以,试试:

SELECT id, ( 3959 * acos( cos( radians(14.685327) ) * cos( radians( latitude::numeric ) ) 
    * cos( radians( longitude::numeric ) - radians(80.054889) ) + sin( radians(14.685327) ) * sin(radians(latitude::numeric)) ) ) AS distance 
FROM kr_user
HAVING distance < 50
ORDER BY distance

现在正如您在评论中指出的那样,您无法过滤计算列,我个人会使用横向连接来解决此问题:

SELECT id, t.distance
FROM kr_user
INNER JOIN LATERAL (
  SELECT 3959 * acos(
    cos( radians(14.685327) ) *
    cos( radians( latitude::numeric ) ) *
    cos( radians( longitude::numeric ) - radians(80.054889) ) +
    sin( radians(14.685327) ) *
    sin(radians(latitude::numeric))
  ) AS distance
  WHERE latitude IS NOT NULL AND longitude IS NOT NULL
) t ON TRUE
WHERE t.distance < 50
ORDER BY t.distance

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM