原文来自taoeer.top。前端遇到一个问题,就是判断百度地图中的多个任意多边形区域是否重复。在网上看了很多文章,都没有找到解决办法。功夫不负有心人。我在网上找了一个法官。是否重复,但不能判断是否包含。后来加了点判断点是否在多边形内判断重复。问题已经解决。我会在这里发布代码供您参考。//#regionVerifytwo是不是相交的计算方法(此任数摘自网络)functionintersectsPolygonAndPolygon(polygon1LinearRings,polygon2LinearRings){//polygon1LinearRings:array[LinearRing,...]functionintersectsByPolygon(polygon1Linearing2LinearsRingvars,false){;intersect=intersectsByLinearRings(polygon1LinearRings,polygon2LinearRings);if(!intersect){//检查这个多边形是否包含环/线串的点for(i=0,len=polygon2LinearRings.length;i0){contained=containsPointByLinearRing(point,LinearRings[0]);if(numRings>1){//检查内环varhole;for(vari=1;i0){fig=parseFloat(num.toPrecision(sig));}returnfig;}vardigs=14;varpx=approx(point.x,digs);varpy=approx(point.y,digs);functiongetX(y,x1,y1,x2,y2){返回(y-y2)*((x2-x1)/(y2-y1))+x2;}varnumSeg=LinearRing.length-1;varstart,end,x1,y1,x2,y2,cx,cy;varcrosses=0;for(vari=0;i=x1&&px<=x2)||//右或vertx1>=x2&&(px<=x1&&px>=x2)){//leftorvert//边上的点交叉=-1;休息;}}//忽略其他水平边缘continue;}cx=approx(getX(py,x1,y1,x2,y2),digs);if(cx==px){//点在线if(y1=y1&&py<=y2)||//向上y1>y2&&(py<=y1&&py>=y2)){//向下//边缘交叉点=-1;休息;}}if(cx<=px){//没有向右穿越continue;}if(x1!=x2&&(cxMath.max(x1,x2))){//没有交叉继续;}if(y1=y1&&pyy2&&(py=y2)){//向下++crosses;}}varcontained=(crosses==-1)?//在边缘1上://偶数(出)或奇数(入)!!(交叉&1);返回包含;}functionintersectsByLinearRings(LinearRing1,LinearRings2){varintersect=false;varsegs1=getSortedSegments(LinearRing1);varsegs2=getSortedSegments(LinearRings2);varseg1,seg1x1,seg1x2,seg1y1,seg1y2,seg2,seg2y1,seg2y2;//扫描右端:for(vari=0,len=segs1.length;iseg1x2){//seg1仍然在seg2的左边break;}if(seg2.x2Math.max(seg1y1,seg1y2)){//seg1之上的seg2继续;}if(Math.max(seg2y1,seg2y2)=0&&along1<=1&&along2>=0&&along2<=1){//相交if(!point){intersection=true;}else{//计算交点varx=seg1.x1+(along1*x12_11);vary=seg1.y1+(along1*y12_11);交集={'x':x,'y':y};}}}if(公差){vardist;如果(交点){如果(点){varsegs=[seg1,seg2];变量段,x,y;//检查线段端点是否接近交点//将交点设置为公差范围内的第一个端点outer:for(vari=0;i<2;++i){seg=segs[i];for(varj=1;j<3;++j){x=seg["x"+j];y=段["y"+j];dist=Math.sqrt(Math.pow(x-intersection.x,2)+Math.pow(y-intersection.y,2));如果(距离<公差){intersection.x=x;交集.y=y;打破外;}}}}}else{//没有计算出交点,但线段可能在//彼此的容差范围内varsegs=[seg1,seg2];变种源,目标,x,y,p,结果;//检查线段端点是否接近交点//将交点设置为公差范围内的第一个端点outer:for(vari=0;i<2;++i){source=segs[i];目标=段[(i+1)%2];对于(varj=1;j<;3;++j){p={x:来源["x"+j],y:来源["y"+j]};结果=distanceToSegment(p,target);如果(结果。距离<公差){如果(点){交集={'x':p.x,'y':p.y};}else{交集=true;}打破外层;}}}}}返回交集;};函数distanceToSegment(点,段){varresult=distanceSquaredToSegment(点,段);result.distance=Math.sqrt(result.distance);返回结果;};函数distanceSquaredToSegment(点,段){varx0=point.x;vary0=point.y;varx1=segment.x1;vary1=segment.y1;varx2=segment.x2;vary2=segment.y2;vardx=x2-x1;vardy=y2-y1;varalong=((dx*(x0-x1))+(dy*(y0-y1)))/(Math.pow(dx,2)+Math.pow(dy,2));varx,y;if(along<=0.0){x=x1;y=y1;}elseif(along>=1.0){x=x2;y=y2;}else{x=x1+along*dx;y=y1+along*dy;}return{距离:Math.pow(x-x0,2)+Math.pow(y-y0,2),x:x,y:y,along:along};}returnintersectsByPolygon(polygon1LinearRings,polygon2LinearRings);}//#endregionfunctionrailsIsOverlap(rails){vari,j,k,v,l,n;if(rails.length<2){返回false;}for(i=0,j=rails.length-1;i