Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przekształć/ rzutuj geometrię z jednego SRID na inny

W tym celu możesz umieścić coś takiego jak DotNetCoords w funkcji SQL CLR.

Zobacz tutaj:- http://www.doogal.co.uk/dotnetcoords.php

Zawinąłem go w funkcję CLR, aby przekonwertować współrzędne ze wschodu/północ na szerokość/długość, o co chyba prosisz. Po zaimplementowaniu funkcji CLR jest to rozwiązanie oparte na czystym SQL (tj. możesz uruchomić to wszystko w procedurze przechowywanej lub widoku).

EDYTUJ :Zamieszczę tutaj przykładowy kod, kiedy jutro zabiorę się do pracy, mam nadzieję, że to pomoże.

EDYTUJ :Musisz pobrać kod źródłowy z http://www.doogal.co. uk/dotnetcoords.php i będziesz potrzebować programu Visual Studio, aby go otworzyć i zmodyfikować. Dokumentacja biblioteki znajduje się tutaj http://www.doogal.co.uk/Help /Indeks.html

To, co możesz wtedy zrobić, to dodać nową klasę do plików źródłowych w podobny sposób:-

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

}

Następnie będziesz musiał skompilować i zaimportować zestaw do SQL Server (zastąp ścieżki własnymi lokalizacjami) (z jakiegoś powodu nie mogę zainstalować zestawu, gdy PERMISSION_SET jest „BEZPIECZNY”, więc posortowałbym to najpierw przed instalacją w środowisku produkcyjnym ).

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

Następnie musisz utworzyć funkcję SQL Server, aby połączyć się z funkcją 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]

To jest zainstalowana funkcja CLR.

Powinieneś wtedy móc wywołać funkcję bezpośrednio z SQL Server, aby wykonać konwersję (pomieszałem liczby w tym poście, aby zachować anonimowość, więc mogą nie mieć sensu tutaj, ale funkcja działa dobrze).

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

(1 row(s) affected)

Aby użyć go w zestawie wyników, musisz użyć klauzuli 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. Jak zwrócić podciąg z ciągu w SQL Server za pomocą funkcji SUBSTRING()?

  2. Jak wykonać wstawianie i zwracanie wstawionej tożsamości za pomocą Dappera?

  3. Upuść tabelę, a następnie nie można odtworzyć tabeli o tej samej nazwie

  4. Użycie programu SQL Server sp_msforeachtable, aby wybrać tylko te tabele, które spełniają określone warunki

  5. Pobierz ROWS jako COLUMNS (dynamiczne zapytanie PIVOT programu SQL Server)