之前发过一个百度地图绘制限行区的文章。然后今天在整理工具类的时候看到了这个判断经纬度是否在图形中的工具类。利用这个工具类可以判断车辆是否驶进限行区内。
传送门:利用百度地图绘制区域(限行区)
验证的工具类:
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
/**
* 判断坐标是否在限行区内工具类
* @author LYX
*
*/
@Component("ztlUtil")
public class ZTLUtil {
/**
* 判断是否在多边形区域内
*
* @param pointLon
* 要判断的点的经度
* @param pointLat
* 要判断的点的纬度
* @param lon
* 区域各顶点的经度数组
* @param lat
* 区域各顶点的纬度数组
* @return
*/
public boolean isInPolygon(double pointLon, double pointLat, double[] lon,
double[] lat) {
// 将要判断的横纵坐标组成一个点
Point2D.Double point = new Point2D.Double(pointLon, pointLat);
// 将区域各顶点的横纵坐标放到一个点集合里面
List<Point2D.Double> pointList = new ArrayList<Point2D.Double>();
double polygonPoint_x = 0.0, polygonPoint_y = 0.0;
for (int i = 0; i < lon.length; i++) {
polygonPoint_x = lon[i];
polygonPoint_y = lat[i];
Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x, polygonPoint_y);
pointList.add(polygonPoint);
}
return check(point, pointList);
}
/**
* 一个点是否在多边形内
*
* @param point
* 要判断的点的横纵坐标
* @param polygon
* 组成的顶点坐标集合
* @return
*/
private boolean check(Point2D.Double point, List<Point2D.Double> polygon) {
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();
// 测试指定的 Point2D 是否在 Shape 的边界内。
return peneralPath.contains(point);
}
}