首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测多个多边形交叉口(java)

检测多个多边形交叉口(java)
EN

Stack Overflow用户
提问于 2015-01-14 15:38:07
回答 2查看 2.3K关注 0票数 4

背景:本项目涉及GIS环境下的区域制图。我需要找到一组多边形和另一组多边形的交集。我通过将与地图兼容的多边形转换为Polygon2d (http://geom-java.sourceforge.net/api/math/geom2d/polygon/package-summary.html)来实现这一点,并使用交集方法为交叉多边形查找顶点列表。

问题:这是可行的,除非在同一两个多边形之间有多个重叠区域。顶点列表是正确的,但我需要将列表划分为每个单独的多边形。

第一个图像应该是什么样子,第二个是实际生成的图像:

(忽略顶部的区域。这是一个不同的错误的结果)

如何检测和纠正这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-19 13:40:55

我想出来了。我取交多边形(蓝色)的顶点列表,迭代每对点,将两个原始多边形中的每个线段转换为LineSegment2D对象,并使用.contains方法检查每对点是否位于其中一个线段中。如果每一对点不包含在1行内,那么就会有一个错误。

这里是方法,但请记住,其中涉及到几个专有类。

代码语言:javascript
复制
public static boolean noErrors(SurfacePolygonX p1, SurfacePolygonX p2, List<LatLon> list) {
    boolean allPointsInSamePolygon = true;

    //for each latlon jl in locations, cast jl and jl2 as points    
    for (int j = 0; j < list.size(); j++) {
        LatLon jl = list.get(j);
        LatLon jl2 = list.get((j == list.size() - 1) ? 0 : j + 1);
        Point2D pt = new Point2D(jl.longitude.degrees, jl.latitude.degrees);
        Point2D pt2 = new Point2D(jl2.longitude.degrees, jl2.latitude.degrees);

        List<LatLon> corners = p1.getCorners();

        boolean bothPointsInSameSegment = false;

        //for each latlon k selectedShape cast k and k+1 as 2lineseg
        for (int k = 0; k < corners.size(); k++) {
            LatLon kl = corners.get(k);
            LatLon kl2 = corners.get((k == corners.size() - 1) ? 0 : k + 1);

            LineSegment2D segment = new LineSegment2D(kl.longitude.degrees, kl.latitude.degrees, kl2.longitude.degrees, kl2.latitude.degrees);

            boolean segContainsP1 = segment.contains(pt);
            boolean segContainsP2 = segment.contains(pt2);

            System.out.println("selectedShape: segment "+k+" contains p"+j+":("+segContainsP1+") and p"+(j+1)+":("+segContainsP2+")");

            //check if each line contains the points.
            if (segContainsP1 && segContainsP2)
            {
                bothPointsInSameSegment = true;
            }

        }

        corners = p2.getCorners();
        //for each latlon k tempShape cast k and k+1 as 2lineseg
        for (int k = 0; k < corners.size(); k++) {
            LatLon kl = corners.get(k);
            LatLon kl2 = corners.get((k == corners.size() - 1) ? 0 : k + 1);

            LineSegment2D segment = new LineSegment2D(kl.longitude.degrees, kl.latitude.degrees, kl2.longitude.degrees, kl2.latitude.degrees);


            boolean segContainsP1 = segment.contains(pt);
            boolean segContainsP2 = segment.contains(pt2);

            System.out.println("intersectingShape: segment "+k+" contains p"+j+":("+segContainsP1+") and p"+(j+1)+":("+segContainsP2+")");

            //check if each line contains the points.
            if (segContainsP1 && segContainsP2)
            {
                bothPointsInSameSegment = true;
            }

        }

        if (!bothPointsInSameSegment) allPointsInSamePolygon = false;

    }

    //if both points are not in the same line, then theres a conflict
    return allPointsInSamePolygon;
}
票数 0
EN

Stack Overflow用户

发布于 2016-07-11 07:29:37

您可以使用JTS

  1. 使用LinearRing创建多边形
  2. 使用交叉点方法

简单的代码示例:

代码语言:javascript
复制
// build polygon p1
LinearRing p1 = new GeometryFactory().createLinearRing(new Coordinate[]{new Coordinate(0,0), new Coordinate(0,10), new Coordinate(10,10), new Coordinate(10,0), new Coordinate(0,0)});
// build polygon p2
LinearRing p2 = new GeometryFactory().createLinearRing(new Coordinate[]{new Coordinate(5,5), new Coordinate(15,5), new Coordinate(15,15), new Coordinate(5,15), new Coordinate(5,5)});
// calculate intersecting points
Geometry intersectingPoints = p1.intersection(p2);
// print result
for(Coordinate c : intersectingPoints.getCoordinates()){
    System.out.println(c.toString());
}

输出(与预期的一样):

代码语言:javascript
复制
(5.0, 10.0, NaN)
(10.0, 5.0, NaN)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27946725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档