js map 得到某一路徑(任意座標組合數組)上,n個均勻分佈的座標點

直接上代碼:
this

/**
 * 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);
};

若有出入,歡迎指正……prototype

相關文章
相關標籤/搜索