GIS算法原理与开发-实体数据结构多边形面积计算

多边形面积的计算也比较简单,以实体数据结构为例。

该多边形有5个顶点围成,其中三个点构成多边形的上半部分,两个点构成多边形的下半部分。如果计算上边界以下部分的面积,并且减去下边界以下部分的面积,就可以得到多边形本身的面积,如图所示

-

=

如图,从第一条线段开始,线以下面积可以分成2部分之和

下半部分面积=(x2-x1)*y1

上半部分面积=(x2-x1)(y2-y1)/2

两部分相加=(x2-x1)*(y1+y2)/2

依次类推依次求和,求出每条边所对应的上半部分的三角形和下半部分的矩形,当求出的面积值为负值时表示多边形以下阴影部分的面积,是需要减掉的,所以只要针对每条边求上下部分面积最后求和即可

默认线的节点坐标存储的顺序即为线的方向,按顺时针存储

1)存储面数据

//存储空间位置信息 if (!File.Exists('c:\\data\\polygonsarea.txt')) { FileStream fs1 = new FileStream('c:\\data\\polygonsarea.txt', FileMode.Create, FileAccess.Write);//创建写入文件  StreamWriter sw = new StreamWriter(fs1); sw.WriteLine('1|56|29|1');//开始写入值 sw.WriteLine('1|44|29|3');//开始写入值 sw.WriteLine('1|36|78|2');//开始写入值 sw.WriteLine('1|56|29|1');//开始写入值 sw.WriteLine('2|23|72|1');//开始写入值 sw.WriteLine('2|30|39|2');//开始写入值 sw.WriteLine('2|66|87|3');//开始写入值 sw.Close(); fs1.Close(); } else { FileStream fs = new FileStream('c:\\data\\polygonsarea.txt', FileMode.Open, FileAccess.Write); StreamWriter sr = new StreamWriter(fs); sr.WriteLine('1|56|29');//开始写入值 sr.WriteLine('1|44|29');//开始写入值 sr.WriteLine('1|36|78');//开始写入值 sr.WriteLine('1|56|29');//开始写入值
sr.WriteLine('2|23|72');//开始写入值 sr.WriteLine('2|30|39');//开始写入值 sr.WriteLine('2|66|87');//开始写入值 sr.WriteLine('2|23|72');//开始写入值 sr.Close(); fs.Close(); }

2)计算面积

   //读取txt文件并绘制折线            string filePath = 'C:\\data\\polygonsarea.txt';            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);            StreamReader sr = new StreamReader(fs);            string str = sr.ReadLine();//开始读入值                       double douarea = 0;            while (str != null)            {                string[] strtemp1 = str.Split('|');                double x1 = Convert.ToDouble(strtemp1[1]);                double y1 = Convert.ToDouble(strtemp1[2]);                str = sr.ReadLine();//开始读入值                if (str != null)                {                    string[] strtemp2 = str.Split('|');                    double x2 = Convert.ToDouble(strtemp2[1]);                    double y2 = Convert.ToDouble(strtemp2[2]);                    if (strtemp1[0] == strtemp2[0])                    {                        douarea = douarea + (x2- x1)*((y2+y1)/2);                    }                    else                    {                        if (strtemp1[0] != strtemp2[0])                        {                            MessageBox.Show('面积:' + douarea.ToString());                            douarea = 0;                        }                    }                }                else                {                    MessageBox.Show('面积:' + douarea.ToString());                }            }            sr.Close();            fs.Close();

参考

1.GIS数据结构与算法基础

(0)

相关推荐