一、创建新工程
1.在本地磁盘下自定义创建一个文件夹,如 C:\MyProject。
2.下载数据文件 Workspace_Map.zip.(包含World.sdb和World.sdd)到工作目录 C:\MyProject 中。
3.启动 Microsoft Visual Studio .NET。 (这里使用的Visual Studio2008)
4.在文件夹 C:\Myproject 下新建 C# 工程的一个 Windows Application,命名为:MyFirstSuperMap。
二、将4个SuperMap控件添加到Visual Studio ToolBox(工具箱):
1.在 ToolBox(工具箱)上单击鼠标右键,点击"Add Tab"(添加选项卡),键入 SuperMap 作为名称。
2.在 ToolBox(工具箱)上单击鼠标右键,点击"Choose Items…"(选择项),出现如下对话框:
3.将"SuperMap Legend Control(因为版本不同,有些是xxx控件不是xxxControl,但它们作用是一样的)"、“SuperMap Control”、“SuperWorkspace Control”、“SuperWorkspace Manager Control”添加Visual Studio ToolBox(工具箱)。这里以选中“SuperMap Control” 和 “SuperWorkspace Control”为例,点击确定。ToolBox 中即出现下图所示两个控件:
三、打开地图和添加图层
1.将窗体的NAME属性命名为 frmMain,
Text命名为 “SuperMap Objects 开发入门教程”,
将Visual Studio ToolBox(工具箱)里的 SuperWorkSpace Control 拖拽/点击添加到窗体中并Text命名为 SuperWorkspace1,将 SuperMap Control 添加到窗体中并Text命名为 SuperMap1,如下图所示:
2.在属性中“frmMain”下的“Load”添加“frmMain_Load”,
点击“frmMain_Load”,输入如下代码:
private void frmMain_Load(object sender, System.EventArgs e)
{
SuperMap1.Connect(SuperWorkspace1.CtlHandle); //建立地图窗口与工作空间的联系,用于显示数据
String strAlias; //数据源别名
SuperMapLib.seEngineType nEngineType; //数据源引擎类型
String strDataSourceName; //数据源所在路径
SuperMapLib.soDataSource objDataSource; //数据源对象,指向打开的数据源
bool bReadOnly; //数据源是否只读打开
bool bAddToHead; //是否将数据集加到地图最上一层显示
int i; //数据集索引
strAlias = "MyDataSource"; //别名可任意,但建议取数据源文件名相同的名称,便于区分
nEngineType = SuperMapLib.seEngineType.sceSDBPlus; //可打开不同引擎的数据源,此处打开文件型 SDBPlus
strDataSourceName = "C:\\MyProject\\World.sdb"; //数据源所在路径,也可以是相对路径
bReadOnly = false; //非只读打开
//打开数据源
objDataSource = SuperWorkspace1.OpenDataSource(strDataSourceName, strAlias, nEngineType, bReadOnly);
if (objDataSource == null)
{
MessageBox.Show( "请将数据源文件(world.sdb,world.sdd)下载到 C:\\MyProject\\World.sdb 目录,再运行程序","打开数据源失败");
return;
}
else
{
//把数据源中的所有图层加入到 SuperMap 中
for(i=1;i<=objDataSource.Datasets.Count;i++)
{
bAddToHead = true;
SuperMap1.Layers.AddDataset(objDataSource.Datasets[i], bAddToHead);
}
}
SuperMap1.Refresh(); //刷新地图窗口
//可定制选中对象风格,或保持默认
SuperMap1.selection.Style.PenColor = System.Convert.ToUInt32(System.Drawing.ColorTranslator.ToOle(Color.FromArgb(231, 77, 0)));
SuperMap1.selection.Style.PenWidth = 1;
SuperMap1.selection.Style.PenStyle = 1;
SuperMap1.selection.Style.BrushStyle = 5;
SuperMap1.selection.Style.BrushColor = System.Convert.ToUInt32(System.Drawing.ColorTranslator.ToOle(Color.FromArgb(115, 69, 140)));
SuperMap1.selection.Style.BrushBackColor = System.Convert.ToUInt32(System.Drawing.ColorTranslator.ToOle(Color.FromArgb(239, 150, 255)));
SuperMap1.selection.Style.BrushOpaqueRate = 50;
System.Runtime.InteropServices.Marshal.ReleaseComObject(objDataSource);
objDataSource = null;
}
3.在属性中“frmMain”下的“FormClosing”添加“frmMain_Closing”,
点击“frmMain_Closing”,输入如下代码:
private void frmMain_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//关闭地图窗口及工作空间,注意顺序
SuperMap1.Close();
SuperMap1.Disconnect();
SuperWorkspace1.Close();
}
效果图如下所示:
四、添加地图浏览功能
利用 SuperMap Objects 控件,可以很方便地进行地图的基本操作,如放大、缩小、自由缩放、漫游、全幅显示等。
1.在窗体中加入五个Button控件,设置如下的属性值(其余属性取默认值即可):
Name | Text |
---|---|
cmdButtonPan | 漫游 |
cmdButtonZoomIn | 放大 |
cmdButtonZoomOut | 缩小 |
cmdButtonZoomFree | 自由缩放 |
cmdButtonViewEntire | 全幅显示 |
2.在各个按钮的Click事件里加入以下代码,即可实现以上功能。
private void cmdButtonViewEntire_Click(object sender, System.EventArgs e)
{
this.SuperMap1.ViewEntire(); //全幅显示
}
private void cmdButtonZoomIn_Click_1(object sender, System.EventArgs e)
{
this.SuperMap1.Action=SuperMapLib.seAction.scaZoomIn; //放大
}
private void cmdButtonZoomOut_Click_1(object sender, System.EventArgs e)
{
this.SuperMap1.Action = SuperMapLib.seAction.scaZoomOut; //缩小
}
private void cmdButtonPan_Click_1(object sender, System.EventArgs e)
{
this.SuperMap1.Action = SuperMapLib.seAction.scaPan; //漫游
}
private void cmdButtonZoomFree_Click_1(object sender, System.EventArgs e)
{
this.SuperMap1.Action = SuperMapLib.seAction.scaZoomFree; //自由缩放
}
效果图如下所示:
五、地图到属性查询
1.在窗体中加入一个button控件并设置它的属性值:
Name | Text |
---|---|
cmdQueryProperties | 图查属性 |
2.把按钮中要响应的代码键入到“cmdQueryProperties_Click(object sender, System.EventArgs e)”中:
private void cmdQueryProperties_Click(object sender, System.EventArgs e)
{
this.SuperMap1.Action=SuperMapLib.seAction.scaSelect; //图查属性
}
在 SuperMap 控件的事件“GeometrySelected”中键入如下代码:
private void SuperMap1_GeometrySelected(object sender, AxSuperMapLib._DSuperMapEvents_GeometrySelectedEvent e)
{
SuperMapLib.soSelection objSelection;
SuperMapLib.soRecordset objRd;
objSelection=this.SuperMap1.selection;
objRd=objSelection.ToRecordset(false); //提取所选对象的属性数据
string str="";
for (int i=1 ;i<=objRd.FieldCount;i++)
{
str+=objRd.GetFieldInfo(i).Name ; //得到属性名
str+=":"+objRd.GetFieldValue(i).ToString()+"\n"; //得到属性值
}
MessageBox.Show(str,"MyFirstSuperMap");
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSelection);
objSelection=null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(objRd);
objRd=null;
} `
下图是图查属性时的效果:
六、属性到地图的查询
1.在窗体中加入一个Label控件、button控件和一个TextBox控件,并设置它们的属性值如下:
Name | Text |
---|---|
lblQueryLabel | 漫游 |
txtExpression | 矩形方框 |
cmdQueryMap | 自由缩放 |
2.把按钮响应的代码加入到 cmdQueryMap_Click(object sender, System.EventArgs e) :
private void cmdQueryMap_Click(object sender, System.EventArgs e)
{
if (this.txtExpression.Text=="")
{
MessageBox.Show("查找信息不能为空");
return;
}
SuperMapLib.soDatasetVector objDtv; //矢量数据集
SuperMapLib.soDataset objDt;
SuperMapLib.soSelection objSelection; //选择集
SuperMapLib.soRecordset objRd; //记录集
//取矢量数据集:取其中面数据集"World"进行查询
objDt=this.SuperWorkspace1.Datasources["MyDataSource"].Datasets["World"];
objDtv=(SuperMapLib.soDatasetVector)objDt;
//使用 SQL 过滤条件从数据集中查询出记录集,SQL 条件的 WHERE 子句部分从编辑框中获取。( Query 方法只适用于 soDatasetVector 类对象)
objRd=objDtv.Query(this.txtExpression.Text,true,null,"");
//将查询结果加入到选择集中,使其高亮显示
objSelection=this.SuperMap1.selection;
objSelection.FromRecordset(objRd);
//刷新地图窗口
this.SuperMap1.Refresh();
System.Runtime.InteropServices.Marshal.ReleaseComObject(objRd);
objRd=null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(objDt);
objDt=null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(objDtv);
objDtv=null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSelection);
objSelection=null;
}
3.在编辑框中输入查询条件,如:smid<50,单击"属性查图"按钮,得到如下结果: (smid不分大小写,Workspace_Map.sdb中的中国smid是247)