关于指定的经纬度是否落在多边形内

原创 2015年07月09日 15:55:55

这个想法算法就是判断一个点向左的射线跟一个多边形的交叉点有几个,如果结果为奇数的话那么说明这个点落在多边形中,反之则不在。直接贴代码吧


A:


B:


C:


D:


E:


no1:


no2:


y1:


y2:


以上的ABCDE,分别是以下数组里面的数据

Point[] ps = new Point[] { new Point(120.2043 , 30.2795), new Point(120.2030 , 30.2511), new Point(120.1810 , 30.2543), new Point(120.1798 , 30.2781), new Point(120.1926,30.2752) };


实际生产环境的贴图:



package com.cmcc.monitor.test;

public class GisTest {

	public static void main(String[] args) {
		Point[] ps = new Point[] { new Point(120.2043 , 30.2795), new Point(120.2030 , 30.2511), new Point(120.1810 , 30.2543), new Point(120.1798 , 30.2781), new Point(120.1926,30.2752) };
		Point n1 = new Point(120.1936 , 30.2846);
		Point n2 = new Point(120.1823 , 30.2863);
		Point n3 = new Point(120.2189 , 30.2712);
		Point y1 = new Point(120.1902 , 30.2712);
		Point y2 = new Point(120.1866 , 30.2672);
		Point y4 = new Point(120.1869 , 30.2718);
		System.out.println( "n1:" + isPtInPoly(n1.getX() , n1.getY() , ps));
		System.out.println( "n2:" + isPtInPoly(n2.getX() , n2.getY() , ps));
		System.out.println( "n3:" + isPtInPoly(n3.getX() , n3.getY() , ps));
		System.out.println( "y1:" + isPtInPoly(y1.getX() , y1.getY() , ps));
		System.out.println( "y2:" + isPtInPoly(y2.getX() , y2.getY() , ps));
		System.out.println( "y4:" + isPtInPoly(y4.getX() , y4.getY() , ps));
	}
	public static boolean isPtInPoly (double ALon , double ALat , Point[] ps) {
		int iSum, iCount, iIndex;
		double dLon1 = 0, dLon2 = 0, dLat1 = 0, dLat2 = 0, dLon;
		if (ps.length < 3) {
			return false;
		}
		iSum = 0;
		iCount = ps.length;
		for (iIndex = 0; iIndex<iCount;iIndex++) {
			if (iIndex == iCount - 1) {
				dLon1 = ps[iIndex].getX();
				dLat1 = ps[iIndex].getY();
				dLon2 = ps[0].getX();
				dLat2 = ps[0].getY();
			} else {
				dLon1 = ps[iIndex].getX();
				dLat1 = ps[iIndex].getY();
				dLon2 = ps[iIndex + 1].getX();
				dLat2 = ps[iIndex + 1].getY();
			}
			// 以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上
			if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) {
				if (Math.abs(dLat1 - dLat2) > 0) {
					//得到 A点向左射线与边的交点的x坐标:
					dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat) ) / (dLat1 - dLat2);
					// 如果交点在A点左侧(说明是做射线与 边的交点),则射线与边的全部交点数加一:
					if (dLon < ALon) {
						iSum++;
					}
				}
			}
		}
		if ((iSum % 2) != 0) {
			return true;
		}
		return false;
	}
}


package com.cmcc.monitor.test;

public class Point {
    private Double x;
    private Double y;
    public Point (Double x , Double y) {
    	this.x = x;
    	this.y = y;
    }
	public Double getX() {
		return x;
	}
	public void setX(Double x) {
		this.x = x;
	}
	public Double getY() {
		return y;
	}
	public void setY(Double y) {
		this.y = y;
	}
    
}



相关文章推荐

java判断某个点是否在所画范围内(多边形)

/** * 判断点是否在多边形内 * @param point 检测点 * @param pts 多边形的顶点 * @return 点在多边形内返回true,否则返回false ...

java实现经纬度坐标是否在范围内的算法

需求是:一个点(经纬度)是否在一个多边形内部,多边形有多个点构成,每个点是一个实际的经纬度坐标,有多个点构成一个多边形, 算法数学上实现思路: 判断一个点是在一个多边形内部的集中情况 第一:目标点在...

如何判断一个指定的经纬度点是否落在一个多边形内

1、理论支持:如果从需要判断的点出发的一条射线与该多边形的焦点个数为奇数,则该点在此多边形内,否则该点在此多边形外。(射线不能与多边形顶点相交) 2、编程思路: 该程序的思路是从A点出发向左做一条...
  • e_wsq
  • e_wsq
  • 2012年05月04日 21:08
  • 1324

Java 判断 一个点是不是在一个多边形围起来的区域内

package com.sdunicomsi.util.map; import java.awt.geom.Point2D; import java.util.ArrayList; import j...

Java类判断百度地图上某点是否在多边形区域内

功能需求:订单分类(将每笔订单按照所在区域分类),故根据订单收货地址的经纬度来判断订单所在的商业区 import java.awt.geom.Point2D; import java.util.Ar...
  • lijie18
  • lijie18
  • 2017年02月06日 14:32
  • 2215

根据经纬度判断一个点是否在一个矩形范围内

在实际应用中经常会遇到这样一种需求,由最大最小的经纬度给出一个矩形范围,然后判断一个点是否在这个范围内部,由于经纬度有负有正,而且经度跨越正负180度后变号并且反向增减,一两步计算不出来,下面给出一种...

java后台判断经纬度是否在某个区域内

1、主要类,包含判断点是否在区域内、是否在直线上、是否有横断。 package com.bdMap.isIntersect; import java.util.ArrayList; publi...

java-经纬度有关的计算(半径内的经纬度范围和两点间距离)

java-经纬度有关的计算

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

判断点是否在多边形内(包括在多边形上)的一个算法

/** 检查某点是否包含在多边形的范围内(只用与判断在多边形内部,不包含点在多边形边上的情况)~ */ - (BOOL) checkPointWithinPolygon:(PolyVerticesWr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于指定的经纬度是否落在多边形内
举报原因:
原因补充:

(最多只允许输入30个字)