如何将DbGeometry对象解析为List <t>?</t>

时间:2014-10-13 15:01:39

标签: c# sql-server geospatial

我正在尝试解析一个多边形,它呈现为DbGeometry类(从System.Data.Entity.Spatial)到某个List表示,但是失败了。

我试过了:   - 使用方法转换它.ToList&lt;&gt;()   - 使用.NET中的JSON库进行解析,但是通过反序列化DbGeometry

,来自不同网站的示例代码失败了

所以,现在我将几何体作为字符串返回到我的Web API应用程序中:

enter image description here

如果我找不到任何解决方案如何,要将其表示为双打列表,我将不得不在JavaScript中手动解析它,这种方式我觉得非常不正确并且必须有一些解决方案。

我正在使用Entity Framework v.6.1.1,它准备了下一个模型:

public partial class Buildings
{
    public int id { get; set; }
    public Nullable<bool> has_holes { get; set; }
    public System.Data.Entity.Spatial.DbGeometry polygon_data { get; set; }
    public System.Data.Entity.Spatial.DbGeometry position_wgs { get; set; }
    public System.Data.Entity.Spatial.DbGeometry position_mercator { get; set; }
    public Nullable<int> height { get; set; }
    public string street_name { get; set; }
    public System.Data.Entity.Spatial.DbGeometry holes_data { get; set; }
    public Nullable<double> angle { get; set; }
}

我已经展示了它,如果你想从MSSQL CE(这是一个嵌入式数据库,或LocalDb,另一个名称)看到该表的结构。

所以我想:

  • System.Data.Entity.Spatial.DbGeometry polygon_data
  • System.Data.Entity.Spatial.DbGeometry holes_data

准备好双打名单,所以我的问题是:How can I parse DbGeometry instance, which holds a collection of points into List<Point>?

2 个答案:

答案 0 :(得分:4)

我有类似的问题。我所做的是,创建了扩展方法,将给定的几何数据解析为点。 @Erik飞利浦也有很好的解决方案。这就是我想出来的。

public static class ExtensionString
{
    private static Dictionary<string, string> _replacements = new Dictionary<string, string>();

    static ExtensionString()
    {
        _replacements["LINESTRING"] = "";
        _replacements["CIRCLE"] = "";
        _replacements["POLYGON"] = "";
        _replacements["POINT"] = "";
        _replacements["("] = "";
        _replacements[")"] = "";
    }

    public static List<Point> ParseGeometryData(this string s)
    {
        var points = new List<Point>();

        foreach (string to_replace in _replacements.Keys)
        {
            s = s.Replace(to_replace, _replacements[to_replace]);
        }

        string[] pointsArray = s.Split(',');

        for (int i = 0; i < pointsArray.Length; i++)
        {
            double[] coordinates = new double[2];

            //gets x and y coordinates split by space, trims whitespace at pos 0, converts to double array
            coordinates = Array.ConvertAll(pointsArray[i].Remove(0, 1).Split(null), double.Parse);

            points.Add(new Point() { X = coordinates[0], Y = coordinates[1] });
        }

        return points;
    }
}

就这样使用它

List<System.Drawing.Point> points = geometryDataStr.ParseGeometryData();

答案 1 :(得分:2)

如果您的几何图形有效,则可以执行以下操作:

class Program
{
    static void Main(string[] args)
    {
        DbGeometry test = DbGeometry.FromText("POLYGON((1 1, 1 2, 3 3, 1 1))");

        var foo = test.AsText();
        var points = new List<Point>();

        Console.WriteLine(foo);
        if (foo.StartsWith("POLYGON ((")
            && foo.EndsWith("))"))
        {
            foo = foo.Substring(10, foo.Length - 12);
            var rawPoints = foo.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            foreach (var rawPoint in rawPoints)
            {
                var splitPoint = rawPoint.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                points.Add(new Point() { X = decimal.Parse(splitPoint[1]), Y = decimal.Parse(splitPoint[0]) });
            }
        }

        foreach (var point in points)
        {
            Console.WriteLine(point.ToString());
        }


        Console.ReadKey();
    }
}
class Point
{
    public decimal X { get; set; }
    public decimal Y { get; set; }
    public override string ToString()
    {
        return string.Format("[X={0}],[Y={1}]", X, Y);
    }
}

结果:

POLYGON ((1 1, 1 2, 3 3, 1 1))
[X=1],[Y=1]
[X=2],[Y=1]
[X=3],[Y=3]
[X=1],[Y=1]