制图排版的终极武器-自定义Element

GIS系统的一项重要功能是出图,而出图功能的最终解决方案涉及排版。而GIS中的排版绝非纯粹的体力活,事实上实用排版系统所追求的终极目标是交互的简单,信息的丰富,定制的灵活性。这三项指标是对GIS出图系统评价的最好依据。

在ArcGIS桌面系统中出图部分完全依靠Element来控制版式的布局,通过不同类型的Element来提供不同的成图要素。Element主要分为两类Graphic Element和Frame Element,具体区别可以参考ESRI的开发帮助。本文所关注的是通过底层来定制一个Element,以提高Element在系统定制中的灵活性。

在开始实现自定义Element之前,回顾一下Layout下Element的特点。Layout下我们默认会得到一个包含Map的Element,为了丰富地图,我们需要添加指北针,比例尺,和图例,这三类一般都是通过向导生成,属于MapSurround Element.向导的优点是快捷和定制,但是和优点一样突出的是缺点,灵活性不够,最主要的还是定制出来的样式非常难看,事实上在国内一般是不会用这些向导生成Element,最常用的反而是通过若干普通的Graphic Element组合后生成,例如图例。

自己定义Graphic Element最后都会把若干琐碎的Element组合起来,得到最后的GroupElement来控制,由于GroupElement是单一的Element,方便控制。那为什么自己还要从底层自己再写一个Element呢?原因是这样的,GroupElement虽然很容易控制但是无法修改GroupElement内部的元素,当然很多人说可以打散GroupElement后修改,然后再取到需要的Element修改,改完后再组合。很多人其实就是这么做的,但是很遗憾并不完美,组合前如果通过Name来标识Element,那打散后这些Name都不在了,你必须通过其他的手段来标识Element,使得组合前和打散后仍然能够通过标识得到特定的Element来控制。这只是其中一个问题,另一个问题之一,就是我遇到的,如果地图上需要加上表格来丰富信息,怎么处理。一般对ArcGIS比较熟悉的用户会告诉你,通过添加支持OLE对象的Element直接插入表格,非常遗憾,这个功能只能在桌面下用,ArcEngine下你是用不起来的,OLE Element是属于ArcMapUI类库的。即使用了很大的问题是如果需要改变表格内容,你需要在OLE对象的编辑环境下进行,也就是说你如果插入的是Excel表格,你只能在Excel环境下编辑后,Element才能表现出来。

有很多人问过我这个问题,如何解决?我给出的答案是,要么定制好OLE Element对象不动,要么你就自己做一个支持表格的Element。自己做灵活性和可定制性都很好,而且一劳永逸,只是难度比较大,不熟悉或者没有自己做过ArcGIS 扩展的人实现起来是比较费劲的。ESRI 只给出了一个实现Triangle Element的例子,非常简单,参考着做就可以。当然实现类似表格的功能还是颇为费劲的。

第一步,确定自己需要实现哪些接口,可以参考Triangle Element的实现

第二步,设计自定义接口内部需要传入的参数

第三步,测试用例

        //添加自定义Element
	IElementPtr  ipElement(CLSID_HydroInfoElement); 
	IPointPtr    ipPoint(CLSID_Point);
	hr=ipPoint->PutCoords(0,0);
	ipElement->put_Geometry(ipPoint);
	hr=ipGraphicsContainer->AddElement(ipElement,0);
 	 
	IPropertySetPtr ipPropertySet(CLSID_PropertySet);
	hr=ipPropertySet->SetProperty(CComBSTR("主管单位"),CComVariant("国家防汛抗旱总指挥部办公室"));
	hr=ipPropertySet->SetProperty(CComBSTR("编制单位"),CComVariant("水利部长江水利委员会"));
        hr=ipPropertySet->SetProperty(CComBSTR("编制方法"),CComVariant("水利学法"));
        hr=ipPropertySet->SetProperty(CComBSTR("发布单位"),CComVariant(""));
        hr=ipPropertySet->SetProperty(CComBSTR("发布时间"),CComVariant(""));
 
    	IHydroInfoElementPtr ipHydroInfoElement;
	ipHydroInfoElement	= ipElement;

	hr=ipHydroInfoElement->put_HydroInfoProperties(ipPropertySet);
	 
	//设置说明文字字体
	ITextSymbolPtr ipTextSymbol(CLSID_TextSymbol);
	IFontDispPtr   ipFontDisp(CLSID_StdFont);
	IFontPtr       ipFont;
	ipFont=ipFontDisp;
	hr=ipFont->put_Name(CComBSTR("宋体"));		 
	hr=ipTextSymbol->put_Font(ipFontDisp);
	hr=ipTextSymbol->put_Size(12);
	hr=ipHydroInfoElement->put_HydroInfoTextSymbol(ipTextSymbol);

	//刷新
	IActiveViewPtr  ipActiveView;
	ipActiveView=ipGraphicsContainer;
	hr=ipActiveView->Refresh();

第四步,自己实现所有接口内部的方法

第五步,ArcMap或ArcEngine上测试

自定义的Table Element如果需要改变内容,最直接的方式就是把PropertySet参数重新传递一边,这其实极大的减轻了ArcEngine的开发,一般用户只需要简单定制传入参数的界面或者只是通过程序控制参数即可,其他的效果全部由Table Element自动控制。当然定制的力量不仅仅局限在这里,其他类似的棘手或繁琐的工作都可以转化到自定义Element上。自定的Element,再加上排版规则,所有排版的问题几乎都可以迎刃而解。

转载请注明来源:http://blog.csdn.net/jx1228

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值