从DbGeography Points的集合中创建一个DbGeography多边形

4

有人可以告诉我如何从一个类型为“POINT”的DbGeography对象集合创建一个类型为“Polygon”的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(POINTS)列表创建初始的多点地理对象。

3个回答

6

使用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


谢谢你的输入,不过这并不完全符合我的需求,因为我已经把所有的数据点存储在数据库中作为 DbGeography 字段。 在此之后,我已经找到了另一个解决方案,等我有时间时会添加到这个问题中。 - Drauka
经典问题:“我遇到了<你的确切问题>,有人能帮忙吗?算了,我自己解决了,再见。” - SteveCav

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导入位置。


对于我的情况,最好使用MultiPointFromText方法,因为我有90,000个点,并且使用union很慢,而且我只需要结果的凸包,所以点的顺序并不重要。 MultiPointFromText在一秒内完成,而使用union则需要一个多小时。 - Betty

0

你应该使用C#编写它,通过迭代的方式添加点,原因如下:

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

你正在处理空间数据,但是构建复杂形状从来不是为T-SQL设计的。最坏的情况是将其放入CLR函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接