예제 #1
0
        /// <summary>
        /// Gets the feature at the specified Object ID
        /// </summary>
        /// <param name="oid">Row index. Zero-based.</param>
        /// <param name="table">The feature table containing the schema used to
        /// read the row.</param>
        /// <returns>The feature row for the given row index</returns>
        /// <exception cref="InvalidDbaseFileOperationException">
        /// Thrown if this reader is closed (check <see cref="IsOpen"/> before calling),
        /// or if the column is an unsupported type.
        /// </exception>
        /// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="oid"/>
        /// &lt; 0 or <paramref name="oid"/> &gt;= <see cref="RecordCount"/></exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="table"/> is
        /// null</exception>
        /// <exception cref="ObjectDisposedException">Thrown when the method is called and
        /// Object has been disposed</exception>
        internal IFeatureDataRecord GetAttributes(UInt32 oid, FeatureDataTable <UInt32> table)
        {
            checkState();

            if (!_isOpen)
            {
                throw new InvalidDbaseFileOperationException("An attempt was made to read " +
                                                             "from a closed dBase file");
            }

            if (oid <= 0 || oid > RecordCount)
            {
                throw new ArgumentOutOfRangeException("Invalid DataRow requested " +
                                                      "at index " + oid);
            }

            if (_reader.IsRowDeleted(oid)) // is record marked deleted?
            {
                return(null);
            }

            if (table != null)
            {
                FeatureDataRow <UInt32> dr = table.NewRow(oid);

                foreach (DbaseField field in Header.Columns)
                {
                    try
                    {
                        dr[field.ColumnName] = _reader.GetValue(oid, field);
                    }
                    catch (NotSupportedException)
                    {
                        String message = String.Format("Column type {0} is not supported.",
                                                       field.DataType);
                        throw new InvalidDbaseFileOperationException(message);
                    }
                }

                return(dr);
            }
            else
            {
                ShapeFileFeatureDataRecord dr = new ShapeFileFeatureDataRecord(Header.Columns);
                dr.SetColumnValue(0, oid);
                dr.SetColumnValues(1, 1 + Header.Columns.Count, _reader.GetValues(oid));//jd: added 1 to Header.Columns.Count because we are offsetting the start index by one (OID is stored at zero)

                return(dr);
            }
        }
예제 #2
0
        public void ExecuteRobustIntersectionQuery(ShapeFile shapeFile, Envelope bbox, FeatureDataSet ds)
        {
            //Use the spatial index to get a list of features whose boundingbox intersects bbox
            var objectlist = shapeFile.GetObjectIDsInView(bbox);

            Stream stream    = new FileStream(shapeFile.Filename, FileMode.Open, FileAccess.Read);
            string dbfFile   = Path.ChangeExtension(shapeFile.Filename, ".dbf");
            string indexFile = Path.ChangeExtension(shapeFile.Filename, ".shx");

            DbaseReader dbaseReader = null;

            if (File.Exists(dbfFile))
            {
                dbaseReader = new DbaseReader(dbfFile);
                dbaseReader.Open();
            }

            using (BinaryReader br = new BinaryReader(stream))
            {
                using (DbaseReader dbaseFile = dbaseReader)
                {
                    var dt = dbaseFile.NewTable;
                    dt.BeginLoadData();

                    for (var i = 0; i < objectlist.Count; i++)
                    {
                        FeatureDataRow fdr;
                        try
                        {
                            var geometry = shapeFile.GetFeature(objectlist[i]).Geometry;
                            //fdr.Geometry = ReadGeometry(objectlist[i], br, dbaseFile);
                            fdr          = (FeatureDataRow)dt.LoadDataRow(dbaseFile.GetValues(objectlist[i]), true);
                            fdr.Geometry = geometry;
                        }
                        catch (Exception)
                        {
                            Debug.WriteLine("ERROR: Bad geometry for feature at index " + objectlist[i]);
                        }
                    }

                    dt.EndLoadData();
                    dt.AcceptChanges();

                    ds.Tables.Add(dt);
                    dbaseFile.Close();
                }
                br.Close();
            }
        }
예제 #3
0
        public void TestDbaseReader()
        {
            using (DbaseReader reader = new DbaseReader(GetTestFile()))
            {
                reader.Open();

                int numberOfRecords = GetNumberOfRecords(reader);

                // read entire file
                for (uint rowid = 0; rowid < numberOfRecords; rowid++)
                {
                    var values = reader.GetValues(rowid);
                }
            }
        }
예제 #4
0
        public void TestDbaseReader()
        {
            using (DbaseReader reader = new DbaseReader(TestUtility.GetPathToTestFile("SPATIAL_F_SKARVMUFF.dbf")))
            {
                reader.Open();

                int numberOfRecords = GetNumberOfRecords(reader);

                // read entire file
                for (uint rowid = 0; rowid < numberOfRecords; rowid++)
                {
                    var values = reader.GetValues(rowid);
                }
            }
        }
예제 #5
0
        public void TestDbaseReader()
        {
            using (DbaseReader reader = new DbaseReader(GetTestFile()))
            {
                reader.Open();

                int numberOfRecords = GetNumberOfRecords(reader);

                // read entire file
                for (uint rowid = 0; rowid < numberOfRecords; rowid++)
                {
                    var values = reader.GetValues(rowid);
                }
            }
        }
예제 #6
0
        public void TestDbaseBinaryTree()
        {
            using (DbaseReader reader = new DbaseReader(GetTestFile()))
            {
                reader.Open();

                int numberOfRecords = GetNumberOfRecords(reader);

                // Create index on OBJECTNO column
                var indexOBJECTNO = reader.CreateDbfIndex <int>(0);

                // Test if index contains all records
                Assert.AreEqual(numberOfRecords, indexOBJECTNO.InOrder.Count());

                // Test searching for all records individually
                for (uint rowid = 0; rowid < numberOfRecords; rowid++)
                {
                    int value = (int)reader.GetValues(rowid)[1];
                    Assert.AreEqual(1, indexOBJECTNO.Find(value).Count());
                }
            }
        }
예제 #7
0
        public void TestDbaseBinaryTree()
        {
            using (DbaseReader reader = new DbaseReader(GetTestFile()))
            {
                reader.Open();

                int numberOfRecords = GetNumberOfRecords(reader);

                // Create index on OBJECTNO column
                var indexOBJECTNO = reader.CreateDbfIndex<int>(0);

                // Test if index contains all records
                Assert.AreEqual(numberOfRecords, indexOBJECTNO.InOrder.Count());

                // Test searching for all records individually
                for (uint rowid = 0; rowid < numberOfRecords; rowid++)
                {
                    int value = (int)reader.GetValues(rowid)[1];
                    Assert.AreEqual(1, indexOBJECTNO.Find(value).Count());
                }
            }
        }
        private List<Tuple<string, string>> GetNameAndCode(int count)
        {
            // Generate Tuple (ideally struct), containing names and codes.
            List<Tuple<string,string>> nameAndCode;
            using (DbaseReader db = new DbaseReader (DbfFileName)) {
                db.Open ();

                int start = 0;
                //int count = stateBorders.Count ();
                var regionIdx = Enumerable.Range (start, count);

                // struct would look nicer here.
                nameAndCode = regionIdx.Select (iRegion => Tuple.Create (
                    (string)((object[])db.GetValues ((uint)iRegion)) [1],
                    (string)((object[])db.GetValues ((uint)iRegion)) [5]
                )).ToList ();
                db.Close ();

            }
            return nameAndCode;
        }