Пример #1
0
 public GISLine(List <GISVertex> _vertexes)
 {
     Vertexes = _vertexes;
     centroid = GISTools.CalculateCentroid(_vertexes);
     extent   = GISTools.CalculateExtent(_vertexes);
     length   = GISTools.CalculateLength(_vertexes);
 }
Пример #2
0
 public GISPolygon(List <GISVertex> _vertexes)
 {
     Vertexes = _vertexes;
     centroid = GISTools.CalculateCentroid(_vertexes);
     extent   = GISTools.CalculateExtent(_vertexes);
     Area     = GISTools.CalculateArea(_vertexes);
 }
Пример #3
0
 static void WriteFields(List <GISField> fields, BinaryWriter bw)
 {
     for (int fieldindex = 0; fieldindex < fields.Count; fieldindex++)
     {
         GISField field = fields[fieldindex];
         bw.Write(GISTools.TypeToInt(field.datatype)); //字段类型
         GISTools.WriteString(field.name, bw);         //字段名
     }
 }
Пример #4
0
        //点到线实体的距离计算 //可以算出最短的距离 但无法获知最近的位置
        public double Distance(GISVertex vertex)
        {
            double distance = Double.MaxValue;

            for (int i = 0; i < Vertexes.Count - 1; i++)
            {
                distance = Math.Min(GISTools.PointToSegment
                                        (Vertexes[i], Vertexes[i + 1], vertex), distance);
            }
            return(distance);
        }
Пример #5
0
        //*************
        //从文件中读取字段信息
        static List <GISField> ReadFields(BinaryReader br, int FieldCount)
        {
            List <GISField> fields = new List <GISField>();

            for (int fieldindex = 0; fieldindex < FieldCount; fieldindex++)
            {
                Type   fieldtype = GISTools.IntToType(br.ReadInt32());
                string fieldname = GISTools.ReadString(br);
                fields.Add(new GISField(fieldtype, fieldname));
            }
            return(fields);
        }
Пример #6
0
        //写文件函数主框架
        public static void WriteFile(GISLayer layer, string filename)
        {
            FileStream   fsr = new FileStream(filename, FileMode.Create); //根据文件名创建文件流
            BinaryWriter bw  = new BinaryWriter(fsr);

            WriteFileHeader(layer, bw);           //写入头文件
            GISTools.WriteString(layer.Name, bw); //写入图层名字
            WriteFields(layer.Fields, bw);        //写入字段
            WriteFeatures(layer, bw);
            bw.Close();
            fsr.Close();
        }
Пример #7
0
        static void WriteFileHeader(GISLayer layer, BinaryWriter bw)//bw是与文件相连的文件写入工具
        {
            MyFileHeader mfh = new MyFileHeader();

            mfh.MinX         = layer.Extent.getMinX();
            mfh.MinY         = layer.Extent.getMinY();
            mfh.MaxX         = layer.Extent.getMaxX();
            mfh.MaxY         = layer.Extent.getMaxY();
            mfh.FeatureCount = layer.FeatureCount();
            mfh.Shapetype    = (int)(layer.ShapeType);
            mfh.FieldCount   = layer.Fields.Count;
            bw.Write(GISTools.ToBytes(mfh));
        }
Пример #8
0
 static ShapefileHeader ReadFileHeader(BinaryReader br) //用于读取文件头的函数
 {                                                      //*************************************
     /*
      * byte[] buff = br.ReadBytes(Marshal.SizeOf(typeof(ShapefileHeader)));
      * GCHandle handle = GCHandle.Alloc(buff, GCHandleType.Pinned);//handle读取buff数组在内存中的指针
      * //指针指向的内存被映射给一个结构体实例header
      * ShapefileHeader header = (ShapefileHeader)Marshal.PtrToStructure
      *  (handle.AddrOfPinnedObject(), typeof(ShapefileHeader));
      * handle.Free(); //释放内存 将其还给C#管理
      * return header;
      */
     return((ShapefileHeader)GISTools.FromBytes(br, typeof(ShapefileHeader)));
 }
Пример #9
0
        public static GISLayer ReadFile(string filename)
        {
            FileStream      fsr       = new FileStream(filename, FileMode.Open);
            BinaryReader    br        = new BinaryReader(fsr);
            MyFileHeader    mfh       = (MyFileHeader)(GISTools.FromBytes(br, typeof(MyFileHeader)));       //读取文件头
            SHAPETYPE       ShapeType = (SHAPETYPE)Enum.Parse(typeof(SHAPETYPE), mfh.Shapetype.ToString()); //获取空间实体类型shapetype和
            GISExtent       Extent    = new GISExtent(mfh.MinX, mfh.MaxX, mfh.MinY, mfh.MaxY);              //地图范围extent
            string          layername = GISTools.ReadString(br);                                            //读取图层名
            List <GISField> Fields    = ReadFields(br, mfh.FieldCount);                                     //读取字段信息
            GISLayer        layer     = new GISLayer(layername, ShapeType, Extent, Fields);

            ReadFeatures(layer, br, mfh.FeatureCount);
            br.Close();
            fsr.Close();
            return(layer);
        }
