2013-03-01 69 views
3

谁能告诉我怎么可以从类型“点”的DbGeography的集合对象从DbGeography集合创建DbGeography多边形点

到目前为止,我已经得到了创造型“多边形”的DbGeography对象这创建了多边形,但我错过了最初的步骤。

1. DbGeography multipoint = DbGeography.MultiPointFromText("MULTIPOINT(53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 52.86153 -1.018524)", 4326) 

2. DbGeometry temp_multipoint = DbGeometry.MultiPointFromBinary(multipoint.AsBinary(), 4326) 

3. DbGeography polygon = DbGeography.PolygonFromBinary(temp_multipoint.ConvexHull.AsBinary(), 4326); (RESULT) 

问题是从DbGeography列表创建初始的多点地理对象(点)

回答

2

我终于找到了如何从多个点创建多边形,而无需从WKT创建多边形。下面的解释稍微简化但仍然

var PolygonFromMultiplePoints = new DbGeography(); 

    using (var db = new LocationContext()) 
    { 
     //Select Locations known to be within a certain area which should define the polygon. 
     foreach (var item in db.Locations) 
     { 
      PolygonFromMultiplePoints.Union(item.GeoLocation); 
     } 
    }    
    var temp_multipointgeometry = DbGeometry.MultiPointFromBinary(PolygonFromMultiplePoints.AsBinary(), DbGeometry.DefaultCoordinateSystemId);    
    PolygonFromMultiplePoints = DbGeography.PolygonFromBinary(temp_multipointgeometry.ConvexHull.AsBinary(), DbGeography.DefaultCoordinateSystemId); 

代码示例假定您已经有一个dbgeography的集合存储为数据库中的点。我的数据库信息来自从GeoNames导入位置。

+0

对于我的情况,最好使用MultiPointFromText方法,因为我有90,000个点,并且使用联合很慢,而且我只需要结果的凸包,因此点的顺序无关紧要。 MultiPointFromText不到一秒钟,而使用联盟花了一个多小时。 – Betty 2018-02-21 10:24:34

4

使用WKT创建每个点作为DbGeography对象:

DbGeography point1 = DbGeography.FromText("POINT(53.095124 -0.864716)", 4326); 
DbGeography point2 = DbGeography.FromText("POINT(53.021255 -1.337128)", 4326); 
DbGeography point3 = DbGeography.FromText("POINT(52.808019 -1.345367)", 4326); 
... 
DbGeography polygon = DbGeography.PolygonFromText("POLYGON((53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 53.095124 -0.864716))", 4326); 

有两点需要注意:

  • WKT格式是经度然后是纬度,不是更直观的纬度,长度
  • 对于一个多边形,最后一个点必须与第一点相匹配“关闭关闭”

希望这有助于 - 我还作战学习多边形的东西!

请参见本文的WKT格式额外提示:http://en.wikipedia.org/wiki/Well-known_text

+0

感谢您的输入,但它不是我正在寻找的东西,因为我已经将数据库中的所有点都设置为DbGeography字段。 我自从问题找到另一个解决方案,这将增加这个问题,当我得到的时间。 – Drauka 2013-03-27 10:57:03

+0

找到时间了吗? – BritishDeveloper 2013-05-03 05:47:51

0

你真的应该做它在C#中,添加点以迭代的方式为一对夫妇的原因:

  • 您需要确保结束位置与开始位置相同。
  • 由于环形方向,您需要确保顺时针添加点。你可以翻转环,逆时针(sqlGeography.ReorientObject();)。

你正在处理空间数据,但复杂形状的构造从来就不是为了T-SQL。最坏的情况是把它放在CLR函数中。