得到某点的缓冲区并画圆

我们在做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);
 }
}

时间: 2025-01-21 07:31:43

得到某点的缓冲区并画圆的相关文章

ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆

原文:ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆 一.前言       吐槽一下,百度在国内除了百度地图是良心产品外,其他的真的不敢恭维.在上一篇笔记里,我已经实现了自定义的地图测量模块.在百度地图里面(其他地图)都有一个周边搜索的功能,拖拽画一个圆,然后以圆半径进行搜索(也就是缓冲区╮(╯_╰)╭).   这次的目标,就是要山寨这个拖拽画圆的功能,我先放一个效果图.   二.开始山寨 我们先想一想要实现这个功能需要哪些步骤. 拖拽 画圆 通知拖拽结束 2.1 实现拖拽     关于拖

网站优化犹如画圆 找准圆心半径很重要

2011年1月20日,也是中国传统节日农历春节前夕,网民期待已久的Google PR更新姗姗来迟,大面积的更新了网站PR值,传说中的PR已经停止更新的谣言不攻自破.继PR更新之后,国内第一大中文搜索引擎百度也于日前更新了网站排名.两大搜索引擎占据了搜索流量的90%以上,所以此次更新自然是几家欢喜几家愁.笔者公司的网站,在此次大规模的更新中,出乎寻常的平静,PR值没有增加也没有减少,核心关键词在百度的排名也只是象征性的上下浮动一下,有些词上升有些词下降几名,但是均在合理的范围之内.经过半年多的深入

用FLASH AS实现鼠标画圆的效果

鼠标 在FLASH或PHOTOSHOP中能够很轻松的画出一个圆或者椭圆,怎样做一个作品,让用户可以直接在里面拖动鼠标画出一个圆或者椭圆来呢?下面是BreakDS用AS实现这个效果的讲解-- 预览: 一.基本定义:虽然说不说大家都清楚,但是我还是想讲一下,以免一些人忘得差不多了-- 圆:平面上到定点距离等于定长的点的轨迹.椭圆:平面上到两定点距离和等于定长(定长大于两定点间距离)的点的轨迹. 二.问题描述:画圆和椭圆,使用AS. 三.问题分析: 1.圆呵呵,大多数人看到后肯定想:哼-这不简单,不就

几何画板按已知圆的方程画圆的方法

  比如已知圆的方程:x2+y2=32,画圆的方法有以下两种: 方法一 将圆方程进化为2个函数,分别画图像 步骤一 将圆方程进行移项.开平方,化成y=√(9-x2)和y=-√(9-x2)两个简单函数; 步骤二 画出y=√(9-x2)函数图像.打开几何画板,点击上方"绘图"菜单,在其下拉菜单选择"绘制新函数"命令,弹出函数对话框,在其中依次输入如下图所示表达式,点击"确定",即可画出函数图像. 在几何画板中画函数图像示例 步骤三 画出y=-√(9-

ios-iphone使用drawRect画圆

问题描述 iphone使用drawRect画圆 我要在UIView中画一个简单的圆形.我不想用QuartzCore,能不能用drawRect实现? - (void)drawRect:(CGRect)rect{ CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextAddEllipseInRect(ctx rect); CGContextSetFillColor(ctx CGColorGetComponents([[UIColor g

c# #-C#用Graphics 定义一个Mycircle类画圆,如何在类外改变画笔颜色再画一个圆

问题描述 C#用Graphics 定义一个Mycircle类画圆,如何在类外改变画笔颜色再画一个圆 class MyCircle { int x; int y; int r; public MyCircle(int x, int y, int r) { this.x = x; this.y = y; this.r = r; } public override void Draw(Graphics g) { Random rd = new Random(); int red, blue, gree

inkcanvas-windows自带的画图工具是怎么实现的?是怎么画圆的?是用什么语言写的?

问题描述 windows自带的画图工具是怎么实现的?是怎么画圆的?是用什么语言写的? 最近碰到一个项目,要用wpf的inkcanvas画图,但是到画圆的时候可以画出来,用橡皮擦出的时候就出问题了,想问一下windows自带的画图工具是怎么实现的,他的那个画圆是怎么实现的 解决方案 windows自带的画图软件其实有两个版本,vista和之前的是一个版本,之后的是另一个版本,都是c/c++写的.之前的版本随windows 2000的源代码都泄露出来了.google下就有.

1.1.2-学习Opencv与MFC混合编程之---画图工具 画直线 画圆 画矩形

源代码地址:http://download.csdn.net/detail/nuptboyzhb/3961685 画图工具 1.     画直线 Ø  增加'直线'菜单项,建立类向导: Ø  对CXXXXXXView类增加成员变量my_draw_flag.并在构造函数中初始化为0 Ø  在'直线'菜单项处理函数中,将my_draw_flag=1:表示画直线 Ø  增加window消息处理,WM_LBUTTONDOWN 和WM_MOUSEMOVE和WM_LBUTTONUP Ø  增加成员变量 在构

网易新闻客户端中listview中的item,长按会出现画圆的背景效果,不知道是怎么做的

问题描述 网易新闻客户端中listview中的item,长按会出现画圆的背景效果,不知道是怎么做的 图片我弄不上来,大牛们下一个网易新闻客户端试试看,我做了demo不太理想 我自己做的demo是在oneventtouch()中invalidate():在onDraw()中 以手点击的坐标为圆点画圆,半径不断的增加,但是网易中的item一开始是在手点击的坐标为圆点,之后圆点在不断的移动,到最后画满item的时候圆点正好到中间. 解决方案 listview中的item,长按会出现画圆的背景效果,不知