前言
上一篇博文简单介绍了有关地图加载与地图浏览的相关操作,这个部分主要认识下属性查图与图查属性的相关操作。
属性查图是指通过查询地图上的特定属性信息来获取相关的空间数据。用户可以通过属性查图来查找特定地点的地理特征等信息。
图查属性通常是指在地图或空间数据集中选择特定的地理要素(如点、线、面等)并查看其相关属性信息。这可以包括地理要素的名称、坐标、面积、长度、人口统计数据等。通过图查属性,用户可以了解地图中的各种地理要素的详细信息,这对于地理分析、规划和决策制定非常重要。
一、有关常用类说明
Selection类 | 选择集类,用于处理地图上被选中的对象。 |
Recordset类 | 记录集类,实现对矢量数据集中的数据进行操作。 |
QueryParameter类 | 查询参数类,用于描述一个条件查询的限制条件,如所包含的SQL语句,游标方式,空间数据的位置关系条件设定等。 |
二、有关常用方法及属性说明
Map.FindSelection() | 返回当前地图的选择集。返回的选择集为地图中所有图层的选择集的副本的集合。当参数hasGeometrySelected为true时,返回所有有选择对象的图层的选择集,否则返回所有图层的选择集。 |
DatasetVector.Query() | 根据指定信息对矢量数据集做查询。 |
Selection.ToRecordset() | 用于把选择对象转化为记录集,只有将选择集转化为记录集后才能对其数据进行操作。 |
Selection.FromRecordset() | 用于把一个记录集转化为选择集,即记录集所对应的对象全部呈选中状态。 |
Recordset.GetFieldInfos() | 返回记录集里的字段信息集合对象。 |
Recordset.GetFieldValue() | 根据字段序号指定字段,获得数据集的属性数据表中当前记录相应字段的值。 |
QueryParameter.AttributeFilter() | 获取或设置查询所构建的 SQL 条件语句。 |
三、界面设计
(1)添加按钮
在原有的基础上,在toolStirp工具栏中添加如下button,并修改button的Image属性,接着添加Label和Textbox:
(2)设置新建窗体
在解决方案资源管理器中右键单击项目,然后选择“添加” -> “窗体”。在“添加新项”对话框中,选择“Windows 窗体”模板,并为新窗体指定一个名称,然后单击“添加”按钮。打开工具箱,拖动控件,进行如下窗体设计:
四、功能实现
(1)属性查图
private void SQLquery_Click(object sender, EventArgs e)
{
//判断工具条文本框的输入内容是否为空
if (toolStripTextBox1.Text.Length == 0)
{
MessageBox.Show("查询信息不能为空");
return;
}
//定义图层个数
Int32 layerCount = D_mapControl.Map.Layers.Count;
//判断当前地图窗口中是否有打开的图层
if (layerCount == 0)
{
MessageBox.Show("请先打开一个矢量数据集!");
return;
}
//定义查询条件信息;
QueryParameter queryParameter = new QueryParameter();
queryParameter.AttributeFilter = toolStripTextBox1.Text;
queryParameter.CursorType = CursorType.Static;
Boolean hasGeometry = false;
//遍历每一个图层,实现多图层查询
foreach (Layer layer in D_mapControl.Map.Layers)
{
//得到矢量数据集并强制转换为矢量数据集类型
DatasetVector dataset = layer.Dataset as DatasetVector;
if (dataset == null)
{
continue;
}
//通过查询条件对矢量数据集进行查询,从数据集中查询出属性数据
Recordset recordset = dataset.Query(queryParameter);
//判断是否有查询结果
if (recordset.RecordCount > 0)
{
hasGeometry = true;
}
//把查询得到的数据加入到选择集中
Selection selection = layer.Selection;
selection.FromRecordset(recordset);
recordset.Dispose();
}
//没有查询结果,弹出提示
if (!hasGeometry)
{
MessageBox.Show("没有符合查询条件的结果或查询条件有误,请重新确认后查询!");
}
//当可创建对象使用完毕后,释放所占用的内部资源
queryParameter.Dispose();
//刷新地图窗口显示
D_mapControl.Refresh();
//将hasGeometry重置为false,以备下一次查询使用
hasGeometry = false;
}
(2)图查属性
//修改地图控件变量为全局静态变量
public static MapControl D_mapControl;
//图查属性主窗体代码
private void queryattribute_Click(object sender, EventArgs e)
{
Attribute attribute = new Attribute();
attribute.ShowDialog();
}
//图查属性子窗体代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SuperMap.Data;
using SuperMap.Mapping;
using SuperMap.UI;
using SuperMap.Realspace;
using System.IO;
namespace WindowsFormsApp1
{
public partial class Attribute : Form
{
public Attribute()
{
InitializeComponent();
//获取选择集
Selection[] selection = Form1.D_mapControl.Map.FindSelection(true);
//判断选择集是否为空
if (selection == null || selection.Length == 0)
{
MessageBox.Show("请选择要查询属性的空间对象");
return;
}
//将选择集转换为记录
Recordset recordset = selection[0].ToRecordset();
//清空数据格网视图控件的列和行
this.dataGridView1.Columns.Clear();
this.dataGridView1.Rows.Clear();
//循环遍历记录集的字段
for (int i = 0; i < recordset.FieldCount; i++)
{
//定义并获得字段名称
String fieldName = recordset.GetFieldInfos()[i].Name;
//将得到的字段名称添加到数据格网视图控件的列中
this.dataGridView1.Columns.Add(fieldName, fieldName);
}
//初始化行
DataGridViewRow row = null;
//根据选中记录的个数,将选中对象的信息添加到数据格网视图控件中显示
while (!recordset.IsEOF)
{
row = new DataGridViewRow();
for (int i = 0; i < recordset.FieldCount; i++)
{
//定义并获得字段值
Object fieldValue = recordset.GetFieldValue(i);
//将字段值添加到数据格网视图控件中对应的位置
DataGridViewTextBoxCell dgvtbcell = new DataGridViewTextBoxCell();
if (fieldValue != null)
{
dgvtbcell.ValueType = fieldValue.GetType();
dgvtbcell.Value = fieldValue;
}
row.Cells.Add(dgvtbcell);
}
this.dataGridView1.Rows.Add(row);
recordset.MoveNext();
}
//更新数据格网视图控件
this.dataGridView1.Update();
//释放资源,关闭记录集对象
recordset.Dispose();
}
}
}
五、主窗体完整实现代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SuperMap.Data;
using SuperMap.Mapping;
using SuperMap.UI;
using SuperMap.Realspace;
using System.IO;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private Workspace D_workspace;
private WorkspaceControl D_workspaceControl;
public static MapControl D_mapControl;
private SceneControl D_sceneControl;
private LayersControl D_layersControl;
private WorkspaceConnectionInfo D_connectionInfo;
public Form1()
{
String mail = ""; // 需要替换为自己的SuperMap账号
String password = "";
bool login = SuperMap.Data.CloudLicense.Login(mail, password);
InitializeComponent();
D_workspace = new Workspace();
D_workspaceControl = new WorkspaceControl();
//控件始终填充整个父容器
D_workspaceControl.Dock = DockStyle.Fill;
//将指定的控件添加到panel1控件中
splitContainer1.Panel1.Controls.Add(D_workspaceControl);
D_layersControl = new LayersControl();
D_layersControl.Dock = DockStyle.Fill;
splitContainer1.Panel2.Controls.Add(D_layersControl);
D_mapControl = new MapControl();
D_mapControl.Dock = DockStyle.Fill;
//将指定的控件添加到panel1控件中
panel3.Controls.Add(D_mapControl);
D_sceneControl = new SceneControl();
D_sceneControl.Dock = DockStyle.Fill;
panel4.Controls.Add(D_sceneControl);
//为 D_workspaceControl控件的WorkspaceTree控件的NodeMouseClick事件添加了一个名为tree_NodeMouseClick的事件处理程序。
//当单击WorkspaceTree控件的节点时,将触发 tree_NodeMouseClick 事件处理程序,从而执行相关的操作或代码逻辑。
this.D_workspaceControl.WorkspaceTree.NodeMouseClick += new TreeNodeMouseClickEventHandler(tree_NodeMouseClick);
}
private void Form1_Load(object sender, EventArgs e)
{
//工作空间和控件联动
D_workspaceControl.WorkspaceTree.Workspace = D_workspace;
D_mapControl.Map.Workspace = D_workspace;
D_sceneControl.Scene.Workspace = D_workspace;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
D_mapControl.Dispose();
D_layersControl.Dispose();
D_sceneControl.Dispose();
D_workspaceControl.Dispose();
D_workspace.Close();
D_workspace.Dispose();
}
private void OpenWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.openFileDialog1.Title = "打开工作空间";
this.openFileDialog1.FileName = "";
//对打开文件进行格式过滤
this.openFileDialog1.Filter = "工作空间文件 (*.smwu)|*.smwu|工作空间文件 (*.sxwu)|*.sxwu";
//返回文件结果
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//关闭存在的工作空间
D_workspace.Close();
//将文件名作为工作空间名称
string fileName = openFileDialog1.FileName;
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo(fileName);
//打开工作空间
D_workspace.Open(file);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
private void SaveWorkspace_Click(object sender, EventArgs e)
{
if (D_workspace.Save())
{
MessageBox.Show("工作空间保存成功!", "提示");
}
else
{
MessageBox.Show("工作空间保存失败!", "提示");
return;
}
}
private void SaveAsWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.saveFileDialog1.Title = "保存工作空间";
//对另存文件进行格式过滤
this.saveFileDialog1.Filter = "SuperMap工作空间文件(*.smwu)|*.smwu|SuperMap工作空间文件(*.sxwu)|*.sxwu";
if (this.saveFileDialog1.FileName != null && this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//从 SaveFileDialog控件中获取用户选择的文件名,并去除文件扩展名后赋值给变量name
//这个操作通常用于获取用户选择的文件的纯文件名,而不包括文件的扩展名部分
String name = System.IO.Path.GetFileNameWithoutExtension(this.saveFileDialog1.FileName);
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo();
file.Server = this.saveFileDialog1.FileName;
file.Password = "";
//根据 SaveFileDialog 控件的 FilterIndex属性的值来判断文件的类型
if (this.saveFileDialog1.FilterIndex == 1)
{
file.Type = WorkspaceType.SMWU;
}
else
{
file.Type = WorkspaceType.SXWU;
}
D_workspace.Caption = name;
//另存于指定路径
if (D_workspace.SaveAs(file))
{
MessageBox.Show("工作空间另存成功!");
}
else
{
MessageBox.Show("另存工作空间失败!", "提示");
return;
}
}
}
private void CloseWorkspace_Click(object sender, EventArgs e)
{
D_mapControl.Map.Close();
D_sceneControl.Scene.Close();
D_layersControl.Refresh();
D_mapControl.Refresh();
D_sceneControl.Refresh();
D_workspace.Close();
this.D_workspaceControl.WorkspaceTree.Refresh();
}
private void tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
//单击Workspace节点时,弹出一个名为 contextMenuStrip_workspace的右键菜单,选择相应的操作。
WorkspaceTreeNodeBase treenode = e.Node as WorkspaceTreeNodeBase;
if (treenode.NodeType == WorkspaceTreeNodeDataType.Workspace)
{
treenode.ContextMenuStrip = contextMenuStrip_workspace;
}
else if(treenode.NodeType == WorkspaceTreeNodeDataType.Datasources)
{
treenode.ContextMenuStrip = contextMenuStrip_datasource;
}
else if(treenode.NodeType == WorkspaceTreeNodeDataType.Datasource)
{
treenode.ContextMenuStrip = contextMenuStrip_childdatasource;
}
else if (treenode.NodeType == WorkspaceTreeNodeDataType.MapName)
{
treenode.ContextMenuStrip = contextMenuStrip_map;
}
//在用户右键单击数据集节点时显示特定的上下文菜单选项
this.D_workspaceControl.WorkspaceTree.NodeContextMenuStrips[WorkspaceTreeNodeDataType.Dataset] = contextMenuStrip_dataset;
}
private void CreateDatasource_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Title = "新建文件型数据源";
saveFileDialog1.CheckPathExists = true;
saveFileDialog1.AddExtension = true;
saveFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取文件名并且去掉文件扩展名
String name = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName);
for (int i = 0; i < D_workspace.Datasources.Count; i++)
{
//比较字符串"name"和数据源的别名是否相等
bool test = (String.Compare(name, D_workspace.Datasources[i].Alias) == 0);
if (test)
{
MessageBox.Show("指定数据源名称已存在!");
return;
}
}
//DatasourceConnectionInfo 构造函数(String, String, String)
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo(name, name, "");
//设置UDB文件的绝对路径,当绝对路径的长度超过 UTF-8 编码格式的260字节长度,该数据源无法打开
dsconInfo.Server = saveFileDialog1.FileName;
// 根据文件的扩展名来确定使用的引擎类型
if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
{
dsconInfo.EngineType = EngineType.UDB;
}
else
{
dsconInfo.EngineType = EngineType.UDBX;
}
//根据指定的数据源连接信息创建数据源
D_workspace.Datasources.Create(dsconInfo);
}
}
private void OpenFileDatasource_Click(object sender, EventArgs e)
{
if (D_workspace != null)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "SuperMap UDB文件(*.udb)|*.udb|SuperMap UDBX文件(*.udbx)|*.udbx";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
dsconInfo.Server = openFileDialog1.FileName;
dsconInfo.Alias = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
bool test = D_workspace.Datasources.Contains(dsconInfo.Alias);
if (test)
{
MessageBox.Show("该数据源已打开!");
return;
}
dsconInfo.Password = "";
// 根据文件的扩展名来确定使用的引擎类型
if (Path.GetExtension(saveFileDialog1.FileName) == ".udb")
{
dsconInfo.EngineType = EngineType.UDB;
}
else
{
dsconInfo.EngineType = EngineType.UDBX;
}
D_workspace.Datasources.Open(dsconInfo);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
}
private void OpenDatabaseDatasource_Click(object sender, EventArgs e)
{
if (D_workspace != null)
{
DatasourceConnectionInfo dsconInfo = new DatasourceConnectionInfo();
dsconInfo.EngineType = EngineType.PostgreSQL;
//自行设置服务器名称、数据库名称、用户名和密码等连接信息
dsconInfo.Server = "";
dsconInfo.Database = "";
dsconInfo.User = "";
dsconInfo.Password = "";
D_workspace.Datasources.Open(dsconInfo);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
private void CloseDatasource_Click(object sender, EventArgs e)
{
//判断工作空间树中选择的节点是否是数据源节点的子节点
if (this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent == this.D_workspaceControl.WorkspaceTree.DatasourcesNode)
{
D_workspace.Datasources[this.D_workspaceControl.WorkspaceTree.SelectedNode.Text].Close();
this.D_workspaceControl.WorkspaceTree.Refresh();
}
else
{
MessageBox.Show("请先选中要关闭的数据源!");
}
}
private void createPointDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
string createpoint_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dspointdataset = this.D_workspace.Datasources[createpoint_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
string PointDatasetName = name.text;
if (PointDatasetName == null)
{
return;
}
//判断数据集名称是否合法
bool datasetlsAvailable = Dspointdataset.Datasets.IsAvailableDatasetName(PointDatasetName);
//如果不合法则在名称后面加上"_1"
if (!datasetlsAvailable)
{
PointDatasetName = PointDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的名称、类型等信息
DatasetVectorInfo info = new DatasetVectorInfo();
info.Name = PointDatasetName;
info.Type = DatasetType.Point;
DatasetVector pointDataset = Dspointdataset.Datasets.Create(info);
if (pointDataset == null)
{
MessageBox.Show("创建点数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
private void createLineDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
string createline_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dslinedataset = this.D_workspace.Datasources[createline_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
string LineDatasetName = name.text;
if (LineDatasetName == null)
{
return;
}
//判断数据集名称是否合法
bool datasetlsAvailable = Dslinedataset.Datasets.IsAvailableDatasetName(LineDatasetName);
//如果不合法则在名称后面加上"_1"
if (!datasetlsAvailable)
{
LineDatasetName = LineDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的名称、类型等信息
DatasetVectorInfo info = new DatasetVectorInfo();
info.Name = LineDatasetName;
info.Type = DatasetType.Line;
DatasetVector lineDataset = Dslinedataset.Datasets.Create(info);
if (lineDataset == null)
{
MessageBox.Show("创建线数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
private void createRegionDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
string createregion_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dsregiondataset = this.D_workspace.Datasources[createregion_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
string RegionDatasetName = name.text;
if (RegionDatasetName == null)
{
return;
}
//判断数据集名称是否合法
bool datasetlsAvailable = Dsregiondataset.Datasets.IsAvailableDatasetName(RegionDatasetName);
//如果不合法则在名称后面加上"_1"
if (!datasetlsAvailable)
{
RegionDatasetName = RegionDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的名称、类型等信息
DatasetVectorInfo info = new DatasetVectorInfo();
info.Name = RegionDatasetName;
info.Type = DatasetType.Region;
DatasetVector regionDataset = Dsregiondataset.Datasets.Create(info);
if (regionDataset == null)
{
MessageBox.Show("创建线数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
private void createGridDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的文本
String creategrid_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Text;
//根据文本获取对应的数据源
Datasource Dsgriddataset = this.D_workspace.Datasources[creategrid_Alias];
//弹出一个对话框输入数据集的名称
Name name = new Name();
name.ShowDialog();
String GridDatasetName = name.text;
//判断数据集名称是否合法
bool datasetlsAvailable = Dsgriddataset.Datasets.IsAvailableDatasetName(GridDatasetName);
if (!datasetlsAvailable)
{
GridDatasetName = GridDatasetName + "_1";
}
//创建一个数据集信息对象,并设置数据集的像素分块、宽、高、无值等信息
DatasetGridInfo info = new DatasetGridInfo();
info.Name = GridDatasetName;
info.BlockSizeOption = BlockSizeOption.BS_128;
info.Height = 200;
info.Width = 200;
info.NoValue = -999;
info.PixelFormat = PixelFormat.Single;
info.EncodeType = EncodeType.SGL;
DatasetGrid gridDataset = Dsgriddataset.Datasets.Create(info);
if (gridDataset == null)
{
MessageBox.Show("创建栅格数据集失败!", "提示");
return;
}
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
private void copyDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的父节点的文本
String copydataset_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent.Text;
//根据文本获取对应的数据源
Datasource dscopydataset = this.D_workspace.Datasources[copydataset_Alias];
//选定的节点的文本获取对应的数据集
Dataset selectDataset = dscopydataset.Datasets[this.D_workspaceControl.WorkspaceTree.SelectedNode.Text];
//获取一个数据源中未被使用的数据集的名称
String newName = dscopydataset.Datasets.GetAvailableDatasetName(this.D_workspaceControl.WorkspaceTree.SelectedNode.Text);
//使用获取的新名称和选定数据集的编码类型
Dataset desDataset = dscopydataset.CopyDataset(selectDataset, newName, selectDataset.EncodeType);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
private void deleteDataset_Click(object sender, EventArgs e)
{
//从工作空间树中获取选定的节点的父节点的文本
String deletedataset_Alias = this.D_workspaceControl.WorkspaceTree.SelectedNode.Parent.Text;
//根据文本获取对应的数据源
Datasource dsdeletedataset = this.D_workspace.Datasources[deletedataset_Alias];
//根据指定的名称来删除数据集
dsdeletedataset.Datasets.Delete(this.D_workspaceControl.WorkspaceTree.SelectedNode.Text);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
private void button_select_Click(object sender, EventArgs e)
{
D_mapControl.Action = SuperMap.UI.Action.Select;
}
private void button_pan_Click(object sender, EventArgs e)
{
D_mapControl.Action = SuperMap.UI.Action.Pan;
}
private void button_zoomin_Click(object sender, EventArgs e)
{
D_mapControl.Action = SuperMap.UI.Action.ZoomIn;
}
private void button_zoomout_Click(object sender, EventArgs e)
{
D_mapControl.Action = SuperMap.UI.Action.ZoomOut;
}
private void button_zoomfree_Click(object sender, EventArgs e)
{
D_mapControl.Action = SuperMap.UI.Action.ZoomFree;
}
private void button_viewentire_Click(object sender, EventArgs e)
{
D_mapControl.Map.ViewEntire();
}
private void OpenMap_Click(object sender, EventArgs e)
{
//获取当前工作空间树中选定的节点并将其转换
WorkspaceTreeNodeBase treeNode = this.D_workspaceControl.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase;
//关闭地图控件中的地图
D_mapControl.Map.Close();
//获取节点的文本内容
string name = treeNode.Text;
//打开地图
D_mapControl.Map.Open(name);
//图层管理器呈现地图中的图层
D_layersControl.Map = D_mapControl.Map;
//刷新地图控件中的地图
D_mapControl.Map.Refresh();
}
private void DeleteMap_Click(object sender, EventArgs e)
{
//获取当前工作空间树中选定的节点并将其转换
WorkspaceTreeNodeBase treeNode = this.D_workspaceControl.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase;
//关闭地图控件中的地图
D_mapControl.Map.Close();
//获取节点的文本内容
string name = treeNode.Text;
//删除地图
D_workspace.Maps.Remove(name);
//图层管理器呈现地图中的图层
D_layersControl.Map = D_mapControl.Map;
//刷新地图控件中的地图
D_mapControl.Map.Refresh();
//保存工作空间
D_workspace.Save();
}
private void OutputMap_Click(object sender, EventArgs e)
{
String PicNamepng = string.Empty;
String PicNamejpg = string.Empty;
saveFileDialog1.Filter = "PNG文件(.png)|*.png|JPG文件(.jpg)|*.jpg";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//根据用户选择的文件类型(PNG或JPG),分别调用对应的方法将地图保存为相应的影像文件格式
if (Path.GetExtension(saveFileDialog1.FileName) == ".png")
{
//设置要输出的影像文件名
PicNamepng = saveFileDialog1.FileName;
if (D_mapControl.Map.OutputMapToPNG(PicNamepng, false))
{
MessageBox.Show("输出地图为PNG影像文件成功!");
}
else
{
MessageBox.Show("输出地图为PNG影像文件失败!");
}
}
else if (Path.GetExtension(saveFileDialog1.FileName) == ".jpg")
{
//设置要输出的影像文件名
PicNamejpg = saveFileDialog1.FileName;
if (D_mapControl.Map.OutputMapToJPG(PicNamejpg))
{
MessageBox.Show("输出地图为JPG影像文件成功!");
}
else
{
MessageBox.Show("输出地图为JPG影像文件失败!");
}
}
}
else
{
return;
}
//地图刷新
D_mapControl.Map.Refresh();
}
private void queryattribute_Click(object sender, EventArgs e)
{
Attribute attribute = new Attribute();
attribute.ShowDialog();
}
private void SQLquery_Click(object sender, EventArgs e)
{
//判断工具条文本框的输入内容是否为空
if (toolStripTextBox1.Text.Length == 0)
{
MessageBox.Show("查询信息不能为空");
return;
}
//定义图层个数
Int32 layerCount = D_mapControl.Map.Layers.Count;
//判断当前地图窗口中是否有打开的图层
if (layerCount == 0)
{
MessageBox.Show("请先打开一个矢量数据集!");
return;
}
//定义查询条件信息;
QueryParameter queryParameter = new QueryParameter();
queryParameter.AttributeFilter = toolStripTextBox1.Text;
queryParameter.CursorType = CursorType.Static;
Boolean hasGeometry = false;
//遍历每一个图层,实现多图层查询
foreach (Layer layer in D_mapControl.Map.Layers)
{
//得到矢量数据集并强制转换为矢量数据集类型
DatasetVector dataset = layer.Dataset as DatasetVector;
if (dataset == null)
{
continue;
}
//通过查询条件对矢量数据集进行查询,从数据集中查询出属性数据
Recordset recordset = dataset.Query(queryParameter);
//判断是否有查询结果
if (recordset.RecordCount > 0)
{
hasGeometry = true;
}
//把查询得到的数据加入到选择集中
Selection selection = layer.Selection;
selection.FromRecordset(recordset);
recordset.Dispose();
}
//没有查询结果,弹出提示
if (!hasGeometry)
{
MessageBox.Show("没有符合查询条件的结果或查询条件有误,请重新确认后查询!");
}
//当可创建对象使用完毕后,释放所占用的内部资源
queryParameter.Dispose();
//刷新地图窗口显示
D_mapControl.Refresh();
//将hasGeometry重置为false,以备下一次查询使用
hasGeometry = false;
}
}
}
六、运行结果
总结
以上就是有关于SuperMap iObjects 11i .NET关于属性查图与图查属性的相关操作的一些过程记录,我们下篇博文再见!