0

如果我linestring在 JTS 中有一条(或通常是某种开放的折线),其方向由它的起点定义,是否有一些聪明的方法可以告诉在与封闭的交叉点polygonlinestring“进入”多边形还是退出它,要么:

  • 在 JRS 中(我在文档中找不到方法),只有直线和闭合形状相交的坐标intersection
  • 一些通用的聪明方法。我目前已经通过测试一个非常小的距离来完成它,沿着边缘linestring的任一侧polygon并测试哪个是'in',哪个是'out'。polygon如果具有(不太可能)非常尖锐的内部边缘,这可能会返回不正确的结果。
4

2 回答 2

1

检查一段的起点linestring是在多边形内部还是外部,以确定它是进入还是退出polygon. 简单的代码示例:

// some demo polygon + line
Polygon polygon = new GeometryFactory().createPolygon(new Coordinate[]{new Coordinate(1,1), new Coordinate(6,1), new Coordinate(6,6), new Coordinate(1,6), new Coordinate(1,1)});
LineString line = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 0), new Coordinate(5,5), new Coordinate(10,5)});

// check for intersection in the first place
if(line.intersects(polygon)){
    System.out.println("line intersects polygon!");
    // iterate over all segments of the linestring and check for intersections
    for(int i = 1; i < line.getNumPoints(); i++){
        // create line for current segment
        LineString currentSegment = new GeometryFactory().createLineString(new Coordinate[]{line.getCoordinates()[i-1], line.getCoordinates()[i]});
        // check if line is intersecting with ring
        if(currentSegment.intersects(polygon)){
            // segment is entering the ring if startpoint is outside the ring
            if(!polygon.contains(currentSegment.getStartPoint())){
                System.out.println("This segment is entering the polygon -> ");
                System.out.println(currentSegment.toText());
            // startpoint is inside the ring
            }
            if (polygon.contains(currentSegment.getStartPoint())) {
                System.out.println("This segment is exiting the polygon -> ");
                System.out.println(currentSegment.toText());
            }
        }
    }
} else {
    System.out.println("line is not intersecting the polygon!");
}

此代码并未涵盖所有可能性。例如,如果单个线段与多边形多次相交(进入 + 退出),则此示例未涵盖此内容。在这种情况下,只需计算交叉点的数量并在交叉点之间创建相应数量的线串。

于 2016-08-14T08:03:17.693 回答
0

回答我自己的问题 - 对于任何有类似问题的人。我最终根据交叉点的数量编写了一些代码(因为我已经通过 JTS 获得了这些代码)。想法源于交叉数算法奇偶规则

“规则”(我认为没有例外,可能是错误的)是:

  1. 进入交叉口后必须有出口,反之亦然。
  2. 如果从封闭的多边形开始,第一个交点就是出口。
  3. 如果您不是从多边形开始,则第一个交叉点是一个输入。

作为伪代码,是这样的:

    Get intersection_points between polyline and closed polygon // using JTS.intersect()
    Sort intersection_points along chainage of polyline
    if polyline start_point in polygon // using JTS.contains()
        first intersect_point is an EXIT, next is an ENTER, EXIT, ENTER and so on alternating along chainage.
    else //start point not in polygon
        first intersect_point is an ENTER, next is an EXIT, ENTER, EXIT and so on along chainage.

还没有查看 JTSintersectcontains方法的源代码,所以我正在做的事情可能会加倍并在那里进行一些优化。

于 2016-08-27T00:38:02.643 回答