package com.basbic.manager.util;import java.awt.geom.Point2D;import java.util.ArrayList;import java.util.List;publicclassBaiduMapPolygonExample2{publicstaticvoidmain(String[] args){
Point2D.Double point =newPoint2D.Double(126.5762149439839,45.716548098781196);
List<Point2D.Double> pts =newArrayList<Point2D.Double>();
pts.add(newPoint2D.Double(116.395,39.910));
pts.add(newPoint2D.Double(116.394,39.914));
pts.add(newPoint2D.Double(116.403,39.920));
pts.add(newPoint2D.Double(116.402,39.914));
pts.add(newPoint2D.Double(116.410,39.913));if(IsPtInPoly(point,getPhone())){
System.out.println("yes");
System.out.println("点在多边形内");}else{
System.out.println("no");
System.out.println("点在多边形外");}}publicstatic Point2D.Double getPoint(String lng,String lat){returnnewPoint2D.Double(Double.parseDouble(lng), Double.parseDouble(lat));}publicstatic List<Point2D.Double>getPhone(){
List<Point2D.Double> pts =newArrayList<Point2D.Double>();
pts.add(newPoint2D.Double(126.5943366406979,45.71367872790119));
pts.add(newPoint2D.Double(126.58922079081854,45.708049168181105));
pts.add(newPoint2D.Double(126.5908018085161,45.70747013134428));
pts.add(newPoint2D.Double(126.58787333255357,45.705128746916486));
pts.add(newPoint2D.Double(126.58686723038238,45.706343509761766));
pts.add(newPoint2D.Double(126.58674146761099,45.7074008982749));
pts.add(newPoint2D.Double(126.58215112645497,45.70725613794179));
pts.add(newPoint2D.Double(126.58012544752995,45.705131894004815));
pts.add(newPoint2D.Double(126.57664900520632,45.70752992347113));
pts.add(newPoint2D.Double(126.57358129188972,45.70978624246433));
pts.add(newPoint2D.Double(126.57697688671746,45.71329169427561));
pts.add(newPoint2D.Double(126.57437629226607,45.71544079810734));
pts.add(newPoint2D.Double(126.5784366331712,45.71807121313554));
pts.add(newPoint2D.Double(126.58068239694614,45.71748598803657));
pts.add(newPoint2D.Double(126.58417680537998,45.72040575938895));
pts.add(newPoint2D.Double(126.5943366406979,45.71367872790119));return pts;}publicstatic boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){
int N= pts.size();
boolean boundOrVertex =true;//如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
int intersectCount =0;//cross points count of x
double precision =2e-10;//浮点类型计算时候与0比较时候的容差
Point2D.Double p1, p2;//neighbour bound vertices
Point2D.Double p = point;//当前点
p1 = pts.get(0);//left vertexfor(int i =1; i <=N;++i){//check all raysif(p.equals(p1)){return boundOrVertex;//p is an vertex}
p2 = pts.get(i %N);//right vertexif(p.x < Math.min(p1.x, p2.x)|| p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests
p1 = p2;continue;//next ray left point}if(p.x > Math.min(p1.x, p2.x)&& p.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)if(p.y <= Math.max(p1.y, p2.y)){//x is before of rayif(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal rayreturn boundOrVertex;}if(p1.y == p2.y){//ray is verticalif(p1.y == p.y){//overlies on a vertical rayreturn boundOrVertex;}else{//before ray++intersectCount;}}else{//cross point on the left side
double xinters =(p.x - p1.x)*(p2.y - p1.y)/(p2.x - p1.x)+ p1.y;//cross point of yif(Math.abs(p.y - xinters)< precision){//overlies on a rayreturn boundOrVertex;}if(p.y < xinters){//before ray++intersectCount;}}}}else{//special case when ray is crossing through the vertexif(p.x == p2.x && p.y <= p2.y){//p crossing over p2
Point2D.Double p3 = pts.get((i+1)%N);//next vertexif(p.x >= Math.min(p1.x, p3.x)&& p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x++intersectCount;}else{
intersectCount +=2;}}}
p1 = p2;//next ray left point}if(intersectCount %2==0){//偶数在多边形外returnfalse;}else{//奇数在多边形内returntrue;}}}