首页 / 浏览问题 / 组件GIS / 问题详情
wpf中怎么在实现地图鼠标点击事件
20EXP 2025年07月08日
问题描述:wpf中加入底图,之后底图上添加shp文件,该shp文件都是线,该怎么点击某条线显示对应的属性值,对应的地图鼠标点击事件用的哪个方法

1个回答

您好,

        SuperMap iObjects .NET 组件的 MapControl 控件提供了 GeometrySelected 事件,当鼠标在地图窗口点击选中矢量数据时,会触发该事件,可以在该事件中获取选中数据对应的属性值。

希望可以帮到您。

2,323EXP 2025年07月09日
那怎么获取点击单条线上的属性值,比如这条线的始发站或者过路站
可以在选中事件中,通过 MapControl 控件对象获取当前选中的记录集(参考 MapControl.Map.FindSelection(true)[0].ToRecordset()),获取到记录集 Recordset 后,就可以通过 Recordset 的 FieldInfos 和 GetValue 来获取对应的字段值。

我用上面的方法查询后只能获取到一列name的值,其他字段对应值获取不到,是哪块写的不对吗?

Selection selections = mapControl.Map.FindSelection(true)[0];
if (selections == null && selections.Count == 0)
{
    return;
}
// 获取当前线图层的选择记录集
Recordset recordset = selections.ToRecordset();
if (recordset == null || recordset.RecordCount == 0)
{
    return;
}
using (recordset)
{
    //移动到第一条记录上
    recordset.MoveFirst();
    //2. 创建 DataTable
    DataTable dataTable = new DataTable("test");

    //3.添加列到 DataTable
    SuperMap.Data.FieldInfos info=recordset.GetFieldInfos();
    foreach (SuperMap.Data.FieldInfo field in info)
    {
        dataTable.Columns.Add(field.Name);
    }

    // 4.获取要素集

    for (int i = 0; i < recordset.RecordCount; i++)
    {
        // 5.创建新行
        DataRow row = dataTable.NewRow();

        //6.填充行数据
        foreach (SuperMap.Data.FieldInfo field in info)
        {
            row[field.Name] = recordset.GetObject(field.Name);
        }
        //7.添加行到 DataTable
        dataTable.Rows.Add(row);
    }
}

建议先把 filedinfos 的字段名全部打印出来,看有多少个字段,其次再调用 recordset.GetValue 接口,传入字段名,获取对应的字段值。

若有字段名,无字段值,说明该记录的字段值为空,可以在 iDesktopX 中打开该数据集浏览属性表检查。
好的,现在属性列的值都取到了,但还有个问题,就是在底图上添加shp文件,这个文件是多个线,当在界面上点击某条线时将获取到的属性列的值显示到弹框,现在的问题是用 GeometrySelected 事件能获取到属性列的值,但这个事件没有获取鼠标位置的属性,弹出的框无法显示到某个位置,用MouseClick时能获取到点击的位置,不知道怎么将两者结合,现在界面上左键点击两次才能弹出,测试后发现一次只能执行一个事件,先执行GeometrySelected后执行MouseClick;还有右键点击时也要获取值,测试后发现GeometrySelected只有点击左键才会执行,右键不起作用,还有没有别的方式可以实现的
鼠标右键点击只能通过 MouseClick 来获取,获取后可通过 Map.PixelToMap 接口将屏幕坐标转换成地图坐标。

为方便其他客户可准确查询到相似问题的解决方案,新的问题请重新发帖提问。
...