首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

求多角形区域内一点

2012-08-30 
求多边形区域内一点this.locateBylonlatfunction(featId,lons,lats,extendSelection){var lonArrlons.sp

求多边形区域内一点

this.locateBylonlat=function(featId,lons,lats,extendSelection){var lonArr=lons.split(',');var latArr=lats.split(',');var len=lonArr.length;var realLen=len-1;var lon;var lat;if(len<=4){var lonMide=(this.myParseFloat(lonArr[1])+this.myParseFloat(lonArr[2]))/2;var latMide=(this.myParseFloat(latArr[1])+this.myParseFloat(latArr[2]))/2; lon=(this.myParseFloat(lonArr[0])+lonMide)/2; lat=(this.myParseFloat(latArr[0])+latMide)/2;this.clickRightTree(featId,lon,lat,extendSelection)}else{var lonV=this.myParseFloat(lonArr[0]);var latV=this.myParseFloat(latArr[0]);var a;var b;var index=0;    for(var i=1;i <len-1;i++){                        //寻找一个凸顶点,最低点肯定是凸顶点                   if(this.myParseFloat(lonArr[i]) <lonV){                   lonV=this.myParseFloat(lonArr[i]);                  latV=this.myParseFloat(latArr[i]);                      index=i;                   }     }       a=(index-1+realLen)%realLen;               //得到v的前一个顶点       b=(index+1)%realLen;                       //得到v的后一个顶点       var q;      var latTri=[this.myParseFloat(latArr[a]),this.myParseFloat(latArr[index]),this.myParseFloat(latArr[b])];      var lonTri=[this.myParseFloat(lonArr[a]),this.myParseFloat(lonArr[index]),this.myParseFloat(lonArr[b])];      var md=Number.MAX_VALUE;       var bin=false;       for(var i=0;i <realLen;i++) {              //寻找在三角形avb内且离顶点v最近的顶点q                   if(i==index)continue;                   if(i==(index-1+realLen)%realLen)continue;                   if(i==(index+1)%realLen)continue;                   if(!this.pnpoly(3,latTri,lonTri,this.myParseFloat(latArr[i]),this.myParseFloat(lonArr[i])))continue;                   bin=true;                   var distance=this.dist(lonArr,latArr,index,i);              if(distance <md) {         q=i;         md=distance;                    }        }       if(!bin){                                                         //没有顶点在三角形avb内,返回线段ab中点                   lon1=(this.myParseFloat(lonArr[a])+this.myParseFloat(lonArr[b]))/2;                   lat1=(this.myParseFloat(latArr[a])+this.myParseFloat(latArr[b]))/2;                   lon=(this.myParseFloat(lonArr[index])+lon1)/2;        lat=(this.myParseFloat(latArr[index])+lat1)/2;       }else{       lon=(this.myParseFloat(lonArr[index])+this.myParseFloat(lonArr[q]))/2;  //返回线段vq的中点       lat=(this.myParseFloat(latArr[index])+this.myParseFloat(latArr[q]))/2;       }      this.clickRightTree(featId,lon,lat,extendSelection)} }this.myParseFloat=function(num){return OpenLayers.Util.toFloat(num);}this.dist=function(lonArr,latArr,i,j){var num1=(lonArr[i]-lonArr[j])*(lonArr[i]-lonArr[j]);var num2=(latArr[i]-latArr[j])*(latArr[i]-latArr[j]);return Math.sqrt(num1+num2);}         //google的判断点在不在多边形区域内this.pnpoly=function(nvert, vertx, verty,testx,testy){  var i, j, c = false;  for (i = 0, j = nvert-1; i < nvert; j = i++) {    if ( ((verty[i]>testy) != (verty[j]>testy)) && (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )       c = !c;  }  return c;}

热点排行