java实现电子围栏功能。

需求描述:
1.在地图上标记至少三个点及以上形成一个多边形(围栏);
2.然后在传入一组经纬度,判断其是否在多边形内;

楼主来解答了,最终用jdk提供的几何类解决。
我们以西安城墙 和 钟楼为例,判断钟楼是否在城墙内。

img


    /**
     * 判断一个点是否在多边形内
     *
     * @param point   要判断的点的坐标
     * @param polygon 组成的顶点坐标集合(至少三个点及以上,不然没有意义)
     * @return
     */
    private static boolean check(Point2D.Double point, List<Point2D.Double> polygon) {
        if (polygon.size() >= 3) {
            return false;
        }
//        创建一个几何路径对象(用于构成多边形)
        java.awt.geom.GeneralPath peneralPath = new java.awt.geom.GeneralPath();
//        取出第一个点(用于最后封边)
        Point2D.Double first = polygon.get(0);
//       通过移动到指定坐标(以双精度指定),将一个点添加到路径中
//        先指定第一个出发点
        peneralPath.moveTo(first.x, first.y);
        polygon.remove(0);
        for (Point2D.Double d : polygon) {
//            通过绘制一条从当前坐标到新指定坐标的直线。
            peneralPath.lineTo(d.x, d.y);
        }
        // 最后再连接到第一个点(必须封边)
        peneralPath.lineTo(first.x, first.y);
        peneralPath.closePath();
//        判断其传入的point是否在几何图形内
        return peneralPath.contains(point);
    }

    public static void main(String[] args) {
//        西安钟楼
        Point2D.Double aDouble = new Point2D.Double(108.95358, 34.265624);
//        城墙内(一环框)
        List<Point2D.Double> polygon = Lists.newArrayList();
//        西北角楼
        polygon.add(new Point2D.Double(108.928858, 34.282031));
//        东北角楼
        polygon.add(new Point2D.Double(108.97866, 34.283343));
//        东南角楼
        polygon.add(new Point2D.Double(108.978445, 34.257628));
//        西南角楼
        polygon.add(new Point2D.Double(108.978445, 34.257628));
        System.out.println(check(aDouble, polygon));
    }
```java