GIS中的计算几何
- 格式:pdf
- 大小:333.60 KB
- 文档页数:4


点到线距离的计算1、作业说明1.1 任务点到线距离的计算(包括直线、射线、线段)1.2 要求人机交互,鼠标屏幕取点进行计算,输出计算结果2、程序说明2.1 大体上分三步进行:2.1.1 首先进行画线操作:鼠标在屏幕上取两点(鼠标左键两点)1、画线段直接利用DrawLine函数,将在屏幕上获取的两点坐标传递给函数的参数即可。
2、画直线由于直线是无限的,所以此时要借助于屏幕上所取两点的直线方程,通过求出与所在容器边缘的交点,结合具体情况,将求出的交点的坐标传递给DrawLine函数的参数,即可画出当前范围内的直线形状。
3、画射线画射线与画直线的思路大致相同,不过需判断射线的方向,此处借助所取的第二个点和第一个点的位置关系判断方向,最后再将所取的第一个点和求得的射线方向与容器边缘的交点坐标传递给DrawLine函数的参数即可。
2.1.2 开始绘制第三个点(鼠标右键取该点)借助于DrawEllipse函数(详情参见代码部分)2.1.3 线和点绘制完成后,开始进行距离的计算1、点到直线的距离:可直接利用点到线之间的距离公式2、点到线段的距离:由于点在线段上的投影可能不在线段上,故还需要求出点到线段两端点坐标的距离,再将最小值作为结果输出3、点到射线的距离:同理,若点的投影不在射线上,则其最小距离为点到射线起始端点的距离2.2 窗体界面介绍首先是ComeBox,对其添加三项:计算点到线段的距离、计算点到直线的距离、计算点到射线的距离在PictureBox里进行点和线的绘制,在TextBox里显示点到线的距离值3、源代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace me{public partial class Form1 : Form{public Form1(){InitializeComponent();}//首先定义两个变量:屏幕上所取的两个点private Point m_ptStart; private Point m_ptEnd;//定义两个集合:myplist存放用于画线的两个点,pt存放第三个点List<Point> myplist = new List<Point>();List<Point> pt = new List<Point>();//result用来存放点到线的距离值double result;//自定义方法:两点之间的距离double ptdis(Point p0, Point p1){return System.Math.Sqrt((p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y) * (p1.Y - p0.Y));}//自定义最大最小值函数double max(double x, double y){return x > y ? x : y;}double min(double x, double y){return x > y ? y : x;}//自定义方法:点和线之间的距离double pldis(Point p0, Point p1, Point p2){double result;double A = p2.Y - p1.Y;double B = p1.X - p2.X;double C = p2.X * p1.Y - p1.X * p2.Y;result = System.Math.Abs(A * p0.X + B * p0.Y + C) /System.Math.Sqrt(A * A + B * B);return result;}//自定义方法:获取点在线上的投影Point GetProjectPt(Point p0, Point p1, Point p2){Point ProjectPt=new Point();if (p2.X == p1.X){ProjectPt.X = p1.X;ProjectPt.Y = p0.Y;}else{double k = (p2.Y - p1.Y) / (p2.X - p1.X);ProjectPt.X = (int)((k * p1.X + p0.X / k + p0.Y - p1.Y)/(k+1/k));ProjectPt.Y = (int)(-1 / k * (ProjectPt.X - p0.X) + p0.Y);}return ProjectPt;}/*当comboBox1里面的项改变时,清除之前的所有数据比如计算点到直线的距离时,清除点到线段的距离*/private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){myplist.Clear();textBox1.Text = "";Graphics g = pictureBox1.CreateGraphics();g.Clear(Color.White);}// 对pictureBox1的MouseDown事件进行编辑,当鼠标按下时,会产生哪些操作private void pictureBox1_MouseDown(object sender, MouseEventArgs e){Pen blue = new Pen(Color.Blue, 3);Graphics g = pictureBox1.CreateGraphics();//当按下鼠标左键时,在屏幕上取两点画线if (e.Button == MouseButtons.Left){Point p = new Point(e.X, e.Y);myplist.Add(p);}//当按下鼠标右键时,在屏幕上取第三个点if (e.Button == MouseButtons.Right){Point p = new Point(e.X, e.Y);pt.Clear();//改变所取的第三个点时,清除上一次的数据(距离)和图形(点)g.Clear(Color.White);pt.Add(p);//此处将第三个点画成椭圆形式g.DrawEllipse(blue, pt[0].X, pt[0].Y, 1, 1);//在取点的同时,进行点到线距离的计算,并将结果值显示在textBox1上Point p3 = new Point();p3 = GetProjectPt(pt[0], m_ptStart,m_ptEnd);//获取点在线上的投影点//分情况讨论if(comboBox1.Text=="计算点到线段的距离"){if (p3.X >max(m_ptStart.X,m_ptEnd.X ) || p3.X < min( m_ptStart.Y,m_ptEnd.Y)){//点在线段上的投影不在线段上double dis1 = ptdis(pt[0], m_ptStart);double dis2 =ptdis(pt[0], m_ptEnd);result = min(dis1, dis2);}elseresult = pldis(pt[0], m_ptStart, m_ptEnd);}if(comboBox1.Text=="计算点到射线的距离"){if (p3.X < myplist[0].X) //点在射线上的投影不在射线上result = ptdis(pt[0], m_ptStart);elseresult = pldis(pt[0], m_ptStart, m_ptEnd);}if (comboBox1.Text == "计算点到直线的距离")result = pldis(pt[0], m_ptStart, m_ptEnd);textBox1.Text = result.ToString(); //将结果显示在textBox1上}//开始画线if (myplist.Count > 1){//A、B、C分别是直线一般方程中的三和参数,即A*x+B*y+C=0double A = myplist[1].Y - myplist[0].Y;double B = myplist[0].X - myplist[1].X;double C = myplist[1].X * myplist[0].Y - myplist[0].X * myplist[1].Y; //通过switch语句,输入comboBox1的文本内容,判断将要进行哪一种操作switch (comboBox1.Text){case"计算点到线段的距离":{ //起点和终点即为屏幕上所取的两个点m_ptStart = myplist[0];m_ptEnd = myplist[1];break;}case"计算点到直线的距离"://画直线时,需要将起始点和pictureBox1容器边缘交点联系起来{ //起点坐标m_ptStart.Y = 0;m_ptStart.X = (int)(-C / A);//终点坐标m_ptEnd.Y = pictureBox1.Height;m_ptEnd.X = (int)(-(C + B * m_ptEnd.Y) / A);break;}case"计算点到射线的距离"://画射线时同样要考虑到线与pictureBox容器边缘的交点,比较困难的是判断射线方向(借助于所取两点的位置关系){Point p0 = new Point();Point p1 = new Point();//起点坐标if (myplist[1].Y == myplist[0].Y){p0.Y = myplist[0].Y; p0.X = 0;p1.Y = myplist[0].Y; p1.X = pictureBox1.Width;}else{p0.Y = 0;p0.X = (int)(-C / A);//终点坐标p1.Y = pictureBox1.Height;p1.X = (int)(-(C + B * p1.Y) / A);}//结合所取两点的位置关系确定最终传递给DrawLine的是哪两点if (myplist[1].Y >= myplist[0].Y){m_ptEnd.X = p1.X;m_ptEnd.Y = p1.Y;}else{m_ptEnd.X = p0.X;m_ptEnd.Y = p0.Y;}m_ptStart = myplist[0];break;}}g.DrawLine(blue, m_ptStart, m_ptEnd);//画线}}}}4、结果展示实现功能:首先在下拉列表中选择将要计算点到哪种线的距离,选择好后,鼠标左键取两点自动画线,之后鼠标右键取点,在取点的同时,会自动显示距离值,并且在选取下一个点时,上一组的数据自动清除4.1 计算点到线段的距离4.2 计算点到直线的距离:4.3 计算点到射线的距离。
a r c g i s计算面积方法(总2页) -CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除如何在ARCMAP里面计算面积方法1在中可以直接计算面积,打开图层属性表, 首先,打开Polygon层属性表,点选项,点添加字段,增加AREA字段,选double类型,右键放面积的字段,单击菜单中的"Calculate Geometry(计算几何体)",弹出对话框,选择属性、单位,按提示操作就可以了。
方法21、面状矢量图面积的计算Polygon形成的多边形面积计算比较简单,方法如下:首先,打开Polygon层属性表,点选项,点添加字段,增加AREA字段,选double类型然后,右键点击AREA字段列,然后点击CALCULATE VALUES(计算字段); --->选择ADVANCED(高级)-->把下面的代码输入,然后在最下面=处写OUTPUT。
Dim Output as doubleDim pArea as IareaSet pArea = [shape]Output =最后,点OK就计算出了Polygon层所有多边形的面积。
2、线状矢量图面积计算Polyline形成的多边形,要先进行拓扑才能计算面积,方法如下:首先,打开ArcToolbox, 将Polyline层的Shapefile文件转成Coverage文件,并进行拓扑。
然后,将拓扑好的Coverage文件转成Shapefile文件。
最后,在ArcMap中调入面状的Shapefile文件,面积就计算出来了,打开属性表查看就是了。
方法3如果shape文件有真实的坐标,把shape转化为geodatabase中的feature class,面积字段就直接出来了。
gis面要素面积计算摘要:1.引言2.GIS 面要素的定义与分类3.面积计算方法3.1 几何图形面积计算3.2 复合图形面积计算3.3 细分图形面积计算4.常用GIS 软件的面积计算功能5.面积计算在GIS 应用中的重要性6.结论正文:【引言】地理信息系统(GIS)是一种集采集、编辑、管理、分析和应用地理空间信息的技术、方法和工具。
在GIS 中,面要素是指具有特定属性的地理空间实体,如行政区划、地貌、土地利用等。
面要素面积计算是GIS 数据处理和分析过程中的基本任务之一,它在土地资源管理、城市规划、环境保护等领域具有广泛的应用。
本文将对GIS 面要素面积计算的方法和常用GIS 软件的面积计算功能进行介绍,以期为相关领域的研究和实践提供参考。
【GIS 面要素的定义与分类】面要素是GIS 中的一种基本地理空间数据类型,指具有特定属性和地理空间位置的地理实体。
根据属性和空间特征的不同,面要素可以分为多种类型,如行政区划、地貌、土地利用、植被等。
每种面要素都有其特定的属性和空间特征,需要采用不同的方法进行面积计算。
【面积计算方法】面积计算方法主要包括几何图形面积计算、复合图形面积计算和细分图形面积计算。
【3.1 几何图形面积计算】几何图形面积计算是指对具有简单几何形状的面要素进行面积计算。
对于规则的几何图形,如矩形、圆形、三角形等,可以直接采用相应的几何公式进行面积计算。
对于不规则的几何图形,可以采用矢量数据裁剪、聚合等方法将其转换为规则几何图形,然后进行面积计算。
【3.2 复合图形面积计算】复合图形面积计算是指对由多个简单几何图形组成的面要素进行面积计算。
可以采用分层处理、逐层裁剪等方法,将复合图形分解为简单的几何图形,然后分别计算其面积,最后将各层面积进行累加,得到复合图形的总面积。
【3.3 细分图形面积计算】细分图形面积计算是指对具有细分属性的面要素进行面积计算。
可以采用面要素细分、属性数据重分类等方法,将细分属性转化为几何形状,然后进行面积计算。
GIS算法的计算几何基础矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。
如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。
矢量加减法:设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。
显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。
矢量叉积:计算矢量叉积是与直线和线段相关算法的核心部分。
设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。
显然有性质P × Q = - ( Q × P ) 和P × ( - Q ) = - ( P × Q )。
两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:若P × Q > 0 , 则P在Q的顺时针方向。
若P × Q < 0 , 则P在Q的逆时针方向。
若P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
折线段的拐向判断:折线段的拐向判断方法可以直接由矢量叉积的性质推出。
对于有公共端点的线段p0p1和p1p2,通过计算(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。
若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。