The ShapeFile class represents the contents of a single ESRI shapefile. This is the class which contains functionality for reading shapefiles and their corresponding dBASE attribute files.
You can call the Read() method to import both shapes and attributes at once. Or, you can open the file stream yourself and read the file header or individual records one at a time. The advantage of this is that it allows you to implement your own progress reporting functionality, for example.
示例#1
0
        /// <summary>
        /// Read a shapefile Polygon record.
        /// </summary>
        /// <param name="stream">Input stream.</param>
        /// <param name="record">Shapefile record to be updated.</param>
        private static void ReadPolygon(Stream stream, ShapeFileRecord record)
        {
            // Bounding Box.
            record.XMin = ShapeFile.ReadDouble64_LE(stream);
            record.YMin = ShapeFile.ReadDouble64_LE(stream);
            record.XMax = ShapeFile.ReadDouble64_LE(stream);
            record.YMax = ShapeFile.ReadDouble64_LE(stream);

            // Num Parts and Points.
            int numParts  = ShapeFile.ReadInt32_LE(stream);
            int numPoints = ShapeFile.ReadInt32_LE(stream);

            // Parts.
            for (int i = 0; i < numParts; i++)
            {
                record.Parts.Add(ShapeFile.ReadInt32_LE(stream));
            }

            // Points.
            for (int i = 0; i < numPoints; i++)
            {
                PointF p = new PointF();
                p.X = (float)ShapeFile.ReadDouble64_LE(stream);
                p.Y = (float)ShapeFile.ReadDouble64_LE(stream);
                record.Points.Add(p);
            }
        }
示例#2
0
        /// <summary>
        /// Read a shapefile Point record.
        /// </summary>
        /// <param name="stream">Input stream.</param>
        /// <param name="record">Shapefile record to be updated.</param>
        private static void ReadPoint(Stream stream, ShapeFileRecord record)
        {
            // Points - add a single point.
            PointF p = new PointF();

            p.X = (float)ShapeFile.ReadDouble64_LE(stream);
            p.Y = (float)ShapeFile.ReadDouble64_LE(stream);
            record.Points.Add(p);

            // Bounding Box.
            record.XMin = p.X;
            record.YMin = p.Y;
            record.XMax = record.XMin;
            record.YMax = record.YMin;
        }
        private void openFileDialog_Click( object sender, RoutedEventArgs e )
        {
            //Create the dialog allowing the user to select the "*.shp" and the "*.dbf" files
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Multiselect = true;

            if( !( ofd.ShowDialog() ?? false ) )
                return;

            //Get the file info objects for the SHP and the DBF file selected by the user
            FileInfo shapeFile = null;
            FileInfo dbfFile = null;
            foreach( FileInfo fi in ofd.Files )
            {
                if( fi.Extension.ToLower() == ".shp" )
                {
                    shapeFile = fi;
                }
                if( fi.Extension.ToLower() == ".dbf" )
                {
                    dbfFile = fi;
                }
            }

            //Read the SHP and DBF files into the ShapeFileReader
            ShapeFile shapeFileReader = new ShapeFile();
            if( shapeFile != null && dbfFile != null )
            {
                shapeFileReader.Read( shapeFile, dbfFile );
            }
            else
            {
                HtmlPage.Window.Alert( "Please select a SP and a DBF file to proceed." );
                return;
            }

            //Add the shapes from the shapefile into a graphics layer named "shapefileGraphicsLayer"
            //the greaphics layer should be present in the XAML are created earliers
            GraphicsLayer graphicsLayer = MyMap.Layers[ "shapefileGraphicsLayer" ] as GraphicsLayer;
            foreach( ShapeFileRecord record in shapeFileReader.Records )
            {
                Graphic graphic = record.ToGraphic();
                if( graphic != null )
                    graphicsLayer.Graphics.Add( graphic );
            }

            MyMapTip.GraphicsLayer = graphicsLayer;
        }
