《ArcGIS Engine开发 从入门到精通》学习笔记1 地图的加载与保存。

照着书上敲完了两个主要函数的代码,先mark一下,以备下次偷懒。

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;

private void LoadMapDocument()
{
System.Windows.Forms.OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "打开地图文档";
openFileDialog.Filter = "map documents (*.mxd)|*.mxd";
openFileDialog.ShowDialog();
string filePath = openFileDialog.FileName;
if (axMapControl1.CheckMxFile(filePath))
{
axMapControl1.MousePointer = ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerHourglass;
axMapControl1.LoadMxFile(filePath, 0, Type.Missing);
axMapControl1.MousePointer = ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerDefault;
}
else
{
MessageBox.Show(filePath + "不是有效的地图文档!");
}
}

private void LoadMapDocument2()
{
System.Windows.Forms.OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "打开地图文档";
openFileDialog.Filter = "map documents (*.mxd)|*.mxd";
openFileDialog.ShowDialog();
string filePath = openFileDialog.FileName;
if (axMapControl1.CheckMxFile(filePath))
{
ESRI.ArcGIS.esriSystem.IArray arrayMap = axMapControl1.ReadMxMaps(filePath, Type.Missing);
ESRI.ArcGIS.Carto.IMap map;
for (int i = 0; i < arrayMap.Count; i++)
{
map = arrayMap.get_Element(i) as ESRI.ArcGIS.Carto.IMap;
if (map.Name == "Layers")
{
axMapControl1.MousePointer = ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerHourglass;
axMapControl1.LoadMxFile(filePath, 0, Type.Missing);
axMapControl1.MousePointer = ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerDefault;
break;
}
}
}
else
{
MessageBox.Show(filePath + "不是有效的地图文档!");
}
}

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
LoadMapDocument();
}

private void button2_Click(object sender, EventArgs e)
{
LoadMapDocument2();
}

敲完代码之后报错:

error CS0246: 未能找到类型或命名空间名称“IArray”(是否缺少 using 指令或程序集引用?)

 error CS0246: 未能找到类型或命名空间名称“IMap”(是否缺少 using 指令或程序集引用?)

 

百度了一下,是缺少类库引用,那么问题来了,明明引用中已经添加了这个,还是报错、

然后又积(wu)极(chi)的百度了一下,原来C#的引用文件夹与使用using的区别是大大的!

引用文件夹引用的是目标文件:当程序需要使用外部库的时候,引用文件夹向编译器说明:我正在使用外部类库,并且告之这个外部类库的位置。

using引用的是目标内容:这个才是我们正常遇到的添加引用,不对,准确的说应该是使用这个命名空间,这样的话,就可以直接调用我想要的内容。

举例来说:

我是用的IArray和IMap是包含在ESRI.ArcGIS.esriSystem和ESRI.ArcGIS.Carto里面的。

我添加了引用文件夹表示我现在就可以使用这两个类库了,同样的我也就可以使用这两个变量类型了。

但是,现实是当我使用它们的时候还是报错,IArray和IMap没有声明。

原因就是,虽然我告诉了编译器,我要是用这两个类库,但是编译器只认识这两个类库,并不认识IArray和IMap。

所以我就需要添加using ESRI.ArcGIS.esriSystem 和using ESRI.ArcGIS.Carto,这样的话我就可以使用它们了。

当然不引用这两个类库也是可以的,在使用的时候,ESRI.ArcGIS.esriSystem.IArray和ESRI.ArcGIS.Carto.Imap就可以了。

这个不用说明了吧,std::cout<< "hello world!"<<std::endl;想必大家都用过!

最后展示一下效果。

最后再唠叨一句,那个第二个加载函数的代码我是照着书上抄的,发现并不能实现效果,我也看不懂这段代码是要干什么,暂时用不上,所以弃之不理!

采用IMapDocument类型进行地图文件的加载,保存和另存为。

namespace 地图的保存
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

