private int ShowHeader(SHPHeader ASHPHeader)
        {
            byte[] B      = IntegerBytes(ASHPHeader.FileLength);
            int    result = B[3] + (B[2] * 256) + (B[1] * 256 * 256) + (B[0] * 256 * 256 * 256);

            if (debug != null)
            {
                AddDebug("FileCode: " + ASHPHeader.FileCode.ToString());
                AddDebug("Filelength: " + ASHPHeader.FileLength.ToString());
                AddDebug("FileSize: " + Convert.ToString(2 * result));
            }

            result = (result * 2 - 100) / 8;

            if (debug != null)
            {
                AddDebug("NumRecords: " + result.ToString());
                AddDebug("Version: " + Convert.ToString(ASHPHeader.Version));
                AddDebug("ShapeType: " + Convert.ToString(ASHPHeader.ShapeType));
                AddDebug("XMin: " + Convert.ToString(ASHPHeader.XMin));
                AddDebug("YMin: " + Convert.ToString(ASHPHeader.YMin));
                AddDebug("XMax: " + Convert.ToString(ASHPHeader.XMax));
                AddDebug("YMax: " + Convert.ToString(ASHPHeader.YMax));
                AddDebug("ZMin: " + Convert.ToString(ASHPHeader.ZMin));
                AddDebug("ZMax: " + Convert.ToString(ASHPHeader.ZMax));
                AddDebug("MMin: " + Convert.ToString(ASHPHeader.MMin));
                AddDebug("MMax: " + Convert.ToString(ASHPHeader.MMax));
            }

            return(result);
        }
        private void ReadSHPHeader(Stream f, ref SHPHeader ASHPHeader)
        {
            BinaryReader bin = new BinaryReader(f);

            int    myInt32;
            double myDouble;

            for (int i = 0; i < 9; ++i)
            {
                myInt32 = bin.ReadInt32();
                AddInteger(ref ASHPHeader, i, myInt32);
            }

            for (int i = 0; i < 8; ++i)
            {
                myDouble = bin.ReadDouble();
                AddDouble(ref ASHPHeader, i, myDouble);
            }
        }
        private void AddInteger(ref SHPHeader ASHPHeader, int Order, int MyInt32)
        {
            switch (Order)
            {
            case 0:
                ASHPHeader.FileCode = MyInt32;
                break;

            case 1:
                ASHPHeader.Unused1 = MyInt32;
                break;

            case 2:
                ASHPHeader.Unused2 = MyInt32;
                break;

            case 3:
                ASHPHeader.Unused3 = MyInt32;
                break;

            case 4:
                ASHPHeader.Unused4 = MyInt32;
                break;

            case 5:
                ASHPHeader.Unused5 = MyInt32;
                break;

            case 6:
                ASHPHeader.FileLength = MyInt32;
                break;

            case 7:
                ASHPHeader.Version = MyInt32;
                break;

            case 8:
                ASHPHeader.ShapeType = MyInt32;
                break;
            }
        }
        private void AddDouble(ref SHPHeader ASHPHeader, int Order, double MyDouble)
        {
            switch (Order)
            {
            case 0:
                ASHPHeader.XMin = MyDouble;
                break;

            case 1:
                ASHPHeader.YMin = MyDouble;
                break;

            case 2:
                ASHPHeader.XMax = MyDouble;
                break;

            case 3:
                ASHPHeader.YMax = MyDouble;
                break;

            case 4:
                ASHPHeader.ZMin = MyDouble;
                break;

            case 5:
                ASHPHeader.ZMax = MyDouble;
                break;

            case 6:
                ASHPHeader.MMin = MyDouble;
                break;

            case 7:
                ASHPHeader.MMax = MyDouble;
                break;
            }
        }
        /// <summary>
        /// Loads an ESRI(c) SHP file into a Map series.
        /// </summary>
        /// <param name="Series"></param>
        /// <param name="FileName"></param>
        /// <param name="Table"></param>
        /// <param name="FieldName"></param>
        /// <param name="FieldValue"></param>
        /// <param name="Debug"></param>
        public void LoadMap(Map Series, string FileName, DataTable Table,
                            string FieldName, string FieldValue, ListBox.ObjectCollection Debug,
                            string filter)
        {
            debug = Debug;
            SHPHeader       shpHeader       = new SHPHeader();
            SHPRecordHeader shpRecordHeader = new SHPRecordHeader();

            // Verify map file name
            string tmpName = FileName; // replaceFilePath(FileName, ".shp");

            FileStream f = File.OpenRead(tmpName);

            try
            {
                if (debug != null)
                {
                    debug.Clear();
                }

                AddDebug("Real File size: " + f.Length.ToString());

                f.Position = 0;
                ReadSHPHeader(f, ref shpHeader);

                VerifySignature(shpHeader.FileCode, tmpName);

                ShowHeader(shpHeader);

                tmpName = replaceFilePath(FileName, ".shx");

                FileStream fx = File.OpenRead(tmpName);
                try
                {
                    fx.Position = 0;
                    ReadSHPHeader(fx, ref shpHeader);

                    VerifySignature(shpHeader.FileCode, tmpName);

                    if (debug != null)
                    {
                        AddDebug(" ");
                        AddDebug("Real File size: " + fx.Length.ToString());
                    }

                    int NumRecords = ShowHeader(shpHeader);

                    Series.Clear();
                    Series.BeginUpdate();
                    Series.Chart.AutoRepaint = false;

                    for (int i = 1; i <= NumRecords; ++i)
                    {
                        ReadRecordHeader(fx, ref shpRecordHeader);

                        if (debug != null)
                        {
                            AddDebug(" ");
                            AddDebug("Record Num: " + Convert.ToString(i) + " Offset: " + Convert.ToString(2 * shpRecordHeader.RecordNumber) +
                                     " Length: " + Convert.ToString(shpRecordHeader.RecordLength));
                        }

                        f.Position = 2 * shpRecordHeader.RecordNumber;
                        ReadRecordHeader(f, ref shpRecordHeader);

                        if (debug != null)
                        {
                            AddDebug("Record Num: " + Convert.ToString(shpRecordHeader.RecordNumber));
                        }

                        BinaryReader bin = new BinaryReader(f);

                        ShapeType = bin.ReadInt32();
                        LoadShape(bin, Table, Series, FieldName, FieldValue, i - 1);
                    }

                    Series.EndUpdate();
                    Series.Chart.AutoRepaint = true;
                    //Series.Chart.Invalidate();
                }
                finally
                {
                    fx.Close();
                }
            }
            finally
            {
                f.Close();
            }
        }