GPS点在面内验证工具


/**
 * @ClassName PolygonPointPair
 * @Description 用于构造地图中的经纬度点
 */
public class PolygonPointPair {
    private double X;// 经度
    private double Y;// 纬度
    public PolygonPointPair() {
    }
    public PolygonPointPair(double X, double Y) {
        this.X = X;
        this.Y = Y;
    }
    public double getX() {
        return X;
    }
    public void setX(double x) {
        X = x;
    }
    public double getY() {
        return Y;
    }
    public void setY(double y) {
        Y = y;
    }
}
package com.example.common.utils;
import com.example.entity.PolygonPointPair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

public class GPSAreaUtil {
    private static final Logger logger = LoggerFactory.getLogger(GPSAreaUtil.class);
    public boolean contains(Double x, Double y, List<PolygonPointPair> polygonPoints){
        if(x == null){
            logger.error("经度参数为空,直接返回false");
            return false;
        }else if(y == null){
            logger.error("纬度参数为空,直接返回false");
            return false;
        }else if(polygonPoints == null || polygonPoints.isEmpty()){
            logger.error("图形集合为空,直接返回false");
            return false;
        }
        Point2D.Double point = new Point2D.Double(x, y);
        List<Point2D.Double> polygon = new ArrayList<>();
        for(PolygonPointPair pair: polygonPoints){
            polygon.add(new Point2D.Double(pair.getX(), pair.getY()));
        }
        return this.contains(polygon, point);
    }
    /**
     * 判断点是否在多边形内
     * 步骤:
     * 		①声明一个“画笔”
     * 		②将“画笔”移动到多边形的第一个顶点
     * 		③用“画笔”按顺序将多边形的顶点连接起来
     * 		④用“画笔”将多边形的第一个点连起来,最终形成一个封闭的多边形
     * 		⑤用contains()方法判断点是否在多边形区域内
     * @param polygon	多边形
     * @param point		检测点
     * @return			点在多边形内返回true,否则返回false
     */
    public boolean contains(List<Point2D.Double> polygon, Point2D.Double point){
        GeneralPath p = new GeneralPath();
        Point2D.Double first = polygon.get(0);
        p.moveTo(first.x, first.y);
        for(Point2D.Double d : polygon){
            p.lineTo(d.x, d.y);
        }
        p.lineTo(first.x, first.y);
        p.closePath();
        return p.contains(point);
    }
    /**
     * 测试一个点是否在多边形内
     * @param args
     */
    public static void main(String[] args) {
        List<PolygonPointPair> pairs = new ArrayList<>();
        pairs.add(new PolygonPointPair(126.900729, 45.906359));
        pairs.add(new PolygonPointPair(126.908625, 45.902775));
        pairs.add(new PolygonPointPair(126.90399 , 45.896981));
        pairs.add(new PolygonPointPair(126.893433, 45.891844));
        pairs.add(new PolygonPointPair(126.882618, 45.892501));
        pairs.add(new PolygonPointPair(126.880472, 45.895309));
        pairs.add(new PolygonPointPair(126.894463, 45.898833));
        pairs.add(new PolygonPointPair(126.900729, 45.906359));

        GPSAreaUtil gpsAreaUtil = new GPSAreaUtil();
        if(gpsAreaUtil.contains(126.88581, 45.89481, pairs)){
            System.out.println("点在多边形内");
        }else{
            System.out.println("点在多边形外");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆天-逍遥哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值