我对与多边形相交的线段有疑问。我有一些代表一些步行路径的线(绿色)和一些代表多边形的限制多边形(黑色)。
首先,我使用这样的东西创建了多边形:
var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326);
var vertices = new List<Coordinate>();
foreach (var coords in stringPolygon)
{
var coordinates = coords.Split(",");
var x = double.Parse(coordinates[0]);
var y = double.Parse(coordinates[1]);
var newCoordinate = new Coordinate(y,x);
vertices.Add(newCoordinate);
}
var outerRing = geometryFactory.CreateLinearRing(vertices.ToArray());
spatialData.FieldPolygon = geometryFactory.CreatePolygon(outerRing);
然后像这样创建线串:
var vertices = new List<Coordinate>();
foreach (var trip in tripSegments.Data)
{
var newCoordinate = new Coordinate(trip.Lng, trip.Lat);
vertices.Add(newCoordinate);
}
spatialData.TripLine = geometryFactory.CreateLineString(vertices.ToArray());
尝试过交叉路口
var intersect = spatialData.FieldPolygon.Boundary.Intersection(spatialData.TripLine);
而且也有区别但没有运气
var intersect = spatialData.FieldPolygon.Boundary.Difference(spatialData.TripLine);
还尝试使用 WKT Reader 以及像这样的交集和差异的组合(我想知道这是否是正确的方法):
var reader = new WKTReader();
var targetMultiPolygon = reader.Read(spatialData.TripLine.ToString());
var bufferPolygon = reader.Read(spatialData.FieldPolygon.Boundary.ToString());
var intersection = targetMultiPolygon.Intersection(bufferPolygon);
var targetClipped = targetMultiPolygon.Difference(intersection);
var wktTargetAfterClip = targetClipped.ToString();
但是我遇到了这样的错误(使用 WKT 方法时)。
TopologyException: found non-noded intersection between LINESTRING(26.563827556466403 43.52431484490672, 26.56386783617048 43.52429417990681) and LINESTRING(26.565492785081837 43.52349421574761, 26.56386783617048 43.52429417990681) [ (26.56386783617048, 43.52429417990681, NaN) ]
更新
我已经修复了 WKT Reader 的拓扑问题
var bufferPolygon = reader.Read(spatialData.FieldPolygon.Boundary.ToString());
在阅读器上,我添加了Boundary
属性和固定的拓扑问题。但主要问题仍然存在,正如它可以在这里看到的那样。
我使用这段代码来提取不相交并添加到不同图层的线,但是正如您在红色方块中看到的那样,有些线是绿色的,它们应该是紫色(虚线),因为它们在黑色多边形之外但它们仍然是绿色的。
var outsideLines = new List<ILineString>();
foreach (ILineString lineString in geometries.Geometries)
{
var isIntersecting = lineString.Intersects(spatialData.FieldPolygon.Boundary);
if (!isIntersecting)
{
outsideLines.Add(lineString);
}
}
spatialData.IntersectedMultiLine = geometryFactory.CreateMultiLineString(outsideLines.ToArray());
现在,我的主要问题是:是否可以提取多边形外部的线并且我是否在正确的轨道上?