示例#4
0
        /// <summary>
        /// Read a shapefile record.
        /// </summary>
        /// <param name="stream">Input stream.</param>
        public ShapeFileRecord ReadShapeFileRecord(Stream stream)
        {
            ShapeFileRecord record = new ShapeFileRecord();

            // Record Header.
            record.RecordNumber  = ShapeFile.ReadInt32_BE(stream);
            record.ContentLength = ShapeFile.ReadInt32_BE(stream);

            // Shape Type.
            record.ShapeType = ShapeFile.ReadInt32_LE(stream);

            // Read the shape geometry, depending on its type.
            switch (record.ShapeType)
            {
            case ( int )ShapeType.NullShape:
                // Do nothing.
                break;

            case ( int )ShapeType.Point:
                ShapeFile.ReadPoint(stream, record);
                break;

            case ( int )ShapeType.PolyLine:
                // PolyLine has exact same structure as Polygon in shapefile.
                ShapeFile.ReadPolygon(stream, record);
                break;

            case ( int )ShapeType.Polygon:
                ShapeFile.ReadPolygon(stream, record);
                break;

            case ( int )ShapeType.Multipoint:
                ShapeFile.ReadMultipoint(stream, record);
                break;

            default:
            {
                string msg = String.Format(System.Globalization.CultureInfo.InvariantCulture, "ShapeType {0} is not supported.", ( int )record.ShapeType);
                throw new NotSupportedException(msg);
            }
            }

            // Add the record to our internal list.
            this.records.Add(record);

            return(record);
        }
示例#5
0
        /// <summary>
        /// Read the file header of the shapefile.
        /// </summary>
        /// <param name="stream">Input stream.</param>
        public void ReadShapeFileHeader(Stream stream)
        {
            // File Code.
            this.fileHeader.FileCode = ShapeFile.ReadInt32_BE(stream);
            if (this.fileHeader.FileCode != ShapeFile.expectedFileCode)
            {
                string msg = String.Format(System.Globalization.CultureInfo.InvariantCulture, "Invalid FileCode encountered. Expecting {0}.", ShapeFile.expectedFileCode);
                throw new NotSupportedException(msg);
            }

            // 5 unused values.
            ShapeFile.ReadInt32_BE(stream);
            ShapeFile.ReadInt32_BE(stream);
            ShapeFile.ReadInt32_BE(stream);
            ShapeFile.ReadInt32_BE(stream);
            ShapeFile.ReadInt32_BE(stream);

            // File Length.
            this.fileHeader.FileLength = ShapeFile.ReadInt32_BE(stream);

            // Version.
            this.fileHeader.Version = ShapeFile.ReadInt32_LE(stream);

            // Shape Type.
            this.fileHeader.ShapeType = ShapeFile.ReadInt32_LE(stream);

            // Bounding Box.
            this.fileHeader.XMin = ShapeFile.ReadDouble64_LE(stream);
            this.fileHeader.YMin = ShapeFile.ReadDouble64_LE(stream);
            this.fileHeader.XMax = ShapeFile.ReadDouble64_LE(stream);
            this.fileHeader.YMax = ShapeFile.ReadDouble64_LE(stream);

            // Adjust the bounding box in case it is too small.
            if (Math.Abs(this.fileHeader.XMax - this.fileHeader.XMin) < 1)
            {
                this.fileHeader.XMin -= 5;
                this.fileHeader.XMax += 5;
            }
            if (Math.Abs(this.fileHeader.YMax - this.fileHeader.YMin) < 1)
            {
                this.fileHeader.YMin -= 5;
                this.fileHeader.YMax += 5;
            }

            // Skip the rest of the file header.
            stream.Seek(100, SeekOrigin.Begin);
        }
示例#6
0
        /// <summary>
        /// Read a shapefile MultiPoint record.
        /// </summary>
        /// <param name="stream">Input stream.</param>
        /// <param name="record">Shapefile record to be updated.</param>
        private static void ReadMultipoint(Stream stream, ShapeFileRecord record)
        {
            // Bounding Box.
            record.XMin = ShapeFile.ReadDouble64_LE(stream);
            record.YMin = ShapeFile.ReadDouble64_LE(stream);
            record.XMax = ShapeFile.ReadDouble64_LE(stream);
            record.YMax = ShapeFile.ReadDouble64_LE(stream);

            // Num Points.
            int numPoints = ShapeFile.ReadInt32_LE(stream);

            // Points.
            for (int i = 0; i < numPoints; i++)
            {
                Point p = new Point();
                p.X = ShapeFile.ReadDouble64_LE(stream);
                p.Y = ShapeFile.ReadDouble64_LE(stream);
                record.Points.Add(p);
            }
        }