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);
}
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);
}
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("点在多边形外");
}
}
}