得到某点的缓冲区并画圆
2009-09-06 00:00:00 来源:WEB开发网我们在做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);
}
}
更多精彩
赞助商链接