文档章节

js map 获得某一路径(任意坐标组合数组)上,n个均匀分布的坐标点

我不说话
 我不说话
发布于 2014/06/05 17:02
字数 408
阅读 864
收藏 2

直接上代码:

/**
 * example: 
 * var map_route = new MapRoute({
 *	    x_alias : 'lon',
 *	    y_alias : 'lat',
 *	    parsePoint : function(x, y){
 *		    return new OpenLayers.LonLat(x, y);
 *	    }
 * });
 * map_route.abtainEvenPoint([......], 3);
 * 
 * @param option
 * @returns
 */
function MapRoute(options){
	
	this.x_alias = options.x_alias;
	this.y_alias = options.y_alias;
	
	this.parsePoint = options.parsePoint || function(x, y){
		return {
			x:x,
			y:y
		};
	};
}

/**
 * 获得路径上均匀分布的点
 */
MapRoute.prototype.abtainEvenPoint = function(route_arr, count){
	var arr = [];
	if(count < 1 || route_arr.length < 2){
		return arr;
	}
	arr.push(route_arr[0]);
	if(count > 2){
		var totalLength = 0;
		for ( var int = 1; int < route_arr.length; int++) {
			totalLength += this.twoPointLength(route_arr[int-1], route_arr[int]);
		}
		var evenLength = totalLength/(count-1);
		
		var iterator = this.getIteratorPoint(route_arr);
		var current_length = 0;
		var sanjiao_length = evenLength;
		var startLonLat = null;
		for ( var int2 = 0; int2 < count-2; int2++) {
			if(current_length - sanjiao_length < 0){
				sanjiao_length -= current_length;
				if(iterator.hasNextTwoPoint()){
					current_length = iterator.nextTwoPointLength();
					if(current_length - sanjiao_length < 0){
						int2 --;
						continue;
					}
					startLonLat = iterator.getCurrentPoint();
				}else{
					break;
				}
			}else{
				startLonLat = arr[arr.length-1];
			}
			current_length -= sanjiao_length;
			arr.push(this.getPoint(startLonLat, iterator.getNextPoint(), sanjiao_length));
			sanjiao_length = evenLength;
		}
		
		arr.push(route_arr[route_arr.length-1]);
	}else if(count == 2){
		arr.push(route_arr[route_arr.length-1]);
	}
	
	return arr;
};
/**
 * 得到起始点到结束点直线上,距离起始点length远的点
 */
MapRoute.prototype.getPoint = function(start, end, length){
	var to_right = end[this.x_alias] - start[this.x_alias] > 0 ? true : false;
	var to_top = end[this.y_alias] - start[this.y_alias] > 0 ? true : false;
	
	var x,y,totalLength = 0;
	x = Math.abs(end[this.x_alias] - start[this.x_alias]);
	y = Math.abs(end[this.y_alias] - start[this.y_alias]);
	totalLength += Math.sqrt(x*x+y*y);
	
	var new_x, new_y;
	if(to_right){
		new_x = start[this.x_alias]+length*x/totalLength;
	}else{
		new_x = start[this.x_alias]-length*x/totalLength;
	}
	if(to_top){
		new_y = start[this.y_alias]+length*y/totalLength;
	}else{
		new_y = start[this.y_alias]-length*y/totalLength;
	}
	
	return this.parsePoint(new_x, new_y);
};
/**
 * 2个坐标点之间直线距离
 */
