sql >> Database >  >> RDS >> Sqlserver

Transformeer/projecteer een geometrie van de ene SRID naar de andere

Je zou zoiets als DotNetCoords in een SQL CLR-functie kunnen verpakken om dit te doen.

Zie hier:- http://www.doogal.co.uk/dotnetcoords.php

Ik heb het verpakt in een CLR-functie om coördinaten van Easting/Northing naar Lat/Long om te zetten, wat volgens mij is waar je om vraagt. Zodra de CLR-functie is geïmplementeerd, is het een pure SQL-oplossing (d.w.z. u kunt het allemaal uitvoeren in een opgeslagen procedure of weergave).

BEWERKEN :Ik zal hier wat voorbeeldcode posten als ik morgen aan het werk ga, hopelijk helpt het.

BEWERKEN :U moet de broncode downloaden van http://www.doogal.co. nl/dotnetcoords.php en je hebt Visual Studio nodig om het te openen en te wijzigen. Documentatie voor de bibliotheek is hier http://www.doogal.co.uk/Help /

Wat je dan kunt doen, is dat je een nieuwe klasse kunt toevoegen aan de bronbestanden die er ongeveer zo uitziet:-

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);
    }

}

U moet dan de assembly in SQL Server bouwen en importeren (vervang paden door uw eigen locaties) (om de een of andere reden kan ik de assembly niet laten installeren wanneer PERMISSION_SET 'VEILIG' is, dus ik zou dit eerst sorteren voordat ik in een productieomgeving installeer ).

CREATE ASSEMBLY DotNetCoords
FROM N'C:\Projects\DotNetCoords\bin\Debug\DotNetCoords.dll'
WITH PERMISSION_SET = UNSAFE
GO

U moet dan een SQL Server-functie maken om te communiceren met de CLR-functie:-

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]

Dit is de CLR-functie die dan is geïnstalleerd.

Je zou dan de functie rechtstreeks vanuit SQL Server moeten kunnen aanroepen om je conversie uit te voeren (ik heb de cijfers in dit bericht ook door elkaar gehaald om de anonimiteit te bewaren, zodat ze hier misschien niet logisch zijn, maar de functie werkt prima).

/*------------------------
SELECT Latitude, Longitude FROM dbo.ToLatLong(327262, 357394)
------------------------*/
Latitude            Longitude
52.13413530182533       -9.34267170569508

(1 row(s) affected)

Om het in een resultatenset te gebruiken, moet je de CROSS APPLY-clausule gebruiken:-

/*------------------------
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. hoe `show processlist` in mysql aan te passen?

  2. Implementeer meerdere Oracle-rekeninstanties met behulp van een instantiepool en terraform

  3. RailsTutorial 3.2 Ch 11 - PostgreSQL-syntaxisfout verbreekt de statusfeed

  4. Enkele aanhalingstekens ontsnappen in PHP/MySQL invoegen werkt niet