sql >> データベース >  >> RDS >> Sqlserver

SQL Server Geography データ型 直線上で最も近い点

    オブジェクトを GEOGRAPHY に保存できます 列を作成し、SPATIAL INDEX を作成します

    残念ながら、SQL Server サーフェスをタイル化し、タイル識別子をプレーンな B-Tree に格納することで、空間インデックスを実装します インデックスなので、プレーンな ORDER BY STDistance 動作しません (動作しますが、インデックスは使用しません)。

    代わりに、次のようなクエリを作成する必要があります:

    DECLARE @mypoint GEOGRAPHY
    SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326);
    
    WITH    num (distance) AS
            (
            SELECT  1000
            UNION ALL
            SELECT  distance + 1000
            FROM    num
            WHERE   distance <= 50000
            )
    SELECT  TOP 1 m.*
    FROM    num
    CROSS APPLY
            (
            SELECT  TOP 1 *
            FROM    mytable
            WHERE   myroad.STDistance(@mypoint) <= distance
            ORDER BY
                    STDistance(@mypoint)
            ) m
      

    このように、SQL Server 最初に 1 内の道路を検索します あなたのポイントからキロメートル、その後 2 以内 インデックスを使用するたびにキロメートルなど。

    更新:

    テーブルに複数のポイントがあり、それぞれに最も近いポイントを見つけたい場合:

    WITH    num (distance) AS
            (
            SELECT  1000
            UNION ALL
            SELECT  distance + 1000
            FROM    num
            WHERE   distance <= 50000
            )
    SELECT  mp.mypoint, m.*
    FROM    @mypoints mp
    CROSS APPLY
            (
            SELECT  TOP 1 m.*
            FROM    num
            CROSS APPLY
                    (
                    SELECT  TOP 1 *
                    FROM    mytable
                    WHERE   myroad.STDistance(@mypoint) <= distance
                    ORDER BY
                            STDistance(@mypoint)
                    ) m
            ) m
      

    1. 日付範囲の重複チェック制約

    2. Oracleで一意のインデックスを作成し、nullを無視するにはどうすればよいですか?

    3. Rを使用してPostgresスキーマ内のテーブルを一覧表示します

    4. MySQLエラー::'ユーザー'root'@'localhost'のアクセスが拒否されました