求多边形区域内一点


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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值