全国高分辨率土地利用数据服务 土地利用数据服务 土地覆盖数据服务 坡度数据服务 土壤侵蚀数据服务 全国各省市DEM数据服务 耕地资源空间分布数据服务 草地资源空间分布数据服务 林地资源空间分布数据服务 水域资源空间分布数据服务 建设用地空间分布数据服务 地形、地貌、土壤数据服务 分坡度耕地数据服务 全国大宗农作物种植范围空间分布数据服务
多种卫星遥感数据反演植被覆盖度数据服务 地表反照率数据服务 比辐射率数据服务 地表温度数据服务 地表蒸腾与蒸散数据服务 归一化植被指数数据服务 叶面积指数数据服务 净初级生产力数据服务 净生态系统生产力数据服务 生态系统总初级生产力数据服务 生态系统类型分布数据服务 土壤类型质地养分数据服务 生态系统空间分布数据服务 增强型植被指数数据服务
多年平均气温空间分布数据服务 多年平均降水量空间分布数据服务 湿润指数数据服务 大于0℃积温空间分布数据服务 光合有效辐射分量数据服务 显热/潜热信息数据服务 波文比信息数据服务 地表净辐射通量数据服务 光合有效辐射数据服务 温度带分区数据服务 山区小气候因子精细数据服务
全国夜间灯光指数数据服务 全国GDP公里格网数据服务 全国建筑物总面积公里格网数据服务 全国人口密度数据服务 全国县级医院分布数据服务 人口调查空间分布数据服务 收入统计空间分布数据服务 矿山面积统计及分布数据服务 载畜量及空间分布数据服务 农作物种植面积统计数据服务 农田分类面积统计数据服务 农作物长势遥感监测数据服务 医疗资源统计数据服务 教育资源统计数据服务 行政辖区信息数据服务
Landsat 8 高分二号 高分一号 SPOT-6卫星影像 法国Pleiades高分卫星 资源三号卫星 风云3号 中巴资源卫星 NOAA/AVHRR MODIS Landsat TM 环境小卫星 Landsat MSS 天绘一号卫星影像
创建协同MapControl和PageLayoutControl一起运作的自定义命令和工具,与你或许已经做过的创建ESRI ArcMap应用程序命令非常相似。你将创建一个在PageLayoutControl鼠标点击位置添加包含当天日期的文本元素的自定义工具。不管用何种方法,创建同MapControl和ToolbarControl协作的命令与同PageLayoutControl一样。
这个自定义工具的相关代码与其他本方案源代码一样很有用。如果你想要直接使用自定义命令,而不自己创建它,请直接到第24步。
1. 从新建项目对话框创建一个新的Visual C# “类库”项目。
2. 将项目命名为“Commands”,并选择保存位置存贮之。
3. 单击项目菜单并选择“添加引用(R)…”。
4. 在添加引用对话框中,复 选“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESRI.ArcGIS..Utility”和“ESRI.ArcGIS.ControlCommands”。
5. 在项目中增加一个类,名字叫AddDateTool。
6. 点击项目菜单并选择添加现有项,浏览样例源码目录并找到date.bmp文件将其加入到你的项目。
7. 在解决方案资源管理器中点击date.bmp在属性窗口显示其属性。改变生成操作属性为嵌入的资源。这张位图将被用来作为命令按钮的外观。
8. 改变AddDateTool的命名空间的名称为CSharpDotNETCommands。
namespace CSharpDotNETCommands
{
……
注:要在Visual Basi .NET中改变命名空间的名称,则在解决方案资源管理器的项目上点击右键并选择属性,在项目属性页中选择常规并改变根命名空间后,按确定。
9. 在AddDateTool类代码窗口的顶部增加以下引用。
using System;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.ControlCommands;
using ESRI.ArcGIS.Utility.BaseClasses;
using System.Runtime.InteropServices;
10. 指定AddDateTool类继承自ESRI BaseTool抽象类,并增加密封(sealed)类修饰。
public sealed class AddDateTool : BaseTool
{
……
注:抽象类是不能被实例化的类,通常仅包含部分实现代码,或者不包含任何实现代码。它们与接口密切相关;但与接口有明显的区别,也就是说,一个类可能实现任意数量的接口,但它仅能够从一个抽象类中继承。继承了ESRI BaseTool抽象类,你便可以比直接实现esriSystemUI ICommand和ITool接口更快速、简便地创建命令和工具。
密封类修饰说明一个类不能被继承。此类的设计是为了限制其他类从该类继承。
11. 向AddDateTool类的构造函数中增加下列代码:
public sealed class AddDateTool : BaseTool
{
public AddDateTool()
{
// 获取程序集中的资源数组
string[] res = GetType().Assembly.GetManifestResourceNames();
// 设置工具属性
base.m_bitmap = new System.Drawing.Bitmap(
GetType().Assembly.GetManifestResourceStream(res[0]));
base.m_caption = "添加日期";
base.m_category = "CustomCommands";
base.m_message = "在页面布局中增加一个日期元素";
base.m_name = "CustomCommands_Add Date";
base.m_toolTip = "添加日期";
}
}
注:类构造函数是一个当类创建时被调用的方法。它可以用来初始化类成员变量。构造函数名与类名相同;与其他方法不同的是它没有返回类型。
程序中只个别地替换实现了位图、标题、目录、名称、消息和提示方法,你可以设置从这此方法返回的值,且依赖于BaseTool类为这此方法提供的实现。其它的成员保留BaseTool类返回的默认值。
12. 向AddDateTool类增加下列成员变量。
public sealed class AddDateTool : BaseTool
{
// HookHelper对象处理通过OnCreate事件的回调
private IHookHelper m_HookHelper = new HookHelperClass();
……
13. 在类视图窗口中,定位到BaseCommand类的OnCreate方法,右键点击之显示上下文菜单。选择增加,然后重载并增加该方法至代码窗口。
14. 在重载的OnCreate方法中增加以下代码。
public override void OnCreate(object hook)
{
m_HookHelper.Hook = hook;
}
注:要在Visual Basic .NET中重载属性和方法,从代码窗口顶部的“Class Name”组合框中选择“Overrides”,从“Method Name”组合框中选择属性或方法。
15. 在类视图中定位到BaseCommand类的Enabled属性并在其上点击右键显示上下文菜单。选择添加,然后点重写增加该属性至代码窗口。
16. 增加以下代码,重写BaseTool类的默认Enabled值。
public override bool Enabled
{
get
{
// 设置使能属性
if ( m_HookHelper.ActiveView != null )
{
return true;
}
else
{
return false;
}
}
}
注:ICommand_OnCreate事件向命令工作的应用程序传送一个句柄或回调。在这种情况下,它可以是MapControl,PageLayoutControl或ToolbarControl。除向OnCreate事件增加代码外,你可以使用HookHelper判断传向命令的回调类型。命令或工具需要知道如何处理传送的回调,所以必须对ArcGIS Control传送的类型作检查。HookHelper用来控件回调并返回ActiveView忽略的回调类型(MapControl、PageLayoutControl和ToolbarControl都是这样)。
17. 在类视图中定位到BaseTool基类的onMouseDown方法,并在其上点击右键显示上下文菜单。选择添加,然后重载并增加该属性至代码窗口。
18. 增加下列代码,重载BaseTool类实现的默认onMouseDown函数。
public override void onMouseDown(int Button, int Shift, int X, int Y)
{
// TODO: 添加 AddDateTool.onMouseDown 实现
base.onMouseDown (Button, Shift, X, Y);
// 获取活动视图
IActiveView activeView = m_HookHelper.ActiveView;
// 创建新的文本元素
ITextElement textElement = new TextElementClass();
// 创建文本符号
ITextSymbol textSymbol = new TextSymbolClass();
textSymbol.Size = 25;
// 设置文本元素属性
textElement.Symbol = textSymbol;
textElement.Text = DateTime.Now.ToShortDateString();
// 对IElementQI
IElement element = (IElement) textElement;
// 创建页点
IPoint point = new PointClass();
point = activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
// 设置元素图形
element.Geometry = point;
// 增加元素到图形绘制容器
activeView.GraphicsContainer.AddElement(element, 0);
// 刷新图形
activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,
null, null);
}
19. ArcGIS Engine期望自定义命令是一个COM类;因此,你必须指定你所创建的.NET类也成为一个COM类,它是通过创建一个COM可调用包装(callable wrapper)实现的。在解决方案资源管理器窗口中,在Commands项目上右击鼠标键并从上下文菜单中选择属性。
20. 在项目属性页对话框中选择配置属性;并点击生成。在右面的面板中,改变为“为Com Interop注册”为True,点确定。
注:设置“为Com Interop注册”属性为True会调用程序集注册工具(Regasm.exe)。这将增加客户端期望找到的类信息。
如果“为Com Interop注册”属性设为False,则使项目不要是一个C#类库类型。
21. 在AddDateTool类的代码编写窗口的AddDateTool类声明的开始位置增加下列代码,指定COM需要的属性。
[ClassInterface(ClassInterfaceType.None)]
[Guid("D880184E-AC81-47E5-B363-781F4DC4528F")]
注:新的GUID可能通过Visual Studio .NET中的GuidGen.exe实用工具生成,或者从工具菜单中选择创建GUID。GUID应该像上面的格式并不包含大括号(curly braces)。
22. 向AddDateTool类成员变量的后面增加下列代码。此代码定义了一些函数,这些函数使用目录实用工具向ESRI控件命令(ESRI Control Commands)组件目录注册和取消注册AddDateTool类。
// 在“ESRI Controls Commands”组件目录注册
#region Component Category Registration
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(String sKey)
{
string fullKey = sKey.Remove(0, 18) + @"\nImplemented Categories";
Microsoft.Win32.RegistryKey regKey =
Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fullKey, true);
if (regKey != null)
{
regKey.CreateSubKey("{B284D891-22EE-4F12-A0A9-B1DDED9197F4}");
}
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(String sKey)
{
string fullKey = sKey.Remove(0, 18) + @"\Implemented Categories";
Microsoft.Win32.RegistryKey regKey =
Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fullKey, true);
if (regKey != null)
{
regKey.DeleteSubKey("{B284D891-22EE-4F12-A0A9-B1DDED9197F4}");
}
}
#endregion
23. 生成工程。
24. 在方案开始创建的Visual Studio .NET “Windows应用程序”项目中,增加地图导航命令代码的后面增加以下代码。
private void Form1_Load(object sender, System.EventArgs e)
{
// 前面是命令导航代码……
// 添加自定义日期工具
progID = "CSharpDotNETCommands.AddDateTool";
axToolbarControl1.AddItem(progID, -1, -1, true, 0,
esriCommandStyles.esriCommandStyleIconAndText);
// 后面是ToolbarMenu相关代码……