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

あるSRIDから別のSRIDにジオメトリを変換/投影します

    これを行うには、DotNetCoordsのようなものをSQLCLR関数でラップすることができます。

    こちらをご覧ください:- http://www.doogal.co.uk/dotnetcoords.php

    座標をEasting/NorthingからLat/Longに変換するために、CLR関数でラップしました。これは、あなたが求めているものだと思います。 CLR関数が実装されると、それは純粋なSQLソリューションになります(つまり、すべてをストアドプロシージャまたはビューで実行できます)。

    編集 :明日仕事に着いたら、ここにサンプルコードを投稿します。お役に立てば幸いです。

    編集http://www.doogal.coからソースコードをダウンロードする必要があります。 uk / dotnetcoords.php 開いて変更するには、VisualStudioが必要です。ライブラリのドキュメントはこちら http://www.doogal.co.uk/Help /

    次にできることは、次のような新しいクラスをソースファイルに追加できることです。-

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data.SqlTypes;
    using DotNetCoords;
    using Microsoft.SqlServer.Server;
    
    /// <summary>
    /// Sql Server CLR functions for the DotNetCoords library.
    /// </summary>
    public class CLRFunctions
    {
    
        /// <summary>
        /// Coordinateses the enumerable.
        /// </summary>
        /// <param name="Easting">The easting.</param>
        /// <param name="Northing">The northing.</param>
        /// <returns></returns>
        private static IEnumerable<OSRef> CoordinatesEnumerable(double Easting, double Northing)
        {
            return new List<OSRef> { new OSRef(Easting,Northing) };
        }
    
        /// <summary>
        /// Toes the lat long.
        /// </summary>
        /// <param name="Easting">The easting.</param>
        /// <param name="Northing">The northing.</param>
        /// <returns></returns>
        [SqlFunction(FillRowMethodName = "FillRow")]
        public static IEnumerable ToLatLong(double Easting, double Northing)
        {
            return CoordinatesEnumerable(Easting, Northing);
        }
    
        /// <summary>
        /// Fills the row.
        /// </summary>
        /// <param name="obj">The obj.</param>
        /// <param name="Lat">The lat.</param>
        /// <param name="Long">The long.</param>
        private static void FillRow(Object obj, out SqlDouble Lat, out SqlDouble Long)
        {
            OSRef Coordinates = (OSRef)obj;
            LatLng latlong = Coordinates.ToLatLng();
            latlong.ToWGS84();
            Lat = new SqlDouble(latlong.Latitude);
            Long = new SqlDouble(latlong.Longitude);
        }
    
    }
    

    次に、アセンブリをビルドしてSQL Serverにインポートする必要があります(パスを独自の場所に置き換えます)(何らかの理由で、PERMISSION_SETが'SAFE'の場合、アセンブリをインストールできないため、実稼働環境にインストールする前に、これを最初に並べ替えます。

    CREATE ASSEMBLY DotNetCoords
    FROM N'C:\Projects\DotNetCoords\bin\Debug\DotNetCoords.dll'
    WITH PERMISSION_SET = UNSAFE
    GO
    

    次に、CLR関数に接続するSQLServer関数を作成する必要があります。-

    CREATE FUNCTION dbo.ToLatLong(@Easting float, @Northing float)
    RETURNS TABLE
    (Latitude float null, Longitude float null) with execute as caller
    AS
    EXTERNAL NAME [DotNetCoords].[CLRFunctions].[ToLatLong]
    

    これがその時にインストールされたCLR機能です。

    これで、SQL Serverから直接関数を呼び出して変換を実行できるようになります(この投稿では数値を混同しているため、匿名性を維持しているため、ここでは意味がないかもしれませんが、関数は正常に機能します)。

    /*------------------------
    SELECT Latitude, Longitude FROM dbo.ToLatLong(327262, 357394)
    ------------------------*/
    Latitude            Longitude
    52.13413530182533       -9.34267170569508
    
    (1 row(s) affected)
    

    結果セットで使用するには、CROSSAPPLY句を使用する必要があります。-

    /*------------------------
    SELECT TOP 2    a.[Column 0] AS osaddessp,
                                a.[Column 9] AS east,
                                a.[Column 10] AS north,
                                c.[Latitude] AS lat,
                                c.[Longitude] AS long
    FROM    MyTable AS a CROSS APPLY ToLatLong (a.[Column 9], a.[Column 10]) AS c;
    ------------------------*/
    osaddessp       east    north   lat         long
    100134385607    327862  334794  52.3434530182533    -2.19342342569508
    100123433149    780268  353406  52.3453417606796    -3.19252323679263
    
    (10 row(s) affected)
    


    1. AWS RDSでのMySQLからPostgreSQLへの移行、パート3

    2. 多対多フィールドのorder_byにより、クエリセットのエントリが重複します

    3. Oracle SYSアカウントとSYSTEMアカウントの違いは何ですか?

    4. PHPを使用してOracleデータベースにANSI特殊文字を保存します