首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#从sqlgeometry线串中获取纬度和经度值

使用C#从sqlgeometry线串中获取纬度和经度值
EN

Stack Overflow用户
提问于 2015-11-12 21:36:55
回答 1查看 1.1K关注 0票数 2

我最近在Microsoft SQL中发现了空间列。我现在已经用正确的EPSG (STRID)成功地存储了LINESTRING sqlgeometry.使用AutoCAD地图检查。

数据现在是包含X、Y坐标组的。

使用C# (或SQL语句),如何获得坐标点的纬度和经度值?

EN

回答 1

Stack Overflow用户

发布于 2018-03-30 23:36:12

你需要的是重新投影到球面坐标上。SQL Server不提供此类功能。您需要在C#中使用一些管道来获取几何图形和项目坐标。

如果你有自己的转换函数,使用GeometrySink会更快,也会有所帮助。

代码语言:javascript
复制
internal class SqlGeometryProjectionSink : IGeometrySink110
{

    IGeometrySink110 _sink;
    int _outSrid;
    Func<double, double, double[]> _coordTransform;

    public SqlGeometryProjectionSink(IGeometrySink110 p_Sink, int outSrid, Func<double, double, double[]> coordTransform)
    {
        _sink = p_Sink;
        _outSrid = outSrid;
        _coordTransform = coordTransform;
        if (_coordTransform == null)
        {
            _coordTransform = new Func<double, double, double[]>((x, y) => new double[] { x, y });
        }
    }

    void IGeometrySink.AddLine(double x, double y, double? z, double? m)
    {
        double[] proj = _coordTransform(x, y);
        _sink.AddLine(proj[0], proj[1], z, m);
    }

    void IGeometrySink.BeginFigure(double x, double y, double? z, double? m)
    {
        double[] proj = _coordTransform(x, y);
        _sink.BeginFigure(proj[0], proj[1], z, m);
    }

    void IGeometrySink.BeginGeometry(OpenGisGeometryType type)
    {
        _sink.BeginGeometry(type);
    }

    void IGeometrySink.EndFigure()
    {
        _sink.EndFigure();
    }

    void IGeometrySink.EndGeometry()
    {
        _sink.EndGeometry();
    }

    void IGeometrySink.SetSrid(int srid)
    {
        _sink.SetSrid(_outSrid);
    }


    public static SqlGeometry ReprojectGeometry(SqlGeometry geom, int srid, Func<double, double, double[]> coordTransform)
    {
        if (geom != null)
        {
            SqlGeometryBuilder builder = new SqlGeometryBuilder();
            SqlGeometryProjectionSink sink = new SqlGeometryProjectionSink(builder, srid, coordTransform);
            geom.Populate(sink);

            return builder.ConstructedGeometry;
        }
        return null;
    }


    void IGeometrySink110.AddCircularArc(double x1, double y1, double? z1, double? m1, double x2, double y2, double? z2, double? m2)
    {
        throw new NotImplementedException();
    }
}

如果您不知道可以使用的公式,例如DotSpatial,它提供了转换函数。(参见此处的实现示例:https://github.com/xfischer/SqlServerSpatial.Toolkit/blob/4a60154f206af430b27de730afd0340db19f9191/SqlServerSpatial.Toolkit/Viewers/GDI/SqlGeometryReprojection.cs)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33672704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档