public class Test {
public static void main(String[] args) {
GeoPoint[] geoPoints = new GeoPoint[4];
geoPoints[0] = new GeoPoint();
geoPoints[0].setLat((double) 0);
geoPoints[0].setLon((double) 0);
geoPoints[1] = new GeoPoint();
geoPoints[1].setLat((double) 0);
geoPoints[1].setLon((double) 1);
geoPoints[2] = new GeoPoint();
geoPoints[2].setLat((double) 1);
geoPoints[2].setLon((double) 1);
geoPoints[3] = new GeoPoint();
geoPoints[3].setLat((double) 1);
geoPoints[3].setLon((double) 0);
GeoPoint testPoint = new GeoPoint();
testPoint.setLat(0.0);
testPoint.setLon(0.0);
System.out.println(check(geoPoints,testPoint));
System.out.println(pnpoly(geoPoints,testPoint));
}
//1.先粗略看是否在多边形矩形内
public static boolean check(GeoPoint[] geoPoints, GeoPoint testPoint)
{
//找出最大值与最小值,范围
Double lonMax=0.0,lonMin=0.0,latMax=0.0,latMin=0.0;
for(GeoPoint one:geoPoints)
{
if(one.getLat()>latMax)
{
latMax=one.getLat();
}
if(one.getLat()<latMin)
{
latMin=one.getLat();
}
if(one.getLon()>lonMax)
{
lonMax=one.getLon();
}
if(one.getLon()<lonMin)
{
lonMin=one.getLon();
}
}
// System.out.println(latMax);
// System.out.println(latMin);
// System.out.println(lonMax);
// System.out.println(lonMin);
if(testPoint.getLon()>lonMax || testPoint.getLon()<lonMin || testPoint.getLat()>latMax || testPoint.getLat()<latMin )
{
return false;
}
return true;
}
//2.pnpoly算法,testPoint点平行y轴(或x轴)的,以testPoint点为原点的射线,与多边形的交点数量,交点次数,奇数为真,偶数为假
public static boolean pnpoly(GeoPoint[] geoPoints, GeoPoint testPoint)
{
int i, j;
boolean c=false;
int nvert = geoPoints.length;
for (i = 0, j = nvert-1; i < nvert; j = i++) {
//1.被测试点的纵坐标testy是否在本次循环所测试的两个相邻点纵坐标范围之内
//2.待测点test是否在i,j两点之间的连线之下
if ( ((geoPoints[i].getLon()>testPoint.getLon()) != (geoPoints[j].getLon()>testPoint.getLon())) &&
(testPoint.getLat() < (geoPoints[j].getLat()-geoPoints[i].getLat()) * (testPoint.getLon()-geoPoints[i].getLon()) / (geoPoints[j].getLon()-geoPoints[i].getLon()) + geoPoints[i].getLat()) )
//交点次数,奇数为真,偶数为假
c= c==false?true:false;
}
return c;
}
}
class GeoPoint{
Double lat;
Double lon;
public Double getLat() {
return lat;
}
public void setLat(Double lat) {
this.lat = lat;
}
public Double getLon() {
return lon;
}
public void setLon(Double lon) {
this.lon = lon;
}
}
geo point 判断点是否在多边形内
最新推荐文章于 2024-08-20 16:01:51 发布