2

犯罪現場に最も近い自転車ラックまでの距離を見つけようとしています。500 万の犯罪と 5,000 の自転車ラックを含むデータベース テーブルがあります。私が今しなければならないことは、500 万件の犯罪のそれぞれに最も近い自転車ラックを見つけることです。geopy を使用して python スクリプトを作成しようとしましたが、処理に時間がかかりすぎました (少なくとも数週間はかかるでしょう)。私はオンラインで広範囲に検索してきました.SQL Server 2012には地理データ型があることがわかったので、犯罪と自転車ラックの緯度と経度のポイントからその地理データ型を含む列を作成しました.

今、私はこのようなことをしようとしています:

update Crimes set distanceToNearestBikeRack = crimeGeo.STDistance((select geo from bike_racks))

残念ながら、これによりサブクエリが多くの行を返し、次のスローが発生します。

メッセージ 512、レベル 16、状態 1、行 1 サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。ステートメントは終了されました。

多数のポイントから最も近いポイントを見つけるにはどうすればよいですか?

4

2 に答える 2

1

通常MIN、一連の値の最小値を見つけるために使用しますが、空間的な方法ではうまく機能しないようです。ただし、これは機能します。

UPDATE
   Crimes
SET
    distanceToNearestBikeRack = 
        (SELECT TOP 1 crimeGeo.STDistance(BR.geo)
        FROM bike_racks BR
        ORDER BY crimeGeo.STDistance(BR.geo) ASC)

もちろん、500 万件の犯罪と 5,000 台の自転車ラックがあるため、これには時間がかかる可能性があります。そのため、更新のバッチ処理を検討することをお勧めします。

于 2012-10-04T16:23:06.550 に答える
0

この計算は犯罪現場ごとに 1 回行う必要があることは明らかです。サブクエリでは、最も近い自転車ラックを見つけるために、犯罪現場に関する情報が必要になります。

私は SQL 2012 を調べていませんが、昔は実際にはかなり高速な Haversine フォーミュラを使用していました。Geolocation and Haversine formulaへの回答、またはGPX ファイルからの距離を計算する方法への私の回答を参照してください 。UDF 実装のために数年前から。

于 2012-10-04T15:57:24.833 に答える