我正在创建一个 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是荷兰多边形的坐标。
看起来坐标是正确的,但也许它应该输出一个多边形。有谁知道如何执行此操作或我的代码中还有什么问题?
我没有在后端正确检查类型。
在后端,我将方法更改为以下内容。
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];
}
}