Java 判断 一个点是不是在一个多边形围起来的区域内

MobilelocationEntity 是手机位置信息类 包含经度纬度

Enclosure 围栏类 每一个对象是形成多边形围栏的一个点 包含经度纬度

package com.sdunicomsi.util.map;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

import com.sdunicomsi.cgzft.entity.gis.Enclosure;
import com.sdunicomsi.cgzft.entity.gis.MobilelocationEntity;
/**
 * 
 * @author lxg
 *
 */
public class MapTools {
     /**
      * 判断当前位置是否在围栏内
      * @param mobilelocationEntity
      * @param enclosureList
      * @return
      */
	 public static boolean isInPolygon(MobilelocationEntity mobilelocationEntity,List<Enclosure> enclosureList){
		 double p_x =Double.parseDouble(mobilelocationEntity.getLongitude());
		 double p_y =Double.parseDouble(mobilelocationEntity.getLatitude());
		 Point2D.Double point = new Point2D.Double(p_x, p_y);

		 List<Point2D.Double> pointList= new ArrayList<Point2D.Double>();
		 
		 for (Enclosure enclosure : enclosureList){
			 double polygonPoint_x=enclosure.getLongitude();
			 double polygonPoint_y=enclosure.getLatitude();
			 Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x,polygonPoint_y);
			 pointList.add(polygonPoint);
		 }
		 MapTools test = new MapTools();
		 return test.checkWithJdkGeneralPath(point,pointList);
	 }
	 /**
	  * 返回一个点是否在一个多边形区域内
	  * @param point
	  * @param polygon
	  * @return
	  */
	private boolean checkWithJdkGeneralPath(Point2D.Double point, List<Point2D.Double> polygon) {
	       java.awt.geom.GeneralPath p = new java.awt.geom.GeneralPath();

		   Point2D.Double first = polygon.get(0);
		   p.moveTo(first.x, first.y);
		   polygon.remove(0);
		   for (Point2D.Double d : polygon) {
		      p.lineTo(d.x, d.y);
		   }

		   p.lineTo(first.x, first.y);

		   p.closePath();

		   return p.contains(point);

		}
}
第二种方法
// 方法二
// 方法二
public boolean checkWithJdkPolygon(Point2D.Double point, List<Point2D.Double> polygon) {
    java.awt.Polygon p = new Polygon();
    // java.awt.geom.GeneralPath
    final int TIMES = 1000;
    for (Point2D.Double d : polygon) {
        int x = (int) d.x * TIMES;
        int y = (int) d.y * TIMES;
        p.addPoint(x, y);
    }
    int x = (int) point.x * TIMES;
    int y = (int) point.y * TIMES;
    return p.contains(x, y);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值