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になります。これは、私が必要とするタイプのクエリです...

次の投稿は、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 に答える