GIS作业02
定义一个空间要素类
class GISFeature
{
public GISSpatial spatialpart;
public GISAttribute attributepart;
public GISFeature(GISSpatial spatial, GISAttribute attribute)
{
spatialpart = spatial;
attributepart = attribute;
}
}
该类还需要定义GISSpatial和GISExtent类
using System.Collections;
using System.Drawing;
abstract class GISSpatial
{
public GISVertex centroid;
public GISExtent extent;
public abstract void draw(Graphics graphics);
}
class GISAttribute
{
ArrayList values = new ArrayList();
}
class GISExtent
{
public GISVertex bottomleft;
public GISVertex upright;
public GISExtent(GISVertex _bottomleft, GISVertex _upright)
{
bottomleft = _bottomleft;
upright = _upright;
}
}
基于抽象类扩充空间实体类
修改GISPoint类代码
using System.Drawing;
class GISPoint : GISSpatial
{
public GISPoint(GISVertex onevertex)
{
centroid = onevertex;
extent = new GISExtent(onevertex, onevertex);
}
public override void draw(Graphics graphics)
{
graphics.FillEllipse(new SolidBrush(Color.Red),
new Rectangle((int)(centroid.x) - 3, (int)(centroid.y) - 3, 6, 6));
}
public double Distance(GISVertex anothervertex)
{
return centroid.Distance(anothervertex);
}
}
添加GISLine,GISPolygon 类
using System.Collections.Generic;
using System.Drawing;
class GISLine : GISSpatial
{
List<GISVertex> AllVertexs;
public override void draw(Graphics graphics)
{
}
}
using System.Collections.Generic;
using System.Drawing;
class GISPolygon : GISSpatial
{
List<GISVertex> AllVertexs;
public override void draw(Graphics graphics)
{
}
}
扩充前面定义的类
扩展GISSpatial类的代码
using System.Collections;
using System.Drawing;
abstract class GISSpatial
{
public GISVertex centroid;
public GISExtent extent;
public abstract void draw(Graphics graphics);
}
class GISAttribute
{
ArrayList values = new ArrayList();
public void AddValue(object o)
{
values.Add(o);
}
public object GetValue(int index)
{
return values[index];
}
public void draw(Graphics graphics, GISVertex location, int index)
{
graphics.DrawString(values[index].ToString(), new Font("宋体", 20),
new SolidBrush(Color.Green), new PointF((int)(location.x), (int)(location.y)));
}
}
扩充GISFeature代码:
using System.Drawing;
class GISFeature
{
public GISSpatial spatialpart;
public GISAttribute attributepart;
public GISFeature(GISSpatial spatial, GISAttribute attribute)
{
spatialpart = spatial;
attributepart = attribute;
}
public void draw(Graphics graphics, bool DrawAttributeOrNot, int index)
{
spatialpart.draw(graphics);
if (DrawAttributeOrNot)
attributepart.draw(graphics, spatialpart.centroid, index);
}
public object getAttribute(int index)
{
return attributepart.GetValue(index);
}
}
修改form1代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GIS01
{
public partial class Form1 : Form
{
List<GISFeature> features = new List<GISFeature>();
public Form1()
{
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
//获取空间信息
double x = Convert.ToDouble(textBox1.Text);
double y = Convert.ToDouble(textBox2.Text);
GISVertex onevertex = new GISVertex(x, y);
GISPoint onepoint = new GISPoint(onevertex);
//获取属性信息
string attribute = textBox3.Text;
GISAttribute oneattribute = new GISAttribute();
oneattribute.AddValue(attribute);
//新建一个GISFeature,并添加到数组"features"中
GISFeature onefeature = new GISFeature(onepoint, oneattribute);
features.Add(onefeature);
//把这个新的GISFeature画出来
Graphics graphics = this.CreateGraphics();
onefeature.draw(graphics, true, 0);
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
GISVertex onevertex = new GISVertex((double)e.X, (double)e.Y);
double mindistance = Double.MaxValue;
int findid = -1;
for (int i = 0; i < features.Count; i++)
{
double distance = features[i].spatialpart.centroid.Distance(onevertex);
if (distance < mindistance)
{
mindistance = distance;
findid = i;
}
}
if (mindistance > 5 || findid == -1)
{
MessageBox.Show("没有点实体或者鼠标点击位置不准确!");
}
else
MessageBox.Show(features[findid].getAttribute(0).ToString());
}
}
}