sql >> Database teknologi >  >> RDS >> Sqlserver

Transformer/Projicer en geometri fra en SRID til en anden

Du kan indpakke noget som DotNetCoords i en SQL CLR-funktion for at gøre dette.

Se her:- http://www.doogal.co.uk/dotnetcoords.php

Jeg har pakket det ind i en CLR-funktion til at konvertere koordinater fra øst/nord til bredde/lang, hvilket jeg tror er, hvad du beder om. Når først CLR-funktionen er implementeret, er det en ren SQL-løsning (dvs. du kan køre det hele i en Stored Procedure eller View).

REDIGER :Jeg vil poste noget eksempelkode heroppe, når jeg kommer på arbejde i morgen, forhåbentlig vil det hjælpe.

REDIGER :Du skal downloade kildekoden fra http://www.doogal.co. dk/dotnetcoords.php og du skal bruge Visual Studio for at åbne og ændre det. Dokumentation til biblioteket er her http://www.doogal.co.uk/Help /

Hvad du så kan gøre er, at du kan tilføje en ny klasse til kildefilerne, der ligner denne:-

bruger System;bruger System.Collections;using System.Collections.Generic;using System.Data.SqlTypes;using DotNetCoords;using Microsoft.SqlServer.Server;/// /// SQL Server CLR funktioner til DotNetCoords-biblioteket./// public class CLRFunctions{///  /// Koordinerer den optallige. ///  /// Den østlige. /// Den nordlige. ///  privat statisk IEnumerable KoordinaterEnumerable(dobbelt østlig, dobbelt nordlig) { return new List { new OSRef(Easting,Northing) }; } ///  /// Tåer den lange lat. ///  /// Den østlige. /// Den nordlige. ///  [SqlFunction(FillRowMethodName ="FillRow")] public static IEnumerable ToLatLong(dobbel østlig, dobbelt nordlig) { return CoordinatesEnumerable(østlig, nordlig); } ///  /// Udfylder rækken. ///  /// Obj. /// Lat. /// The long. 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); }} 

Du bliver derefter nødt til at bygge og importere assembly til SQL Server (erstat stier med dine egne placeringer) (af en eller anden grund kan jeg ikke få assembly til at installere, når PERMISSION_SET er 'SAFE', så jeg ville sortere dette først før installation i et produktionsmiljø ).

OPRET FORSÆTNING DotNetCoordsFRA N'C:\Projects\DotNetCoords\bin\Debug\DotNetCoords.dll'WITH PERMISSION_SET =UNSAFEGO 

Du skal derefter oprette en SQL Server-funktion for at forbinde til CLR-funktionen:-

CREATE FUNCTION dbo.ToLatLong(@Easting float, @Northing float)RETURNER TABLE(Latitude float null, Longitude float null) med execute as callerASEXTERNAL NAME [DotNetCoords].[CLRFunctions].[ToLatLong] 

Dette er CLR-funktionen installeret dengang.

Du skulle så være i stand til at kalde funktionen direkte fra SQL Server for at udføre din konvertering (jeg har blandet tallene i dette indlæg for at holde anonymitet, så de giver måske ikke mening her, men funktionen fungerer fint).

/*------------------------VÆLG Latitude, Longitude FROM dbo.ToLatLong(327262, 357394)----- -------------------*/Latitude Longitude52,13413530182533 -9,34267170569508(1 række(r) påvirket) 

For at bruge det i et resultatsæt skal du bruge CROSS APPLY klausulen:-

/*------------------------VÆLG TOP 2 a.[Kolonne 0] AS osaddessp, a.[Kolonne 9] AS øst, a.[Kolonne 10] SOM nord, c.[Breddegrad] SOM lat, c.[Længdegrad] SÅ langFRA MinTabel SOM et KRYDS GÆLDER ToLatLong (a.[Kolonne 9], a.[Kolonne 10]) SOM c;------------------------*/osaddessp øst nord lat lang100134385607 327862 334794 52.3434530182533 -2.19342342569508100123433149 7802406 305 69268 325 306 30268 30268 30268 365 69342342569508100123433149 7802468 306 375 6934268 375 69342342536 393423342569508100123433149 7803149 752468 306 305 69268 305 69.

  1. Bedste metode til at gemme en liste over bruger-id'er

  2. Oracle Trigger ORA-04098:Triggeren er ugyldig og mislykket genvalidering

  3. Er SQLite velegnet til brug på et produktionswebsted?

  4. BIN_TO_NUM() Funktion i Oracle