public GISLine(List <GISVertex> _vertexes) { Vertexes = _vertexes; centroid = GISTools.CalculateCentroid(_vertexes); extent = GISTools.CalculateExtent(_vertexes); length = GISTools.CalculateLength(_vertexes); }
public GISPolygon(List <GISVertex> _vertexes) { Vertexes = _vertexes; centroid = GISTools.CalculateCentroid(_vertexes); extent = GISTools.CalculateExtent(_vertexes); Area = GISTools.CalculateArea(_vertexes); }
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); //字段名 } }
//点到线实体的距离计算 //可以算出最短的距离 但无法获知最近的位置 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); }
//************* //从文件中读取字段信息 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); }
//写文件函数主框架 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(); }
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)); }
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))); }
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); }
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(); } }
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); }
public override void draw(Graphics graphics, GISView view) { Point[] points = GISTools.GetScreenPoints(Vertexes, view); graphics.DrawLines(new Pen(Color.Red, 2), points); }
//读取一个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); }
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); } } }