Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                    }
                }
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }