-3

「座標」を投稿するアプリを作成します。もう1つの機能は、データベースを調べて近くの座標を見つけることです。データベースに1.000.000のエントリがあったとしましょう。どのアルゴリズムを使用しますか?指定された座標から100m離れている座標を比較するにはどうすればよいですか?多くのアプリがそれを行っていますが、それは難しいようです。

更新:座標とは、lon-latを意味します。なぜこれを「本当の」質問ではないと考えたのかわかりませんが、出発点が必要です。そのため、この「一般的な」質問をしました。

ありがとう

4

2 に答える 2

1

私は過去にこれを行うために大圏距離と呼ばれるものを使用しました。地球を完全な球体として扱い(そうではありません)、2セットのlat longを使用して、その球体上の2点間の距離を決定します。地球は完全な球体ではないため、これらの距離は完全に正確ではありません。距離が短く、計算値と実際の距離の差が小さい場合は、おそらくこれで問題ありません。GCDを計算する関数は次のとおりです。

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
CREATE FUNCTION dbo.GreatCircleDistance
(
    @Latitude1 float = NULL,
    @Longitude1 float = NULL,
    @Latitude2 float = NULL,
    @Longitude2 float = NULL
)
RETURNS float
AS
BEGIN
    IF @Latitude1 IS NULL RETURN 0.0
    IF @Longitude1 IS NULL RETURN 0.0
    IF @Latitude2 IS NULL RETURN 0.0
    IF @Longitude2 IS NULL RETURN 0.0

    DECLARE @sin1 float
        ,@sin2 float
        ,@sind float
        ,@cos1 float
        ,@cos2 float
        ,@cosd float

    SELECT @sin1 = SIN(RADIANS(@Latitude1))
        ,@sin2 = SIN(RADIANS(@Latitude2))
        ,@sinD = SIN(RADIANS(@Longitude2 - @Longitude1))
        ,@cos1 = COS(RADIANS(@Latitude1))
        ,@cos2 = COS(RADIANS(@Latitude2))
        ,@cosD = COS(RADIANS(@Longitude2 - @Longitude1))

    RETURN ATN2     (SQRT(SQUARE(@cos2 * @sinD) + SQUARE(@cos1 * @sin2 - @sin1 * @cos2 * @cosD))
                ,@sin1 * @sin2 + @cos1 * @cos2 * @cosD
            ) * 3959.871
END
GO

ここから盗まれました。

于 2012-06-12T18:38:42.083 に答える
0

緯度、度分秒または 10 進度での経度? 10 進数の場合、dist^2 ~= lat^2 + lon^2。象限をチェックすることを忘れないでください。複数のルックアップを行う場合は、検索リストを 2D 検索ツリーに並べ替えることができます。

于 2012-06-12T18:44:56.547 に答える