IMapDocument mapDoc;
private void loadMapDoc()
{
mapDoc = new MapDocumentClass();
try
{
System.Windows.Forms.OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "打开地图文档";
openFileDialog.Filter = "map documents (*.mxd)|*.mxd";
openFileDialog.ShowDialog();
string filePath = openFileDialog.FileName;
mapDoc.Open(filePath, "");
for (int i = 0; i < mapDoc.MapCount; i++)
{
axMapControl1.Map = mapDoc.get_Map(i);
}
axMapControl1.Refresh();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}

private void saveDoc()
{
if (mapDoc.get_IsReadOnly(mapDoc.DocumentFilename) == true)
{
MessageBox.Show("地图文档只读,无法保存!");
}
else
{
try
{
mapDoc.Save(mapDoc.UsesRelativePaths, true);
MessageBox.Show("保存地图文档成功!");
}
catch (Exception e)
{
MessageBox.Show("保存地图文档失败" + e.ToString());
}
}
}

private void saveAsDoc()
{
if (mapDoc.get_IsReadOnly(mapDoc.DocumentFilename) == true)
{
MessageBox.Show("地图文档只读,无法保存!");
}
else
{
try
{
System.Windows.Forms.SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "保存地图文档";
saveFileDialog.FileName = "new.mxd";
saveFileDialog.Filter = "map documents (*.mxd)|*.mxd";
saveFileDialog.ShowDialog();
string filePath = saveFileDialog.FileName;
mapDoc.SaveAs(filePath, true, true);
MessageBox.Show("保存地图文档成功!");
}
catch (Exception e)
{
MessageBox.Show("保存地图文档失败" + e.ToString());
}
}
}
private void button1_Click(object sender, EventArgs e)
{
loadMapDoc();
}

private void button2_Click(object sender, EventArgs e)
{
saveDoc();
}

private void button3_Click(object sender, EventArgs e)
{
saveAsDoc();
}

编译之后发现报错。

IMapDocument m_MapDocument = new ESRI.ArcGIS.Carto.MapDocumentClass();

报错:

无法嵌入互操作类型"ESRI.ArcGIS.Carto.MapDocumentClass".请改用适用的接口.

 

解决方案如下:

解决方案——项目——引用——ESRI.ArcGIS.Carto

右键ESRI.ArcGIS.Carto ——属性——嵌入互操作类型=false

转自:http://theseaanna.blog.163.com/blog/static/1997180092011101984414974/

 

转载于:https://www.cnblogs.com/Zzitai/p/5045545.html

ArcGIS Engine开发从入门到精通》讲解是基于ArcGIS Engine 9.3开发平台,介绍了相关的开发技术和工程应用,并用C#语言编程实现了工程实例。《ArcGIS Engine开发从入门到精通》共4篇分18章,第一篇基础篇(第1~9章)集中介绍了 ArcGIS Engine基础知识,包括开发基础组件对象模型、ArcGIS Engine介绍、基于.NET的ArcGIS Engine开发ArcGIS Engine中的控件、框架控件介绍、控件使用实例等,为以后应用ArcGIS Engine的各种接口,快速地实现系统的开发打下坚实的基础;第二篇应用提高篇(第10~12章)介绍了ArcGIS Engine的应用框架、空间分析、ArcGIS Server服务、三维模式数据编辑等高级应用,通过学习这些高级应用可以使读者得心应手地完成各种GIS系统的开发;第三篇综合实例篇(第13章~第14章)用两个综合例子将前面讲解的知识点串起来,让读者将学习的知识点融合起来,以便可以胜任项目开发的角色;第四篇常见疑难解答与经验技巧集萃(第15~18章),本篇将一些开发过程中常见的异常、数据库连接与释放、数据加载以及一些经验技巧做了介绍,本篇的例子主要是对开发过程中常碰到的问题和实战技巧进行了汇总解答,以便帮助读者提高工作效率。, 《ArcGIS Engine开发从入门到精通》从开发者的角度,全面讨论了ArcGIS Engine开发的知识,让读者了解和掌握ArcGIS Engine开发的实战技术,无论是想对ArcGIS Engine入门还是对ArcGIS Engine感兴趣的GIS人员,都能从《ArcGIS Engine开发从入门到精通》中得到提高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值