0

Latitude列とLongitude列(両方ともfloat)を含むテーブルがあり、現在、パラメーターとしてポイントを取得し、それから最大500メートル離れている行を見つけるストアドプロシージャを構築しています。

where句で次のステートメントを使用していますが、機能していません。

(geometry::STGeomFromText('POINT(' + CAST(Longitude AS VARCHAR(20)) + ' ' + 
  CAST(Latitude AS VARCHAR(20)) 
  + ')', 4326).STDistance(@currentLocation) / 1000) < @radius

@currentLocationでありgeometry@radiusですfloat

SQL Server 2012を使用しています。where句の何が問題になっていますか?

4

1 に答える 1

1

スタイルとパフォーマンスの観点からいくつかの問題がありますが、機能の観点から、クエリが機能しない理由は、(私が推測しているように)500の@radiusパラメーターを提供しているためです。 500メートル以内の場所?

ただし、経度と緯度の座標は角度座標であり、度で測定されますよね?つまり、実際に行っているのは、@ currentLocationから500/1000度未満の距離にあるポイントを見つけることです(なぜ1000で割っているのかわかりませんか?)

このクエリにgeographyデータ型を本当に使用したかったと思います。また、STGeomFromText()メソッドではなくPoint()メソッドを使用する必要があります。これは、すべてのCASTを必要としないため、わずかに高速で、かなり整理されています。

WHERE句は次のようになります。

geography::Point(Latitude, Longitude, 4326).STDistance(@currentLocation) < @radius

ここにはまだ問題があります。クエリの各行に対して地理ポイントインスタンスを動的に作成しているだけなので、インデックスを使用できず、クエリが非常に遅くなる可能性があります。より良いアプローチは、テーブルにPERSISTED計算列を作成することです。

ALTER TABLE yourTable
ADD Location AS geography::Point(Latitude, Longitude, 4326) PERSISTED;

次に、この列に空間インデックスを追加すると(テーブルにクラスター化された主キーが必要になります)、クエリは次のようになります。

SELECT * FROM yourTable
WHERE Location.STDistance(@currentLocation) < 500;
于 2012-11-21T19:17:24.807 に答える