`
sky_若海
  • 浏览: 12698 次
  • 性别: Icon_minigender_1
  • 来自: 保定
文章分类
社区版块
存档分类
最新评论
阅读更多
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
分享到:
评论

相关推荐

    java判断百度地图的点是否在多边形区域内

    java判断百度地图的点是否在多边形区域内,这是完整的demo

    判断指定的经纬度坐标点是否落在指定的多边形区域内

    在矢量多边形区域中,一个坐标点的位置是否在区域内 算法: C#代码,适用于任意多边形(凹凸多边形),但是没有考虑实际误差范围的情况(应用在实际问题解决中,接近区域一定范围是可以忽略的,这个误差范围考虑后算法的...

    java判断某个点是否在所画多边形/圆形内

    主要为大家详细介绍了java判断某个点是否在所画多边形或圆形内的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    利用mongodb查询某坐标是否在规定多边形区域内的方法

    大家都知道MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用。 1.使用百度拾取坐标工具,在地图上定义多边形的坐标...

    计算机图形学填充算法,使用OpenGL+MFC实现

    2、选择菜单中的“种子填充”--〉“开始填充”,然后左键点击多边形内任意一点(给定种子),本程序会立刻用种子填充算法将多边形内部填充 3、如果要再次画多边形,请再次选择“种子填充”--〉“鼠标画边界”

    高德地图 根据经纬度计算面积和判断一个点是否在圈内

    高德地图 1,根据经纬度计算面积 2,判断一个点是否在圈内

    arcgis工具

    通过指定一个缓冲距离,可以选择落于多边形内部并距离多边形边界一定范围内的所有要素。例如,选择林区内部500米范围内的湖泊。 完全包含(Completely contain) 这种方法选择某一图层上完全包含另一图层上的...

    使用距离变换的最大内切圆:使用距离变换近似计算轮廓/区域的最大内圆-matlab开发

    最大内切圆或者换句话说,“最大内圆”、“最大空圆”等。 ... 这种圆的中心离多边形边上的任何一点最远。 因此,我们寻找位于多边形内部并且与最近的边缘具有最大距离的点。 这正是位于轮廓内的像

    计算机图形学作业题.doc

    区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩 展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? ...

    C++MFC教程

    |------ 2.6 多边形和剪贴区域 +-- 第三章 文档视结构 |------ 3.1 文档 视图 框架窗口间的关系和消息传送规律 |------ 3.2 接收用户输入 |------ 3.3 使用菜单 |------ 3.4 文档,视,框架之间相互作用 |------ 3.5...

    巧用3dmax快捷键,提高作图效率

    技巧:不管如何设置,重要的是把快捷键设置在左手触于可及的区域,这样能便于左右手分工,左手画用快键,右手鼠标。 中文名称: 英文名称: 视图快捷键 F 前视图 L 左视图 T 顶视图 P 透视图 C 摄像机视图 alt +w ...

    MAPGIS地质制图工具

    4、在较多文字的时候,如果一行写不下,将自动转为版面输出(和上一点说明的情况不同)。 操作步骤: 1、 执行菜单“1辅助工具\导入导出功能\ MapGis&lt;-&gt; Excel\Excel-&gt;MapGis”,然后鼠标左键点击会把当前Excel中选...

    QT 绘图函数

    QPainterPath 可以通过连接基本的图形单元元素来确定任意的矢量形状,包括:直线、椭圆、多边形、弧形、贝赛尔曲线等。 首先使用 QPainter ::moveto() 来确定图形的起点,然后通过 cubicTo() 来确定绘制的线路。前 ...

Global site tag (gtag.js) - Google Analytics