Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एक SRID से दूसरे SRID में ज्यामिति का रूपांतरण/प्रोजेक्ट करें

ऐसा करने के लिए आप 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दो पंक्तियों के बीच समय अंतर की गणना करें

  2. SQL सर्वर में "अंकगणित अतिप्रवाह त्रुटि को डेटा प्रकार संख्यात्मक में परिवर्तित करना" को ठीक करें

  3. IS NULL या LIKE> ऑपरेटर का उपयोग करने के अलावा, टेक्स्ट, ntext और छवि डेटा> प्रकारों की तुलना या सॉर्ट नहीं किया जा सकता है

  4. SQL सर्वर (T-SQL) में सर्वर नाम वापस करने के 2 तरीके

  5. SQL सर्वर 2008 में दृश्य का पुनर्निर्माण कैसे करें