4

私は次の2つのテーブルを持っています:-

ジオシェイプ

  • GeoShapeId INT IDENTITY
  • 名前 VARCHAR(100)
  • ShapeFile GEOGRAPHY [これは緯度/経度の閉じたポリゴンです]

犯罪場所

  • CrimeLocationId INT IDENTITY
  • LatLong GEOGRAPHY [これは緯度/経度ポイントです]

現在、約 10,000 の GeoShape の結果と約 500 の犯罪場所があります。

500 の犯罪緯度/経度ポイントすべてが内部に存在する GeoShape を特定しようとしています。

:( よくわかりません!サブクエリを実行しようとしましSTIntersectsたが、うまくいきませんでした。何か提案はありますか?

乾杯!

EDIT 1:関数を使用できませんGEOMETRY..(上記のように)これらはすべて地理タイプであるためです。

編集 2: と の使い方を知っていSTContainsますSTIntersects。その基本的な例を提供しないでください。上記のテーブル構造で複雑なクエリを実行することにもっと興味があります。

4

1 に答える 1

6

「編集」に関して、「提供しないでください...」を含む質問を目にすることはあまりありません。きっと少しずつ役に立ちますか?特に、あなたが知っていることを実際に私たちに見せていないので、STContainsまたはSTIntersects(またはFilter()そのことについて)...

とにかく、私は郵便番号と店舗の場所のデータベースを手元に持っていたので、テーブル/列の名前をあなたの名前に合わせて変更しました (6,535 の CrimeLocatoins と 3,285 の GeoShapes があります)。私はあなたがそれを理解したと思います - しかし、他の誰かがこれが役に立つと思うかもしれません...

次のクエリは、各GeoShapes.ShapeFile内のCrimeLocationsの数を返します。

SELECT G.Name, COUNT(CL.Id)
FROM   GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
ORDER BY 2 DESC

地理空間インデックスを設定しておらず、ShapeFile のポイント数が多いため、時間がかかります (20 分程度) が、正常に実行されます。あなたが提案するように結果を制限したい場合:

SELECT G.Name, COUNT(CL.Id)
FROM   GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
HAVING COUNT(CL.Id) = 500

もちろん、数値 500 をハードコーディングしたくないので、COUNT(*) FROM CrimeLocationsそこにサブクエリを追加したり、別のクエリからの合計を含む変数を追加したりできます。

それは十分に複雑ですか?

于 2009-10-11T11:36:49.617 に答える