예제 #1
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();
            }
        }