4

谁能告诉我如何从“POINT”类型的 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(POINTS) 列表创建初始多点地理对象

4

3 回答 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 格式是经度然后纬度,而不是更直观的纬度,经度
  • 对于多边形,LAST 点必须与 FIRST 点匹配才能“将其关闭”

希望这会有所帮助——我也在努力学习多边形的东西!

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

于 2013-03-25T14:46:06.767 回答
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 导入位置。

于 2013-09-23T23:39:37.620 回答
0

您真的应该在 C# 中执行此操作,以迭代方式添加点,原因如下:

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

您正在处理空间数据,但复杂形状的构造从来都不适用于 T-SQL。最坏的情况是把它放在 CLR 函数中。

于 2013-09-22T04:48:01.127 回答