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)