Java判斷一個點是否在一個多邊形內
阿新 • • 發佈:2020-12-15
技術標籤:Java專案sqlgitjavaspringjavascript
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;
}
}