Nettopologysuite Geometry.Intersection 不输出预期的多边形

问题描述 投票:0回答:1

我正在创建一个 Web 应用程序,它显示在荷兰境内的 x 分钟内可以到达哪些区域。为此,我想将可到达区域的多边形与荷兰之一相交。

我正在使用传单库在前端显示多边形。

计算相交多边形时,多边形不会像我预期的那样是相交区域的闭合多边形。

在这张图中可以看到荷兰的多边形(我只在前端显示轮廓):

可到达区域的多边形可以在这张图中看到:

然后使用这个方法,我形成了这些多边形之间的交集的多边形,并返回坐标显示在前端。

public Coordinate[] GetAreaInTheNetherlands(Point[] area, Coordinate[] border)
  {
    var geometryFactory = new GeometryFactory();

    var borderPolygon = (Geometry)geometryFactory.CreatePolygon(border.Append(border.FirstOrDefault()).ToArray());
    borderPolygon = borderPolygon.Buffer(0);

    var areaPolygon = (Geometry)geometryFactory.CreatePolygon(area.Select(p => p.Coordinate).ToArray());
    areaPolygon = areaPolygon.Buffer(0);

    var intersect = areaPolygon.Intersection(borderPolygon);
    intersect = intersect.Buffer(0);

    return intersect.Coordinates;
  }

在此上下文中,area是可达区域,border是荷兰多边形的坐标。

这将输出以下多边形:

看起来坐标是正确的,但也许它应该输出一个多边形。有谁知道如何执行此操作或我的代码中还有什么问题?

c# asp.net leaflet polygon nettopologysuite
1个回答
0
投票

我没有在后端正确检查类型。

在后端,我将方法更改为以下内容。

public Polygon[] GetAreaInTheNetherlands(Coordinate[] area, Coordinate[] border)
  {
    var geometryFactory = new GeometryFactory();
    var borderPolygon = GeometryUtils.CreatePolygons(geometryFactory, border.Append(border.FirstOrDefault()).ToArray()!).First();
    var areaPolygon = GeometryUtils.CreatePolygons(geometryFactory, area).First();
    
    var intersection = areaPolygon.Intersection(borderPolygon);
    if (intersection is MultiPolygon)
    {
      return ((MultiPolygon)intersection).Select(p => (Polygon)p).ToArray();
    }
    return new Polygon[] { (Polygon)intersection };
  }

我不得不稍微调整一下在前端接收 api 调用的方式,但我只剩下:

注意: 我还制作了一个自定义的 CreatePolygons 方法,因为我意识到在创建多边形并使用 Buffer 方法时,输出也可以是 MultiPolygon(上面的代码从来不是这种情况,因此是 First(),但它在我的其他一些方法):

public static Polygon[] CreatePolygons(GeometryFactory geometryFactory, Coordinate?[]? coordinates, bool debug = false)
  {
    var geometry = geometryFactory.CreatePolygon(coordinates).Buffer(0);
    
    if (!geometry.IsValid) System.Console.WriteLine("Geometry is not valid");
    
    if (geometry is Polygon)
    {
      if (debug) System.Console.WriteLine("Geometry is of type Polygon");
      return new Polygon[] { (Polygon)geometry };
    } 
    else if (geometry is MultiPolygon) 
    {
      if (debug) System.Console.WriteLine("Geometry is of type MultiPolygon");
      return ((MultiPolygon)geometry).Select(p => (Polygon)p).ToArray();
    }
    else 
    {
      System.Console.WriteLine("ERROR: Geometry is not of type Polygon or MultiPolygon.");
      return new Polygon[0];
    }
  }
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.