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;
}
分享到:
相关推荐
java判断百度地图的点是否在多边形区域内,这是完整的demo
在矢量多边形区域中,一个坐标点的位置是否在区域内 算法: C#代码,适用于任意多边形(凹凸多边形),但是没有考虑实际误差范围的情况(应用在实际问题解决中,接近区域一定范围是可以忽略的,这个误差范围考虑后算法的...
主要为大家详细介绍了java判断某个点是否在所画多边形或圆形内的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
大家都知道MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用。 1.使用百度拾取坐标工具,在地图上定义多边形的坐标...
2、选择菜单中的“种子填充”--〉“开始填充”,然后左键点击多边形内任意一点(给定种子),本程序会立刻用种子填充算法将多边形内部填充 3、如果要再次画多边形,请再次选择“种子填充”--〉“鼠标画边界”
高德地图 1,根据经纬度计算面积 2,判断一个点是否在圈内
通过指定一个缓冲距离,可以选择落于多边形内部并距离多边形边界一定范围内的所有要素。例如,选择林区内部500米范围内的湖泊。 完全包含(Completely contain) 这种方法选择某一图层上完全包含另一图层上的...
最大内切圆或者换句话说,“最大内圆”、“最大空圆”等。 ... 这种圆的中心离多边形边上的任何一点最远。 因此,我们寻找位于多边形内部并且与最近的边缘具有最大距离的点。 这正是位于轮廓内的像
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩 展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? ...
|------ 2.6 多边形和剪贴区域 +-- 第三章 文档视结构 |------ 3.1 文档 视图 框架窗口间的关系和消息传送规律 |------ 3.2 接收用户输入 |------ 3.3 使用菜单 |------ 3.4 文档,视,框架之间相互作用 |------ 3.5...
技巧:不管如何设置,重要的是把快捷键设置在左手触于可及的区域,这样能便于左右手分工,左手画用快键,右手鼠标。 中文名称: 英文名称: 视图快捷键 F 前视图 L 左视图 T 顶视图 P 透视图 C 摄像机视图 alt +w ...
4、在较多文字的时候,如果一行写不下,将自动转为版面输出(和上一点说明的情况不同)。 操作步骤: 1、 执行菜单“1辅助工具\导入导出功能\ MapGis<-> Excel\Excel->MapGis”,然后鼠标左键点击会把当前Excel中选...
QPainterPath 可以通过连接基本的图形单元元素来确定任意的矢量形状,包括:直线、椭圆、多边形、弧形、贝赛尔曲线等。 首先使用 QPainter ::moveto() 来确定图形的起点,然后通过 cubicTo() 来确定绘制的线路。前 ...