1. 程式人生 > 其它 >Java判斷一個點是否在一個多邊形內

Java判斷一個點是否在一個多邊形內

技術標籤: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; } }