Database 最近(几何)点作为外键

Database 最近(几何)点作为外键,database,postgresql,Database,Postgresql,我们有两个PostgreSQL 9.2表。第一批城市: 其次是气象站: 使用他们的点坐标,我们如何找到气象站中最近的城市?我想用这个城市来填充目前都为空的气象站的外键,即city\u loc\u id。有这样的外键是个好主意吗 我意识到我必须以某种方式使用最近点运算符,但在编写查询时我有点不知所措。有一个距离运算符很可能就是您要寻找的:选择point1 point2。还有接地距离,但对于您的目的来说,这似乎有些过分。有一个距离操作符,很可能就是您要寻找的:选择点1点2。还有地球距离,但对你来说似

我们有两个PostgreSQL 9.2表。第一批城市:

其次是气象站:

使用他们的点坐标,我们如何找到气象站中最近的城市?我想用这个城市来填充目前都为空的气象站的外键,即city\u loc\u id。有这样的外键是个好主意吗


我意识到我必须以某种方式使用最近点运算符,但在编写查询时我有点不知所措。

有一个距离运算符很可能就是您要寻找的:选择point1 point2。还有接地距离,但对于您的目的来说,这似乎有些过分。

有一个距离操作符,很可能就是您要寻找的:选择点1点2。还有地球距离,但对你来说似乎有些过分。

我找到了解决办法。谢谢你的帮助

UPDATE weather_stations
    SET city_loc_id = (
        SELECT c.loc_id
        FROM cities c
        ORDER BY weather_stations.gps_coord <-> c.gps_coord
        LIMIT 1 );

我找到了解决办法。谢谢你的帮助

UPDATE weather_stations
    SET city_loc_id = (
        SELECT c.loc_id
        FROM cities c
        ORDER BY weather_stations.gps_coord <-> c.gps_coord
        LIMIT 1 );

我认为,如果在右操作数上有一个点数组,或者在右操作数上有一个跨越多个点的几何结构,比如一条直线,那么这就是。我认为你真正想做的是做一个子查询,返回与你考虑的点之间的最小欧几里德距离的行,例如,在计算点1和点2之间的欧几里德距离时做一个最小值,然后返回该值。考虑到这是一个好主意-城市更改名称,被放弃/破坏/等等,是由政府机构的法定声明创建的,分为两个或多个单独的实体,合并等。因此我个人不会将城市用作外键,因为所有这些都独立于气象站的生命周期。我认为如果在正确的操作数上有一组点,或右操作数上跨越多个点的几何结构,如直线。我认为你真正想做的是做一个子查询,返回与你考虑的点之间的最小欧几里德距离的行,例如,在计算点1和点2之间的欧几里德距离时做一个最小值,然后返回该值。考虑到这是一个好主意-城市更改名称,被放弃/破坏/等等,由政府机构的法定声明创建,分为两个或多个单独的实体,合并等。因此我个人不会将城市用作外键,因为所有这些都独立于气象站的生命周期。
UPDATE weather_stations
    SET city_loc_id = (
        SELECT c.loc_id
        FROM cities c
        ORDER BY weather_stations.gps_coord <-> c.gps_coord
        LIMIT 1 );