Bạn có thể bọc một cái gì đó như DotNetCoords trong một hàm CLR của SQL để thực hiện việc này.
Xem tại đây:- http://www.doogal.co.uk/dotnetcoords.php
Tôi đã gói nó trong một hàm CLR để chuyển đổi tọa độ từ Easting / Northing sang Lat / Long mà tôi nghĩ đó là những gì bạn đang yêu cầu. Khi hàm CLR được triển khai, nó là một giải pháp SQL thuần túy (tức là bạn có thể chạy tất cả trong một Thủ tục hoặc Chế độ xem được Lưu trữ).
CHỈNH SỬA :Tôi sẽ đăng một số mã mẫu lên đây khi tôi đi làm vào ngày mai, hy vọng nó sẽ hữu ích.
CHỈNH SỬA :Bạn sẽ cần tải xuống mã nguồn từ http://www.doogal.co. uk / dotnetcoords.php và bạn sẽ cần Visual Studio để mở và sửa đổi nó. Tài liệu cho thư viện có tại đây http://www.doogal.co.uk/Help /
Những gì bạn có thể làm sau đó là bạn có thể thêm một lớp mới vào các tệp nguồn tương tự như sau:-
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);
}
}
Sau đó, bạn sẽ cần phải xây dựng và nhập lắp ráp vào SQL Server (thay thế các đường dẫn bằng các vị trí của riêng bạn) (vì một số lý do tôi không thể cài đặt lắp ráp khi PERMISSION_SET là 'SAFE' vì vậy tôi sẽ sắp xếp điều này trước khi cài đặt trong môi trường sản xuất ).
CREATE ASSEMBLY DotNetCoords
FROM N'C:\Projects\DotNetCoords\bin\Debug\DotNetCoords.dll'
WITH PERMISSION_SET = UNSAFE
GO
Sau đó, bạn sẽ cần tạo một hàm SQL Server để giao tiếp với hàm 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]
Đây là hàm CLR được cài đặt sau đó.
Sau đó, bạn sẽ có thể gọi hàm trực tiếp từ SQL Server để thực hiện chuyển đổi của mình (Tôi đã trộn các số trong bài đăng này quá giữ ẩn danh nên chúng có thể không có ý nghĩa ở đây nhưng hàm hoạt động tốt).
/*------------------------
SELECT Latitude, Longitude FROM dbo.ToLatLong(327262, 357394)
------------------------*/
Latitude Longitude
52.13413530182533 -9.34267170569508
(1 row(s) affected)
Để sử dụng nó trong tập kết quả, bạn cần sử dụng điều khoản ÁP DỤNG CHÉO:-
/*------------------------
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)