我正在尝试解析一个多边形,它呈现为DbGeometry
类(从System.Data.Entity.Spatial
)到某个List表示,但是失败了。
我试过了:
- 使用方法转换它.ToList<>()
- 使用.NET中的JSON库进行解析,但是通过反序列化DbGeometry
所以,现在我将几何体作为字符串返回到我的Web API应用程序中:
如果我找不到任何解决方案如何,要将其表示为双打列表,我将不得不在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
,另一个名称)看到该表的结构。
所以我想:
准备好双打名单,所以我的问题是:How can I parse DbGeometry instance, which holds a collection of points into List<Point>?
。
答案 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]