Пример #10
0
        private void btchangedotdensity_Click(object sender, EventArgs e)
        {
            int   dotdensity = Convert.ToInt32(tbdotdensity.Text);
            int   dotsize    = Convert.ToInt32(tbdotsize.Text);
            Color dotcolor   = btdotfillcolor.BackColor;
            //获取归一化后的属性数据 作为每一个控件对象内点数量的权重
            List <int> normalizations = layer.getNormalized(cbattributedot.SelectedIndex, dotdensity);

            if (normalizations == null)
            {
                MessageBox.Show("基于该属性无法绘制点密度地图!!");
                return;
            }

            //新建一个dotlayer,在点密度中的点将以一个点图层的形式显示出来
            GISLayer dotlayer = new GISLayer("dotdensity", SHAPETYPE.point, layer.Extent);

            dotlayer.Selectable     = false;                   //设置为不可选择
            dotlayer.ThematicType   = THEMATICTYPE.DotDensity; //设置为点密度型专题地图
            dotlayer.defaultThmatic = new GISThematic(dotcolor, dotsize, dotcolor);
            List <GISFeature> dotpoints = GISTools.MakeRandomDensityDot(layer,
                                                                        cbattributedot.SelectedIndex, normalizations);

            dotlayer.Features = dotpoints;

            //先移除之前已有的点密度图层
            for (int i = Document.layers.Count - 1; i > 0; i--)
            {
                if (Document.layers[i].Name == "dotdensity")
                {
                    Document.layers.RemoveAt(i);
                }
            }
            Document.layers.Add(dotlayer);//将dotlayer添加到document中 在更新地图绘制时会自动绘制layers里面的所有图层
            //更新地图绘制
            if (sender.Equals(previewds))
            {
                PreviewWindow.UpdateMap();
            }
            else if (sender.Equals(btchangedotdensity))
            {
                Mapwindow.UpdateMap();
            }
        }
Пример #11
0
 public override void draw(Graphics graphics, GISView view)
 {
     Point[] points = GISTools.GetScreenPoints(Vertexes, view);
     graphics.FillPolygon(new SolidBrush(Color.Yellow), points);
     graphics.DrawPolygon(new Pen(Color.White, 2), points);
 }
Пример #12
0
 public override void draw(Graphics graphics, GISView view)
 {
     Point[] points = GISTools.GetScreenPoints(Vertexes, view);
     graphics.DrawLines(new Pen(Color.Red, 2), points);
 }
Пример #13
0
        //读取一个gisfeature的所有属性值,放在gisfile中 此函数需要事先知道字段结构,根据字段类型选取适当的读取函数
        static GISAttribute ReadAttributes(List <GISField> fs, BinaryReader br)
        {
            GISAttribute attribute = new GISAttribute();

            for (int i = 0; i < fs.Count; i++)
            {
                Type type = fs[i].datatype;
                if (type.ToString() == "System.Boolean")
                {
                    attribute.AddValue(br.ReadBoolean());
                }
                else if (type.ToString() == "System.Boolean")
                {
                    attribute.AddValue(br.ReadBoolean());
                }
                else if (type.ToString() == "System.Byte")
                {
                    attribute.AddValue(br.ReadByte());
                }
                else if (type.ToString() == "System.Char")
                {
                    attribute.AddValue(br.ReadChar());
                }
                else if (type.ToString() == "System.Decimal")
                {
                    attribute.AddValue(br.ReadDecimal());
                }
                else if (type.ToString() == "System.Double")
                {
                    attribute.AddValue(br.ReadDouble());
                }
                else if (type.ToString() == "System.Single")
                {
                    attribute.AddValue(br.ReadSingle());
                }
                else if (type.ToString() == "System.Int32")
                {
                    attribute.AddValue(br.ReadInt32());
                }
                else if (type.ToString() == "System.Int64")
                {
                    attribute.AddValue(br.ReadInt64());
                }
                else if (type.ToString() == "System.UInt16")
                {
                    attribute.AddValue(br.ReadUInt16());
                }
                else if (type.ToString() == "System.UInt32")
                {
                    attribute.AddValue(br.ReadUInt32());
                }
                else if (type.ToString() == "System.UInt64")
                {
                    attribute.AddValue(br.ReadUInt64());
                }
                else if (type.ToString() == "System.Boolean")
                {
                    attribute.AddValue(br.ReadBoolean());
                }
                else if (type.ToString() == "System.String")
                {
                    attribute.AddValue(GISTools.ReadString(br));
                }
            }
            return(attribute);
        }
Пример #14
0
 static void WriteAttributes(GISAttribute attribute, BinaryWriter bw)
 {
     for (int i = 0; i < attribute.ValueCount(); i++)
     {
         Type type = attribute.GetValue(i).GetType();
         if (type.ToString() == "System.Boolean")
         {
             bw.Write((bool)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Byte")
         {
             bw.Write((byte)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Char")
         {
             bw.Write((char)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Decimal")
         {
             bw.Write((decimal)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Double")
         {
             bw.Write((double)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Single")
         {
             bw.Write((float)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Int32")
         {
             bw.Write((int)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Int64")
         {
             bw.Write((long)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.UInt16")
         {
             bw.Write((ushort)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.UInt32")
         {
             bw.Write((uint)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.UInt64")
         {
             bw.Write((ulong)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.SByte")
         {
             bw.Write((sbyte)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.Int16")
         {
             bw.Write((short)attribute.GetValue(i));
         }
         else if (type.ToString() == "System.String")
         {
             GISTools.WriteString((string)attribute.GetValue(i), bw);
         }
     }
 }