判断一个经纬度是否落在一个指定的区域范围内有多种实现方式比如:调用地图API,Path2D 包和射线法等多种方式,这里用的是Path2D 包来实现 ,这是它的api文档Path2D-api
/** * 使用Path2D创建一个多边形
* @param polygon 经纬度 集合
* @return 返回Path2D.Double
*/
private static Path2D.Double create(List<ScopeRequest> polygon) {//创建path2D对象
Path2D.Double generalPath = new Path2D.Double();
//获取第一个起点经纬度的坐标
ScopeRequest first = polygon.get(0);
// 通过移动到以double精度指定的指定坐标,把第一个起点添加到路径中
generalPath.moveTo(first.getLongitude(), first.getLatitude());
//把集合中的第一个点删除防止重复添加
polygon.remove(0);
//循环集合里剩下的所有经纬度坐标
for (ScopeRequest d : polygon) {
// 通过从当前坐标绘制直线到以double精度指定的新指定坐标,将路径添加到路径。
//从第一个点开始,不断往后绘制经纬度点
generalPath.lineTo(d.getLongitude(), d.getLatitude());
}
// 最后要多边形进行封闭,起点及终点
generalPath.lineTo(first.getLongitude(), first.getLatitude());
// 将直线绘制回最后一个 moveTo的坐标来关闭当前子路径。
generalPath.closePath();
return generalPath;
}
/**
* 判断点是否在区域内
* @param polygon 区域经纬度json字符串
* @param longitude 经度
* @param latitude 纬度
* @return 返回true跟false
*/
public static boolean isPoint(String polygon, double longitude, double latitude) {
JSONArray jsonArray = JSON.parseArray(polygon);
//将json转换成对象
List<ScopeRequest> list = JSON.parseArray(jsonArray.toJSONString(), ScopeRequest.class);
Path2D path2D = create(list);
// true如果指定的坐标在Shape边界内; 否则为false 。
return path2D.contains(longitude, latitude);
}
public class ScopeRequest {
private Double longitude;
private Double latitude;
public ScopeRequest(){}
public ScopeRequest(Double longitude,Double latitude){
this.longitude = longitude;
this.latitude = latitude;
}
}