¿Existe una función en SQL Server para mover / cambiar una geometría hacia ejes X o Y?
Respuesta
¿Demasiados anuncios?Yo mismo implemento la función STShidt y uso SQL Server CLR Integration para implementarlo en el servidor SQL.
La implementación de STShift es:
[SqlFunction]
public static SqlGeometry STShift(SqlGeometry g, double xShift, double yShift)
{
var sqlGeometryBuilder = new SqlGeometryBuilder();
var shiftGeometrySink = new ShiftGeometrySink(xShift, yShift, sqlGeometryBuilder);
g.Populate(shiftGeometrySink);
return sqlGeometryBuilder.ConstructedGeometry;
}
y ShiftGeometrySink es una implementación de la interfaz IGeometrySink110:
public class ShiftGeometrySink : IGeometrySink110
{
private readonly IGeometrySink110 _target;
private readonly double _xShift;
private readonly double _yShift;
public ShiftGeometrySink(double xShift, double yShift, IGeometrySink110 target)
{
_target = target;
_xShift = xShift;
_yShift = yShift;
}
public void SetSrid(int srid)
{
_target.SetSrid(srid);
}
public void BeginGeometry(OpenGisGeometryType type)
{
_target.BeginGeometry(type);
}
public void BeginFigure(double x, double y, double? z, double? m)
{
_target.BeginFigure(x + _xShift, y + _yShift, z, m);
}
public void AddLine(double x, double y, double? z, double? m)
{
_target.AddLine(x + _xShift, y + _yShift, z, m);
}
public void EndFigure()
{
_target.EndFigure();
}
public void EndGeometry()
{
_target.EndGeometry();
}
public void AddCircularArc(double x1, double y1, double? z1, double? m1, double x2, double y2, double? z2, double? m2)
{
_target.AddCircularArc(x1, y1, z1, m1, x2, y2, z2, m2);
}
}