问题描述
我正在尝试生成一个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)
的端点,因此该线可能会切入多边形的一角(请参见下图),但仍会终止于多边形的外部,因此该方法不会将其检测为路口。
我曾考虑过传递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));
}
}
}