之前搜索一些博客,判断含有经纬度的点在区域范围内并没有很好的解释,而且博客也不是很明确,让人很头疼,后来在自己的探索下,终于找到一些思路,完成后端判断是否在区域内的功能!
1、首先 springboot-data-mongodb 如果发现该点在区域内的话,会把构成区域的所有点都返回,如果不在区域的话,返回的list就是空集,话不多说上代码
@Data
@Document("SiteArea")
public class SiteArea {
private String AreaName;//区域名称
private int areaType;//区域类型,0代表行使区域,1代表停车区域
@GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE)
private GeoJsonPolygon geoJsonPolygon;//区域
}
如果实体类含有GeoJsonPolygon的话,会自动进行查找
//查询某个点是否在范围内
public List<SiteArea> findPointInPolygon( GeoJsonPoint point) {
Query query = new Query(Criteria.where("geoJsonPolygon").intersects(point));
List<SiteArea> list = mongoTemplate.find(query,SiteArea.class);
return list;
}
所以根据这个我们可以写检测经纬度坐标是否范围内。
//行驶区域
public boolean isDrivingArea(GeoJsonPoint point){
boolean flag=false;
List<SiteArea> list=findPointInPolygon(point);
if(list!=null){
for(SiteArea siteArea:list){
if(siteArea.getAreaType()==0){
flag= true;
break;
}
}
}else {
flag=false;
}
return flag;
}
具体使用如下:
@Test
public void inArea() {
GeoJsonPoint point=new GeoJsonPoint(113.330908, 23.155678);//区域内的一个
System.out.println(siteAreaDao.getAreaByName("A"));
System.out.println("已查询到!");
if (siteAreaDao.getAreaByName("A") != null){
System.out.println(siteAreaDao.findPointInPolygon( point));
System.out.println("在多边形内部");
}
GeoJsonPoint point2=new GeoJsonPoint(113.33831,23.137335);
if (siteAreaDao.getAreaByName("A") != null){
System.out.println(siteAreaDao.findPointInPolygon( point2));
System.out.println("在多边形外部");
}
}