MapRoute.prototype.twoPointLength = function(start, end){
	var x,y,totalLength = 0;
	x = Math.abs(end[this.x_alias] - start[this.x_alias]);
	y = Math.abs(end[this.y_alias] - start[this.y_alias]);
	totalLength += Math.sqrt(x*x+y*y);
	return totalLength;
};
MapRoute.prototype.getIteratorPoint = function(arr){
	var the = this;
	function IteratorPoint(arr){
		this.arr = arr;
		this.current_index = -1;
	};
	IteratorPoint.prototype.hasNextTwoPoint = function(){
		if(this.current_index+2 > this.arr.length-1){
			return false;
		}
		return true;
	};
	IteratorPoint.prototype.nextTwoPointLength = function(){
		if(!this.hasNextTwoPoint()){
			return -1;
		}
		this.current_index ++;
		var end = this.arr[this.current_index+1];
		var start = this.arr[this.current_index];
		
		return the.twoPointLength(start, end);
	};
	IteratorPoint.prototype.getCurrentPoint = function(){
		return this.arr[this.current_index];
	};
	IteratorPoint.prototype.getNextPoint = function(){
		return this.arr[this.current_index+1];
	};
	
	return new IteratorPoint(arr);
};

如有出入,欢迎指正……

© 著作权归作者所有

共有 人打赏支持
我不说话
粉丝 10
博文 6
码字总数 1808
作品 0
济南
技术主管
私信 提问
HTML5 从基础学习之二 --Canvas Geolocation Cache

HTML5 的canvas元素使用JavaScript在网页上绘制图像 其拥有多种绘制路径,矩形,圆形,字符以及添加图像的方法。 1、Canvas元素的创建(规定元素的id,宽度和高度) <canvas id="myCanvas" ...

Drealin
2012/09/07
0
0
百度地图API显示多个标注点并添加百度样式检索窗口

<%@ page language="java" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"......

zhwj407906450
2014/12/31
0
0
JavaScript基础语法,对象,正则表达式

一.JavaScript基础语法 1.基础语法 2.函数 3.常见对话框 4.html引入js文件 二.JavaScript对象 1.prototype属性扩展类的属性和方法,以及实现类的继承 2.内置对象 3.document对象 4.window对象...

青衫无名
2018/06/01
0
0
SL API 与 JS API的交互

我们知道,Siverlight 作为 浏览器的一个插件,就相当于程序的容器,那么我们怎样和Html 中的JS 代码交互呢,其实微软给我们了解决方案. 参考文章http://www.cnblogs.com/HellenTian/archive...

长平狐
2012/11/28
378
0
google 地图IE,火狐显示问题(在ie中点击美食显示不出来 在火狐中显示正常)

靠港 美食 您的位置: 首页 > 靠港 > 美食 中国 分类搜索 美食 地址:http://issconline.com/hyport.php?act=cook

sunyujun
2012/09/13
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

关于php的xdebug配置(编辑器vscode)

虽然说echo和print_r是公认的最实用的调试工具,但是效率真的没有可视化的直接断点那么高。这里简单介绍如果安装及配置xdebug for vscode 一、PHP环境处的配置 1、编译安装 下载及编译php,因...

元谷
8分钟前
0
0
heartbeat

kaer@linux-sqlf:~/Reusable-Cluster-Components-glue--0a7add1d9996> ./configure --enable-doc=no --prefix=/usr/local/heartbeat kaer@linux-sqlf:~/Heartbeat-3-0-958e11be8686> ./confi......

李有常
18分钟前
0
0
shell 脚本 title 免写入

1、有时候写脚本,需要写一些注释信息或者备注之类,当每次都手写比较麻烦,可以写一个脚本,每次运行则自动写入这些信息,不需要在手动输入; 通过 EOF 嵌入文档的方式; [root@localhost_002 sh...

芬野de博客
24分钟前
0
0
FragmentPagerAdapter+ViewPager 更新问题

场景 存在一种需求,当用户系统中,属于某一组织的用户登录之后(或者账户切换),要求主页面显示不同的ViewPager + Fragment组合,并且要求app无需退出就能刷新组合以及组合中的页面。 此外...

IamOkay
25分钟前
1
0
Python有哪些常用的标准库?Python基础教程,第十一讲,常用标准库(一)

上一节课我们学习了如何自定义模块,大家可以定义自己的模块,但是项目中通常不允许我们自己造轮子,所以本节课主要学习Python的标准库,学习使用别人的轮子,由于标准库内容较多,所以我们分...

程序员补给栈
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部