GIS一般都具有属性查询和空间查询的功能,今天又抽空用sharpMap在之一的基础上写了个基本属性信息查询的实例,实现的功能就是通过选定图层,输入查询条件,查询所选图层中满足条件的要素,并显示基本信息。以下是效果图:

以下是源代码
///////////////////////////////////////
按钮点击事件
protected void btQuery_Click(object sender, EventArgs e)              //属性查询
    {
        if (this.txtQuery.Text.Trim() == "") return;
        //获取图层名
        string lyrName = this.DDLayers.Items[this.DDLayers.SelectedIndex].Value+".shp";
        if (szmap == null) return;
        //获取图层
        SharpMap.Layers.VectorLayer lyr = szmap.GetLayerByName(lyrName) as SharpMap.Layers.VectorLayer ;
        if (lyr == null) return;
        if (!lyr.DataSource.IsOpen) lyr.DataSource.Open();
        //获取图层的所有元素
        //法一:通过获取地图全图范围内的要素,也就是所有的要素,这种方法需要执行几何要素的相交判断
        //SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet();
        //lyr.DataSource.ExecuteIntersectionQuery(lyr.Envelope, ds);
        //法二:为shapefile类添加一个方法GetFeaturesDataSet(),直接获取所有的要素,不需要进行几何要素的相交判断
        SharpMap.Data.Providers.ShapeFile shapefile = (SharpMap.Data.Providers.ShapeFile)lyr.DataSource;
        SharpMap.Data.FeatureDataSet ds = shapefile.GetFeaturesDataSet();

        lyr.DataSource.Close();
        if (ds == null) return;
        System.Data.DataTable dt=new DataTable();
        System.Data.DataColumn dc=new DataColumn("名字",typeof(System.String));
        dt.Columns.Add(dc);
        foreach (SharpMap.Data.FeatureDataRow row in ds.Tables[0])
        {
            if (row["NAME"].ToString().Contains(this.txtQuery.Text.Trim()))
            {
                System.Data.DataRow r = dt.NewRow();
                r[0] = row["NAME"].ToString();
                dt.Rows.Add(r);
            }
        }
        this.gvResults.DataSource = dt;
        this.gvResults.DataBind();
        //重新生成地图
        this.GenerateMap();
    }
对于法二,我在sharpMap的ShapeFile类中添加了一个方法以获取全部要素
 public FeatureDataSet GetFeaturesDataSet()
        {
            FeatureDataSet featDataSet = new FeatureDataSet();
            FeatureDataTable featDataTable = null;
            if(!this.IsOpen )
                throw (new ApplicationException("An attempt was made to read from a closed datasource"));
            if(this.dbaseFile ==null)
                throw (new ApplicationException("An attempt was made to read DBase data from a shapefile without a valid .DBF file"));
            //获取feature数量
            int featCount = this.GetFeatureCount();
            featDataTable = this.dbaseFile.NewTable;
            //获取feature
            for (uint i = 0; i < featCount; i++)
            {
                FeatureDataRow r= this.GetFeature(i,featDataTable);
                featDataTable.AddRow(r);
            }
            featDataSet.Tables.Add(featDataTable);
            return featDataSet ;
        }

实例均是在上一个学习笔记的基础上做的,这里的属性查询功能比较简单,主要提供查询的原理,如果有必要,可以通过需要进行相应的改写。
powered by SharpMap v0.9


posted on 2008-07-04 17:34  SurfInGis  阅读(3697)  评论(5编辑  收藏  举报