Java判断坐标点是否在片区内—代码备份

package com.sun4j.module.util; import com.daoles.module.entity.Area; import com.daoles.module.entity.AreaInfo; import com.daoles.module.service.AreaInfoService; import com.daoles.module.service.AreaService; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * description: 技术百度地图中的点在某个片区中 * Created by Sunlight on 2017/4/27. */ public class MapTools { /** * 传入一个坐标点判断 * @param areaService * @param areaInfoService * @param x 经度 * @param y 纬度 * @return 返回改点对应的片区 */ public static Area getAreaByPoint (AreaService areaService, AreaInfoService areaInfoService,Double x,Double y){ Point2D.Double point = new Point2D.Double(x, y); Map<String,Object> params= new HashMap<>(); params.put( "deleted" , 0 ); //查询所有片区 List<Area> areas=areaService.findList(params); if (areas.size()== 0 ){ return null ; } for (Area area : areas){ params= new HashMap<>(); params.put( "areaId" ,area.getId()); List<AreaInfo> areaInfos=areaInfoService.findList(params); if (areaInfos.size()== 0 ){ continue ; } List<Point2D.Double> pts = new ArrayList<Point2D.Double>(); for (AreaInfo info : areaInfos) { pts.add( new Point2D.Double(info.getLng(), info.getLat())); } if (IsPtInPoly(point, pts)) { System.out.println( "===========点在多边形内===========" ); return area; } else { System.out.println( "===========点在多边形外===========" ); continue ; } } return null ; } /** * 判断点是否在多边形内 * * @param point 检测点 * @param pts 多边形的顶点 * @return 点在多边形内返回true, 否则返回false */ public static boolean IsPtInPoly (Point2D.Double point, List<Point2D.Double> pts) { int N = pts.size(); boolean boundOrVertex = true ; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true int intersectCount = 0 ; //cross points count of x double precision = 2e-10 ; //浮点类型计算时候与0比较时候的容差 Point2D.Double p1, p2; //neighbour bound vertices Point2D.Double p = point; //当前点 p1 = pts.get( 0 ); //left vertex for ( int i = 1 ; i <= N; ++i) { //check all rays if (p.equals(p1)) { return boundOrVertex; //p is an vertex } p2 = pts.get(i % N); //right vertex if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) { //ray is outside of our interests p1 = p2; continue ; //next ray left point } if (p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) { //ray is crossing over by the algorithm (common part of) if (p.y <= Math.max(p1.y, p2.y)) { //x is before of ray if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) { //overlies on a horizontal ray return boundOrVertex; } if (p1.y == p2.y) { //ray is vertical if (p1.y == p.y) { //overlies on a vertical ray return boundOrVertex; } else { //before ray ++intersectCount; } } else { //cross point on the left side double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y; //cross point of y if (Math.abs(p.y - xinters) < precision) { //overlies on a ray return boundOrVertex; } if (p.y < xinters) { //before ray ++intersectCount; } } } } else { //special case when ray is crossing through the vertex if (p.x == p2.x && p.y <= p2.y) { //p crossing over p2 Point2D.Double p3 = pts.get((i + 1 ) % N); //next vertex if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) { //p.x lies between p1.x & p3.x ++intersectCount; } else { intersectCount += 2 ; } } } p1 = p2; //next ray left point } return intersectCount % 2 != 0 ; }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值