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());
        }
    }
}
posted @ 2022-01-22 14:56  一个经常掉线的人  阅读(41)  评论(0编辑  收藏  举报