ArcGIS Engine 基于C#的开发
(一)基本界面的搭建
* 无法嵌入互操作类型的问题的解决
*COM技术中的IUnknown接口和QueryInterface
(二)打开,保存,另存为功能
(三)鹰眼功能
在之前的基础在ToolbarControl上添加了winForm自带菜单和工具栏控件MenuStrip
然后添加一个文件的菜单项,包涵两个功能,如图:
地图文档对象MxDocument,其主要接口为IMapDocument
命名空间为ESRI.ArcGIS.Carto
IMapDocument接口提供用于读取地图文档文件(* .mxd,* mxt,* .pmf)以及编写和保存对地图文档文件(* .mxd)的更改的属性和方法。
我这里的打开和另存为的操作都是写在了一个file类里,然后在click事件中调用。
///
/// 打开地图文档
///
///
public void loadMapDoc(AxMapControl axMapControl)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "打开地图文档";
openFileDialog1.Filter = "地图文档(*.mxd)|*.mxd";//设置过滤属性
openFileDialog1.ShowDialog();
string filePath = openFileDialog1.FileName;//获取到文件路径
if (axMapControl.CheckMxFile(filePath))//检查路径是否合法
{
axMapControl.LoadMxFile(filePath, 0,Type.Missing);
}
else
{
MessageBox.Show(filePath+"不是有效的地图文档路径");
return;
}
axMapControl.Refresh();
}
重点:
载入地图文档的方法:
方法一:MapControl
控件的LoadMxFile
方法
axMapControl.LoadMxFile(filePath, 0,Type.Missing);
就是上面用到的方法
public virtual void LoadMxFile(string mxPath, object mapNameOrIndex, object password);
传入参数为文件路径和地图名或者索引,还有文件的密码,一般密码为空所有填入Type.Missing。
方法二:地图文档对象的的get_Map
方法
axMapControl.Map=mapDocument.get_Map(0);
IMap get_Map(int mapIndex);
将文档对象获取到的地图直接赋值给地图控件的Map
属性,就行了
//设置文档对象的成员变量
IMapDocument mapDocument = new MapDocumentClass();
///
/// 另存为
///
///
public void saveAsDocument(AxMapControl axMapControl)
{
mapDocument.Open(axMapControl.DocumentFilename, "");//将AxMapControl的实例的DocumentFileName传递给MapDocument
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Title = "保存地图文档";
saveFileDialog1.Filter = "地图文档(*.mxd)|*.mxd";//设置过滤属性
saveFileDialog1.FileName = axMapControl.DocumentFilename;//给定一个初始保存路为原路径
if (saveFileDialog1.ShowDialog() != DialogResult.OK)return;//未选择文件return
string filePath = saveFileDialog1.FileName;//获取到文件路径
if(filePath=="")return;
if (filePath == mapDocument.DocumentFilename)//判断路径是否改变,如果没有改变保存当前修改,改变则另存为
{
saveDocument();
}
else
{
mapDocument.SaveAs(filePath,true,true);
}
}
///
/// 保存当前修改
///
public void saveDocument()
{
if (mapDocument.get_IsReadOnly(mapDocument.DocumentFilename) == true)//是否可写
{
MessageBox.Show("This map document is read only !");
return;
}
mapDocument.Save(mapDocument.UsesRelativePaths,true);//以相对路径保存,
MessageBox.Show("Changes saved successfully !");
}
重点:
通过axMapControl.DocumentFilename
将当前地图控件中的地图文档路径,传递给MapDocument
对象,
然后再判断获取到的当前底图文档的MapDocument
对象的保存路径是否发生改变,
如果未变,则对应操作为mapDocument.Save
保存对地图文档的修改,并且save
之前要判断地图文档是否可写mapDocument.get_IsReadOnly
;
void Save(bool bUseRelativePaths = true, bool bCreateThumnbail = true);
如果改变,则对应操作为mapDocument.SaveAs
另存为。
void SaveAs(string sDocument, bool bUseRelativePaths = true, bool bCreateThumnbail = true);
其中UsesRelativePaths
为boll
的枚举值表示以相对路径保存,bCreateThumnbail
为true
表示生成缩略图。