WEB开发网
开发学院网页设计JavaScript 得到某点的缓冲区并画圆 阅读

得到某点的缓冲区并画圆

 2009-09-06 00:00:00 来源:WEB开发网   
核心提示:我们在做GIS空间分析的时候常常需要计算某个点的缓冲区,这时需要以这个点为中心,得到某点的缓冲区并画圆,画一个圆,怎么来实现呢?缓冲区的做法在arcims里有相应的API,通过它们就可以得到一些我们很常用且重要的函数:屏幕坐标与地理坐标的相互转化函数,输入屏幕坐标得到距离函数(测距时用),但是我们现在的做法是抛开IMS

我们在做GIS空间分析的时候常常需要计算某个点的缓冲区,这时需要以这个点为中心,画一个圆。怎么来实现呢?

缓冲区的做法在arcims里有相应的API,但是我们现在的做法是抛开IMS的API,只在前台画圆。这里利用了VML来画圆。

用VML技术来画圆还是比较简单的,这里较困难的是需要解决每像素代表实地多少距离的问题,知道了这个值就可以利用需要画的缓冲区的半径得到到底用VML要画多少像素。

概念中我们最重要的是要弄清楚“像素”的含义。我们常常大概明白它的意思,但是想想:为什么我们写程序时都是用像素呢?而不用米之类的长度单位,而如果分辨率不同的话,像素值是不变的,对结果会产生什么影响?等等。还有,我们说的“每像素代表实地多少距离”并不是我们在学地图学里说的“比例尺”。比例尺是实地距离除以图上距离(1厘米),而对电子地图来说,比例尺没什么意义,因为在电子地图里, “每像素代表实地多少距离”的分母是像素值,并不是长度值。我们在IMS返回的是MBR的四个值XMin,YMin,XMax,YMax和Width,Height,其中width和height是像素值,这点需要明确。

我们建立一个Map对象,用于存放IMS里返回的地图状态:MBR的四个值XMin,YMin,XMax,YMax和地图的长度width(像素值)和高度height(像素值)。通过它们就可以得到一些我们很常用且重要的函数:屏幕坐标与地理坐标的相互转化函数,输入屏幕坐标得到距离函数(测距时用),判断输入的经纬度点是否在地图范围内(如果不在的话就不加载进来)函数。如下:

Js代码   

function Map() 
{ 
 this.XMin = 0; 
 this.YMin = 0; 
 this.XMax = 0; 
 this.YMax = 0; 
 this.Width = 0; 
 this.Height = 0; 
 this.ImageURL = ''; 
 this.getXDistance = function(){ 
 return this.XMax - this.XMin; 
 } 
 this.getYDistance = function(){ 
 return this.YMax - this.YMin; 
 } 
 
 
 this.getPixelX = function(){ 
 return this.getXDistance()/this.Width; 
 } 
 this.getPixelY = function(){ 
 return this.getYDistance()/this.Height; 
 } 
 
 this.toScreenX = function(x){ 
 return (x-this.XMin)/this.getPixelX(); 
 } 
 this.toScreenY = function(y){ 
 return (this.YMax-y)/this.getPixelY(); 
 } 
 
 this.toGeoX = function(x){ 
 return this.XMin + x*this.getPixelX(); 
 } 
 this.toGeoY = function(y){ 
 return this.YMax - y*this.getPixelY(); 
 } 
 
 this.distance = function(x1, y1, x2, y2){ 
 var num1 = Math.PI/180; 
 var num2 = 1 / num1; 
 x1 = this.toGeoX(x1) * num1; 
 y1 = this.toGeoY(y1) * num1; 
 x2 = this.toGeoX(x2) * num1; 
 y2 = this.toGeoY(y2) * num1; 
 return ((111120 * num2) * Math.acos((Math.sin(y1) * Math.sin(y2)) + ((Math.cos(y1) * Math.cos(y2)) * Math.cos(x2 - x1)))); 
 } 
 
 this.include = function(x, y){ 
 return (x>this.XMin && x<this.XMax && y>this.YMin && y<this.YMax); 
 } 
}

1 2 3  下一页

Tags:得到 缓冲区

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接