Можете да обвиете нещо като 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)