Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Transform/ Proyeksikan geometri dari satu SRID ke SRID lainnya

Anda dapat membungkus sesuatu seperti DotNetCoords dalam fungsi SQL CLR untuk melakukan ini.

Lihat di sini:- http://www.doogal.co.uk/dotnetcoords.php

Saya telah membungkusnya dalam fungsi CLR untuk mengonversi koordinat dari Easting/Northing ke Lat/Long yang menurut saya adalah yang Anda minta. Setelah fungsi CLR diimplementasikan, ini adalah solusi SQL murni (yaitu Anda dapat menjalankan semuanya dalam Prosedur atau Tampilan Tersimpan).

EDIT :Saya akan memposting beberapa contoh kode di sini ketika saya mulai bekerja besok, semoga membantu.

EDIT :Anda harus mengunduh kode sumber dari http://www.doogal.co. uk/dotnetcoords.php dan Anda akan memerlukan Visual Studio untuk membuka dan memodifikasinya. Dokumentasi untuk perpustakaan ada di sini http://www.doogal.co.uk/Help /

Apa yang dapat Anda lakukan adalah Anda dapat menambahkan kelas baru ke file sumber yang mirip dengan ini:-

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);
    }

}

Anda kemudian perlu membangun dan mengimpor Majelis ke SQL Server (ganti jalur dengan lokasi Anda sendiri) (untuk beberapa alasan saya tidak bisa menginstal Majelis ketika PERMISSION_SET adalah 'AMAN' jadi saya akan mengurutkan ini terlebih dahulu sebelum menginstal di lingkungan produksi ).

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

Anda kemudian harus membuat fungsi SQL Server untuk antarmuka ke fungsi CLR:-

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]

Ini adalah fungsi CLR yang diinstal.

Anda kemudian dapat memanggil fungsi langsung dari SQL Server untuk melakukan konversi Anda (saya telah mencampuradukkan angka-angka dalam posting ini juga menjaga anonimitas sehingga mungkin tidak masuk akal di sini tetapi fungsinya berfungsi dengan baik).

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

(1 row(s) affected)

Untuk menggunakannya di hasil, Anda perlu menggunakan klausa CROSS APPLY:-

/*------------------------
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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan sub-kueri dalam SQL untuk menemukan max(count())

  2. T-SQL dan klausa WHERE LIKE %Parameter%

  3. Dasar-dasar Mengelola File Data di SQL Server

  4. Bagaimana cara meneruskan nilai ke parameter prosedur tersimpan di komponen Sumber OLE DB?

  5. Paging berbasis Offset/Fetch (Implementasi) di EntityFramework (Menggunakan LINQ) untuk SQL Server 2008