static List <GISFeature> ReadFeatures(BinaryReader br, SHAPETYPE ShapeType, List <GISField> Fields, int FeatureCount) { List <GISFeature> Features = new List <GISFeature>(); for (int featureindex = 0; featureindex < FeatureCount; featureindex++) { GISFeature feature = new GISFeature(null, null); if (ShapeType == SHAPETYPE.POINT) { GISVertex _location = ReadVertex(br); feature.spatialpart = new GISPoint(_location); } else if (ShapeType == SHAPETYPE.LINE) { List <GISVertex> vs = new List <GISVertex>(); int vcount = br.ReadInt32(); for (int vc = 0; vc < vcount; vc++) { vs.Add(ReadVertex(br)); } feature.spatialpart = new GISLine(vs); } else if (ShapeType == SHAPETYPE.POLYGON) { List <GISVertex> vs = new List <GISVertex>(); int vcount = br.ReadInt32(); for (int vc = 0; vc < vcount; vc++) { vs.Add(ReadVertex(br)); } feature.spatialpart = new GISPolygon(vs); } GISAttribute ga = new GISAttribute(); for (int fieldindex = 0; fieldindex < Fields.Count; fieldindex++) { GISField field = Fields[fieldindex]; if (field.datatype == typeof(int)) { ga.AddValue(br.ReadInt32()); } else if (field.datatype == typeof(double)) { ga.AddValue(br.ReadDouble()); } else if (field.datatype == typeof(string)) { ga.AddValue(ReadString(br)); } } feature.attributepart = ga; Features.Add(feature); } return(Features); }
static void WriteFeatures(GISLayer layer, BinaryWriter bw) { for (int featureindex = 0; featureindex < layer.Features.Count; featureindex++) { GISFeature feature = layer.Features[featureindex]; if (layer.ShapeType == SHAPETYPE.POINT) { WriteVertex(((GISPoint)feature.spatialpart).Location, bw); } else if (layer.ShapeType == SHAPETYPE.LINE) { GISLine line = (GISLine)(feature.spatialpart); bw.Write(line.Vertexes.Count); for (int vc = 0; vc < line.Vertexes.Count; vc++) { WriteVertex(line.Vertexes[vc], bw); } } else if (layer.ShapeType == SHAPETYPE.POLYGON) { GISPolygon polygon = (GISPolygon)(feature.spatialpart); bw.Write(polygon.Vertexes.Count); for (int vc = 0; vc < polygon.Vertexes.Count; vc++) { WriteVertex(polygon.Vertexes[vc], bw); } } for (int fieldindex = 0; fieldindex < layer.Fields.Count; fieldindex++) { GISField field = layer.Fields[fieldindex]; int tint = TypeToInt(field.datatype); if (tint == 1) { bw.Write((int)(feature.getAttributeValue(fieldindex))); } else if (tint == 2) { bw.Write(Convert.ToDouble(feature.getAttributeValue(fieldindex))); } else if (tint == 3) { WriteString(feature.getAttributeValue(fieldindex).ToString(), bw); } } } }
public GISFeature SelectByClick(Point mousepoint, GISView view) { GISFeature feature = null; GISVertex vertex = view.ToMapVertex(mousepoint); double mindist = view.ToMapDistance(MINIMUMSCREENDISTANCE); if (ShapeType == SHAPETYPE.POINT) { feature = SelectPointByVertex(vertex, mindist); } if (ShapeType == SHAPETYPE.LINE) { feature = SelectLineByVertex(vertex, mindist); } if (ShapeType == SHAPETYPE.POLYGON) { feature = SelectPolygonByVertex(vertex); } return(feature); }
public static GISLayer ReadShapeFile(string shpfilename) { FileStream fsr = new FileStream(shpfilename, FileMode.Open); BinaryReader br = new BinaryReader(fsr); ShapeFileHeader sfh = ReadFileHeader(br); SHAPETYPE ShapeType = SHAPETYPE.POINT; if (sfh.ShapeType == 1) { ShapeType = SHAPETYPE.POINT; } else if (sfh.ShapeType == 3) { ShapeType = SHAPETYPE.LINE; } else if (sfh.ShapeType == 5) { ShapeType = SHAPETYPE.POLYGON; } else { return(null); } GISExtent extent = new GISExtent(new GISVertex(sfh.Xmin, sfh.Ymin), new GISVertex(sfh.Xmax, sfh.Ymax)); string dbffilename = shpfilename.Replace(".shp", ".dbf"); DataTable table = ReadDBF(dbffilename); GISLayer layer = new GISLayer(shpfilename, ShapeType, extent, ReadFields(table)); int rowindex = 0; while (br.PeekChar() != -1) { RecordHeader rh = ReadRecordHeader(br); int RecordLength = FromBigToLittle(rh.RecordLength); byte[] RecordContent = br.ReadBytes(RecordLength * 2 - 4); if (ShapeType == SHAPETYPE.POINT) { GISPoint onepoint = ReadPoint(RecordContent); GISFeature onefeature = new GISFeature(onepoint, ReadAttribute(table, rowindex)); layer.Features.Add(onefeature); } if (ShapeType == SHAPETYPE.LINE) { List <GISLine> lines = ReadLines(RecordContent); for (int i = 0; i < lines.Count; i++) { GISFeature onefeature = new GISFeature(lines[i], ReadAttribute(table, rowindex)); layer.Features.Add(onefeature); } } if (ShapeType == SHAPETYPE.POLYGON) { List <GISPolygon> polygons = ReadPolygons(RecordContent); for (int i = 0; i < polygons.Count; i++) { GISFeature onefeature = new GISFeature(polygons[i], ReadAttribute(table, rowindex)); layer.Features.Add(onefeature); } } rowindex++; //其它代码,用于处理RecordContent } br.Close(); fsr.Close(); return(layer); }