Java判断一个点是否在一个多边形内
程序员文章站
2022-04-02 21:21:40
...
Java根据几个点坐标,画一个区域,判断其他坐标是否在区域内
调用isInPolygon方法,带上参数就可以,参数接收可以根据自己需要替换掉。
代码如下:
package com.maptest.util;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import com.maptest.entity.AllUser;
public class GetRegionUsersUtil {
/**
* 判断是否在多边形区域内
*
* @param lonandlat要判断的点的横坐标 经度,纵坐标 维度
* @param lon 区域各顶点的横坐标数组
* @param lat 区域各顶点的纵坐标数组
* @return
*/
public static List<Integer> isInPolygon(List<AllUser> lonandlat, double[] lon, double[] lat) {
// 符合区域内的信息id
List<Integer> idList = new ArrayList<Integer>();
// 将区域各顶点的横纵坐标放到一个点集合里面
List<Point2D.Double> pointList = new ArrayList<Point2D.Double>();
double polygonPoint_x = 0.0, polygonPoint_y = 0.0;
for (int i = 0; i < lon.length; i++) {
polygonPoint_x = lon[i];
polygonPoint_y = lat[i];
Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x, polygonPoint_y);
pointList.add(polygonPoint);
}
Point2D.Double first = pointList.get(0);
GeneralPath peneralPath = area(pointList);
// 将要判断的横纵坐标组成一个点
for (AllUser map : lonandlat) {
Point2D.Double point = new Point2D.Double(map.getLongitude(), map.getLatitude());
//System.out.println("测试点:" + point);
//System.out.println("测试区域:" + pointList);
// 判断是否在多边形区域边上
if (isOnPolygon(pointList, first, point)) {
idList.add(map.getId());
}
// 判判断是否在多边形区域内部
if (check(point, peneralPath)) {
idList.add(map.getId());
//System.out.println("成功:" + point);
}
}
return idList;
}
/**
* @param point 要判断的点的横纵坐标
* @param polygon 组成的顶点坐标集合
* @return
*/
private static GeneralPath area(List<Point2D.Double> polygon) {
java.awt.geom.GeneralPath peneralPath = new java.awt.geom.GeneralPath();
Point2D.Double first = polygon.get(0);
// 通过移动到指定坐标(以双精度指定),将一个点添加到路径中
peneralPath.moveTo(first.x, first.y);
polygon.remove(0);
for (Point2D.Double d : polygon) {
// 通过绘制一条从当前坐标到新指定坐标(以双精度指定)的直线,将一个点添加到路径中。
peneralPath.lineTo(d.x, d.y);
}
// 将几何多边形封闭
peneralPath.lineTo(first.x, first.y);
peneralPath.closePath();
return peneralPath;
// 测试指定的 Point2D 是否在 Shape 的边界内。
// return peneralPath.contains(point);
}
private static boolean check(Point2D.Double point, GeneralPath peneralPath) {
// 测试指定的 Point2D 是否在 Shape 的边界内。
return peneralPath.contains(point);
}
/**
* 判断是否在多边形区域边上
*
* @return
*/
public static boolean isOnPolygon(List<Point2D.Double> polygon, Point2D.Double first, Point2D.Double point) {
boolean rtn = false;
for (int i = 1; i < polygon.size(); i++) {
Point2D.Double next = polygon.get(i);
boolean pdline = (point.x - first.getX()) * (first.getY() - next.getY()) == (first.getX() - next.getX())
* (point.y - first.getY());
first = next;
if (pdline) {
rtn = pdline;
}
}
return rtn;
}
}
上一篇: 刷题笔记
下一篇: java 判断一个点是否在一个多边形内
推荐阅读
-
C#实现判断一个时间点是否位于给定时间区间的方法
-
如何判断一个元素在亿级数据中是否存在?
-
js 判断当前时间是否处于某个一个时间段内
-
Shell脚本实现判断IP地址是否在一个ip段内代码分享
-
这四点判断一个男人是否值得结婚
-
java中判断一个对象是否实现了某个接口 JavaCC++C#J#
-
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
-
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
-
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
-
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。