0

您好我有一个具有以下结构的数据库:

表格1:

time(type timestamp)        longitude(type string)        latitude(type string)
2:00                        -110.4365                     38.7463
2:00                        -110.2743                     38.7983
2:00                        -102.4434                     36.9438
3:00                        -112.3254                     39.2222
etc                         etc                           etc

现在我有一些绘制值的代码,当它这样做时它会失去一些准确性。用户可以单击这些点并查询数据库以获取有关该点的更多信息。但是,由于绘图功能失去了一些准确性,我需要在查询中考虑到这一点。

所以我的想法是我想查询时间 = x 和(纬度 = 最接近 y 的值和经度 = 最接近 z 的值)。您会看到最接近的值取决于纬度和经度,这就是我对如何进行感到困惑的地方。

可以说我正在寻找:

Time = 2:00
Longitude = -110.3421
Latitude = 38.7587

现在,如果我查询:

Time = 2:00 and Longitude = closest to -110.3421

那么结果将是第 2 行。

但是,如果我这样做:

Time = 2:00 and Latitude = closest to 38.7587

那么结果将是第 1 行。

如果我查询:

Time = 2:00 and Longitude = closest to -110.3421 and Latitude = closest to 38.7587

那么结果将是第 1 行。这是我需要的查询类型...

我发现以下帖子对于查询一个字段中最接近的值很有用:

https://stackoverflow.com/a/6103352/1800665

谢谢,詹姆斯

编辑:我有以下内容:

(SELECT * FROM (
(SELECT * FROM Table1 WHERE cast(latitude as double precision) >= '38.7587' AND healthtime = '2:00' AND cast(longitude as double precision) >= '-110.3421') 
UNION ALL 
(SELECT * FROM Table1 WHERE cast(latitude as double precision) < '38.7587' AND healthtime = '2:00' AND cast(longitude as double precision) < '-110.3421')
) as nearest ORDER BY ( abs('38.7587'-cast(latitude as double precision)) + abs('-110.3421'-cast(longitude as double precision))) LIMIT 1)
4

1 回答 1

1

你可以尝试这样的事情:

SELECT *
FROM table1
WHERE healthtime = '2:00'
ORDER BY ((longitude::double precision - (-110.3421))^2 +
          (latitude::double precision -  (38.7587  ))^2)
LIMIT 1

它会以最小的“距离”返回您的点:((lon-lon1)^2 + (lat-lat1)^2 -> min)。

我的SQLFiddle示例。

UPD 测试查询:

SELECT *, ((longitude::double precision - (-110.3421))^2 +
           (latitude::double precision -  (38.7587  ))^2) as distance,
          (abs(longitude::double precision - (-110.3421)) +
           abs(latitude::double precision -  (38.7587  ))) as distance2
FROM table1
WHERE time = '2:00'
ORDER BY ((longitude::double precision - (-110.3421))^2 +
          (latitude::double precision -  (38.7587  ))^2)

LIMIT 2

给出 2 个最佳结果:

| TIME | LONGITUDE | LATITUDE |   DISTANCE | DISTANCE2 |
--------------------------------------------------------
| 2:00 | -110.2743 |  38.7983 |   0.006165 |    0.1074 |
| 2:00 | -110.4365 |  38.7463 | 0.00906512 |    0.1068 |

DISTANCE= (lon-lon1)^2 + (lat-lat1)^2(我的变种)。

DISTANCE2= abs(lon-lon1) + abs(lat-lat1)(您的变体)。

您的变体给出了不同的“最接近”。您可以使用“距离”计算的任何变体,但我更喜欢“经典”方式 - root((lon-lon1)^2 + (lat-lat1)^2)

新的SQLFiddle

于 2012-12-14T15:30:29.787 回答