符号化是ArcGIS体系中一个非常重要的概念,也是我们在做ArcEngine二次开发时所碰到的问题。一般情况下,我们都会做一个符号选择器,做符号选择器,我们就要得到符号库文件。因为ArcEngine系统的运行环境必须依赖于Engine Runtime,而Engine Runtime的安装目录下会有一个符号库文件夹,里面会有很多符号库文件。其实我们也可以把这些符号库文件拷到系统的运行目录下,这样我们还得去维护一个文件夹,为了系统的简介,我们还是希望能直接访问Runtime安装目录下得样式文件,毕竟要想运行Engine开发的系统,必须要安装Engine Runtime。
Engine使用的符号库文件其实就是扩展名为.serverstyle的文件,我们只要获取到这些文件的路径即可。要想获得这些文件的路径,首先我们要获取到本地ArcEngine Runtime安装的路径在什么地方。下面我们就以9.3和10.0为例分别说。
在使用ArcEngine 9.3的时候,我们获取Runtime的安装路径是通过读取Runtime的安装注册表的信息获取的。Runtime安装之后,会在注册表对应的位置写入安装路径,我们就可以读取该注册表项值,获取安装路径,代码如下:
/// <summary> /// 得到默认的样式文件 /// </summary> /// <returns></returns> public static List<string> GetDefaultServerStyleFilePaths() { List<string> myServerStylePaths = new List<string>(); //得到ArcGIS的安装位置,加载默认的样式文件 string myInstall = RoutinReadRegistry("SOFTWARE\\ESRI\\CoreRuntime"); //向图标容器中加载ESRI server样式文件 string myPath = myInstall + "\\Styles"; string[] myFielNameList = System.IO.Directory.GetFiles(myPath); foreach (string myFielPath in myFielNameList) { if (System.IO.Path.GetExtension(myFielPath).ToLower() == ".serverstyle") { myServerStylePaths.Add(myFielPath); } } return myServerStylePaths; } /// <summary> /// 使用关键字得到ArcGIS的安装路径 /// </summary> /// <param name="pKay"></param> /// <returns></returns> private static string RoutinReadRegistry(string pKay) { //打开关键字目录,并读取 Microsoft.Win32.RegistryKey myRk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(pKay, true); if (myRk == null) { return ""; } else { //使用key,从指定的清单中得到数据 return myRk.GetValue("InstallDir").ToString(); } }
当我们升级到ArcEngine 10之后,在运行之前的代码时,运行到读取注册表信息时,就会报错,查了一下注册表,发现注册表里面已经没有该信息了,找了其他的选项也没找到。刚开始一直还以为是因为没有装Runtime,只装了桌面版和开发包的原因。但想想之前在开发9.3的时候也是只安装桌面版和开发包就可以的。
在几天找不到原因的情况下,偶尔在Engine 10安装目录下面的例子中看到了如果读取样式文件的代码。原来Engine10中提供了方法可以直接获取Engine运行时的安装目录,代码如下:
string installationFolder = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path; axSymbologyControl1.LoadStyleFile(installationFolder + "\\Styles\\ESRI.ServerStyle");
通过上面的方法,我们就能获取到Engine runtime的安装路径以及下面的样式文件了。
这个代码来自于Engine10下面的例子,路径为:
..\Program Files (x86)\ArcGIS\DeveloperKit10.0\Samples\ArcObjectsNet\ControlsCommandsEnvironment\CSharp\CommandsEnvironment.cs