首页 / 浏览问题 / 其他 / 问题详情
FindSelection总是无法选中
gyy
13EXP 2017年08月04日
我用C#进行开发,程序初始化时需要先将几个点绘制在地图上,然后再地图中用鼠标选中几何图形,总是无法选中。

public void AddPointForIni()
        {           
            Recordset recordset = null;
            try
            {
                //获取数据源
                Datasource datasource = m_workspace.Datasources[0];           
                //新建数据集
                String name = "person";
                //获取数据集
                DatasetVector dataset = m_workspace.Datasources[0].Datasets[name] as DatasetVector;
                if(dataset==null){
                    //设置矢量数据集的信息
                    DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
                    datasetVectorInfo.Type = DatasetType.Point;
                    datasetVectorInfo.IsFileCache = true;
                    datasetVectorInfo.Name = name;
                    //创建矢量数据集
                    datasource.Datasets.Create(datasetVectorInfo);
                }
                //获取所有记录集
                recordset = dataset.GetRecordset(false,CursorType.Dynamic);
                recordset.DeleteAll();
                //向记录集中添加点一个几何对象               
                double x = 12571750.9161018;
                double y = 2880758.72201756;                
                GeoPoint geoPoint1 = new GeoPoint(x, y);                
                recordset.AddNew(geoPoint1);
                recordset.Update();
                //添加字段
                FieldInfos m_fieldInfos = dataset.FieldInfos;
                if (m_fieldInfos.IndexOf("uri") == -1)
                {
                    // 实例化一个字段信息对象,对其进行设置
                    FieldInfo fieldInfo = new FieldInfo();
                    fieldInfo.Name = "uri";
                    fieldInfo.Caption = "uri";
                    fieldInfo.DefaultValue = "sip:@test.com";
                    fieldInfo.Type = FieldType.Text;
                    fieldInfo.IsRequired = false;

                    // 将字段 "uri" 添加到数据集 dataset 中
                    FieldInfos fieldInfos = dataset.FieldInfos;
                    fieldInfos.Add(fieldInfo);
                    fieldInfo.Dispose();
                }                
                Layer personLayer = m_mapControlMain.Map.Layers.Add(dataset, true);
                m_mapControlMain.Map.EnsureVisible(personLayer);
                m_mapControlMain.Map.Refresh();
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.Message);
            }
            finally
            {
                // recordset 使用完毕后Dispose
                if (recordset != null)
                {
                    recordset.Dispose();                    
                }
            }
        }

然后我在鼠标MouseUp注册事件:m_mapControlMain.MouseUp += new MouseEventHandler(m_mapControlMain_MouseUp);

void m_mapControlMain_MouseUp(object sender, MouseEventArgs e){

if (m_mapControlMain.Action == SuperMap.UI.Action.Select2){

Selection[] selection = m_mapControlMain.Map.FindSelection(true);}

}

selection 的长度总是为0,是怎么回事呢?

1个回答

您好,您是通过点选还是框选的对象啊?选中之后,地图上的对象高亮了吗?(默认会高亮)
胡林
1
5,985EXP 2017年08月07日
框选的,但是事件是绑定在鼠标mouseup事件的,这个会不会有什么问题呢?选了之后也没有高亮,所以我怀疑我应该是缺了什么东西

Layer.IsSelectable 属性,设置为true,让图层可选择,鼠标状态切换成select2

 

已经做了,还是不行
用Datasets.Contains 方法来判断是否有指定名称的数据集,如果没有,则创建该数据集,创建好之后,获取到该数据集,再进行下面的操作。
好的,我试试看,谢谢您
不好意思还得请教您,我现在一切操作之后,还是无法选中,但是在SuperMap iDesktop中打开工作空间,选择的时候,选中的点会显示高亮,在我自己的应用中选择不会显示高亮,选中集长度也为0,我的选中程序如下,能否麻烦您帮忙看一下。

//获取数据源
Datasource datasource = m_workspace.Datasources[0];   
System.Console.WriteLine("is exist person dataset:" + datasource.Datasets.Contains("person"));
if (m_mapControlMain.Action == SuperMap.UI.Action.Select2)
{               
   //获取选择集
     Selection[] selection = m_mapControlMain.Map.FindSelection(true);      //判断选择集是否为空
      if (selection == null || selection.Length == 0)
      {
         MessageBox.Show("请选择要查询属性的空间对象");
          return;
      }
 }
你点已经添加上去了是吧,此时写代码m_mapControlMain.Action =SuperMap.UI.Action.Select2,鼠标光标就是选择状态啊,应该就可以选中的
如果您那边方便远程的话,私信我一下您的联系方式,我远程看看吧,我这边也重现不出来问题
非常感谢您的帮助,我把您的方法总结一下贴在下面,方便后来者。

1.需要在添加图层时,图层刷新之前添加 m_mapControlMain.Action = SuperMap.UI.Action.Select2;

2.需要在选中的时候从记录集中获取几何对象,具体代码是:

 if (m_mapControlMain.Action == SuperMap.UI.Action.Select2)
 {               
    //获取选择集
   Selection[] selection = m_mapControlMain.Map.FindSelection(true);
   if (selection == null || selection.Length == 0)
   {    
     MessageBox.Show("请选择要查询属性的空间对象");
     return;
    }
    //选择集转换为记录集
    Recordset recordset = selection[0].ToRecordset();    
    for (int i = 0; i < recordset.RecordCount; i++)
    {
      recordset.MoveTo(i);
      Geometry geo = recordset.GetGeometry();
      GeoPoint point1 = recordset.GetGeometry() as GeoPoint;
    }                
  }
...