如何检查线串是否与Java中的多边形相交

问题描述

我正在尝试生成一个linestring来避免在地图上出现多个polygons,但是为此,我需要一种方法来检查linestring是否与{{ 1}}。最初,我尝试使用这种方法来吸收polygon端点的坐标和要避免的多边形列表:

linestring

但是public boolean Intersects(Double endPosLng,Double endPosLat,List<polygon> polygons) { Boolean intersects = false; Point end = Point.fromLngLat(endPosLng,endPosLat); for (polygon poly : polygons) { if (TurfJoins.inside(end,poly)) { intersects = true; } } return intersects; } 仅考虑TurfJoins.inside(end,polygon)的端点,因此该线可能会切入多边形的一角(请参见下图),但仍会终止于多边形的外部,因此该方法不会将其检测为路口。

Line cuts through polygon

我曾考虑过传递linestring的先前坐标以生成linestring的一部分,但是我不认为MapBox有一种方法可以检查linestring是否与linestring

如何检查polygon是否与多边形相交?

解决方法

首先,您的Point似乎是错误的分数课。您应该使用java.awt.Point,而不要使用所使用的任何GeoJSON库中的Point。接下来,如果您的多边形没有大量边缘,则只需检查直线是否与任何边缘相交即可:

import java.awt.geom.Line2D;
import java.awt.Polygon;

class Intersects {
    public static boolean intersects(Line2D line,Polygon poly) {
        for (int i = 0; i < poly.npoints; i ++) {
            int nextI = (i + 1) % poly.npoints;
            Line2D edge = new Line2D.Double(poly.xpoints[i],poly.ypoints[i],poly.xpoints[nextI],poly.ypoints[nextI]);
            if (line.intersectsLine(edge)) {
                return true;
            }
        }
        return false;
    }

    // test cases
    public static void main(String[] args) {
        Polygon poly = new Polygon(
                new int[]{0,1,0},new int[]{0,1},4
        ); // square of edge length 1 with bottom-left corner at (0,0)
        Line2D[] lines = new Line2D[]{
                new Line2D.Double(-0.5,-0.5,0.5,0.5),// true
                new Line2D.Double(0.5,2.0,3.0),// false
                new Line2D.Double(0.5,-0.1,1.2,0.5) // true
        };
        for (Line2D line: lines) {
            System.out.printf("%s: %b\n",line,intersects(line,poly));
        }
    }
}