ऐसा करने के लिए आप SQL CLR फ़ंक्शन में DotNetCoords जैसा कुछ लपेट सकते हैं।
यहां देखें:- http://www.doogal.co.uk/dotnetcoords.php ए>
मैंने इसे ईस्टिंग/नॉर्थिंग से लेट/लांग में निर्देशांक बदलने के लिए एक सीएलआर फ़ंक्शन में लपेट लिया है, जो मुझे लगता है कि आप जो मांग रहे हैं। एक बार सीएलआर फ़ंक्शन लागू हो जाने के बाद यह एक शुद्ध एसक्यूएल समाधान है (यानी आप इसे संग्रहीत प्रक्रिया या दृश्य में चला सकते हैं)।
संपादित करें :जब मैं कल काम पर आऊंगा तो मैं यहां कुछ नमूना कोड पोस्ट करूंगा, उम्मीद है कि यह मदद करेगा।
संपादित करें :आपको http://www.doogal.co से सोर्स कोड डाउनलोड करना होगा। uk/dotnetcoords.php और इसे खोलने और संशोधित करने के लिए आपको विजुअल स्टूडियो की आवश्यकता होगी। पुस्तकालय के लिए दस्तावेज़ीकरण यहाँ है 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 सर्वर में बनाने और आयात करने की आवश्यकता होगी (पथों को अपने स्थानों से बदलें) (किसी कारण से मैं असेंबली को स्थापित करने के लिए नहीं मिल सकता जब PERMISSION_SET 'सुरक्षित' है, इसलिए मैं इसे उत्पादन वातावरण में स्थापित करने से पहले पहले सॉर्ट करूंगा )।
CREATE ASSEMBLY DotNetCoords
FROM N'C:\Projects\DotNetCoords\bin\Debug\DotNetCoords.dll'
WITH PERMISSION_SET = UNSAFE
GO
फिर आपको CLR फंक्शन में इंटरफेस करने के लिए एक SQL सर्वर फंक्शन बनाने की आवश्यकता होगी:-
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]
यह तब स्थापित सीएलआर फ़ंक्शन है।
फिर आपको अपना रूपांतरण करने के लिए SQL सर्वर से सीधे फ़ंक्शन को कॉल करने में सक्षम होना चाहिए (मैंने इस पोस्ट में संख्याओं को भी गुमनाम रखा है ताकि वे यहां समझ में न आएं लेकिन फ़ंक्शन ठीक काम करता है)।
/*------------------------
SELECT Latitude, Longitude FROM dbo.ToLatLong(327262, 357394)
------------------------*/
Latitude Longitude
52.13413530182533 -9.34267170569508
(1 row(s) affected)
परिणामसेट में इसका उपयोग करने के लिए आपको क्रॉस लागू क्लॉज का उपयोग करना होगा:-
/*------------------------
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)