Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Трансформиране/проектиране на геометрия от един SRID към друг

Можете да обвиете нещо като DotNetCoords в SQL CLR функция, за да направите това.

Вижте тук:- http://www.doogal.co.uk/dotnetcoords.php

Увих го в CLR функция, за да преобразувам координатите от Easting/Northing в Lat/Long, което според мен е това, което питате. След като функцията CLR бъде внедрена, тя е чисто SQL решение (т.е. можете да я стартирате в съхранена процедура или изглед).

РЕДАКТИРАНЕ :Ще публикувам примерен код тук, когато отида на работа утре, надявам се, че ще помогне.

РЕДАКТИРАНЕ :Ще трябва да изтеглите изходния код от http://www.doogal.co. uk/dotnetcoords.php и ще ви трябва Visual Studio, за да го отворите и модифицирате. Документация за библиотеката е тук 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 е „БЕЗОПАСЕН“, така че първо бих сортирал това, преди да инсталирам в производствена среда ).

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

След това ще трябва да създадете функция на SQL Server за интерфейс към функцията 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]

Това е CLR функцията, инсталирана тогава.

След това трябва да можете да извикате функцията директно от SQL Server, за да извършите вашето преобразуване (обърках числата в тази публикация, за да запазя анонимност, така че може да нямат смисъл тук, но функцията работи добре).

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

(1 row(s) affected)

За да го използвате в набор от резултати, трябва да използвате клаузата 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. Как да филтрирате редове с нулеви стойности в изявление за избор в SQL Server - SQL Server / TSQL урок, част 110

  2. Върнете основния тип данни от стойност на SQL_Variant в SQL Server

  3. Какви са предимствата от използването на синтаксиса на конструктора на редове в оператор за вмъкване на T-Sql?

  4. Задайте начална стойност за колона с автоматично увеличение

  5. Как да промените периода на задържане на прихващане на промени (CDC) в SQL Server - урок за SQL Server