需求描述:
1.在地图上标记至少三个点及以上形成一个多边形(围栏);
2.然后在传入一组经纬度,判断其是否在多边形内;
楼主来解答了,最终用jdk提供的几何类解决。
我们以西安城墙 和 钟楼为例,判断钟楼是否在城墙内。
/**
* 判断一个点是否在多边形内
*
* @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