arcgis二次开发
作为加入GIS这个行业有7,8年历史的我,非常害怕和Arcgis的底层API去接触,我宁可自己写算法,也不愿意碰它。当然在一般情况下,这对我来说,基本可以不用Arcgis就可以设计某些算法。我和我女朋友说过一段话,那个大体说Arcgis让人不去思考。那么今天就不扯那么远,先谈谈二次开发。我就不大而广的去说了。我觉得,之所以难用难记,是因为它强调接口编程,接口自然有接口的好处,但Arcgis给任何对象都加入了接口,就变得异常复杂
1)设计了很多低等的类,加重了整个API的复杂性,同时非常难记住,比如ArrayClass(IArray)。ArrayClass还不支持泛化,就只加入对XML的支持,这完全就没有必要嘛。何不用ArrayList+XML的帮助类。
类似的还有:RgbcolorClass(还不支持多参数构造函数)(要死了)
2)Arcgis的底层API做非常多的工作,比如PointClass,如果这样写代码Var p=new PointClass();p.x+=10;那么就会报错(你试试)
这间隔证明Arcgis的API仅仅是对某种语言比如C++语言的直接导出。而底层代码非常的糟糕。经过测试,使用C#的API PointF(或者自己定义
Point2D)比IPoint对象,即使仅仅只访问属性X,Y都可以从42秒变成13秒
3)类似IGPString str=new GPStringClass()这样的写法,这里我觉得存在两个问题,a)先写IGPString str=new 后面是得不得C#(IDE)的智能提示的,你得自己去想实例对象,b)可以大胆的猜测继承IGPString 的只有GPStringClass这个类,而且很长一个时期这个类是不可能被修改的。那么为啥要降级为接口呢。
4)多次强制转换,比如有一本书这么写,
public void Excute(..ITrackCancel trackCancel..){
IStepprogressor pStepPro=(IStepProgressor )trackCancel;
}
类似的还有Map.FeatureSelection as IEnumFeature;其中FeatureSelection是ISelection接口,跟IEnumFeature没有半毛钱的关系,不知道谁会记得住。
这种写法是Arcgis培养出来的,在我们公司遇到很多,请问谁给你勇气这么转,后面维护人员需要了解多个函数,而单单调试trackCancel基本无法知道它是什么的实例。
5)IHookHelper对象,Hook这个词是钩子的意思,这是当年C函数对底层的消息截断处理的一种方式,现在的人基本不用了。而这里使用Hook,我仿佛回到了10年前。而且他有个属性是object Hook { get; set; },这个你不查资料,不去了解都是懵逼的,即使是老手我想也需要一段时间去想吧。我讨厌什么东西都是object.
6)Icommand ,ITool这些接口中的OnClick,OnMouseDown应该可以理解为事件响应,既然是事件响应,自然存在一个EventArgs,现在没有,需要转很大一圈。比如你想动态的调整事件的传递的参数,只能通过在其构造函数中添加一个引用对象来处理。
6)非常恶心的命名规则,类后面很多都是XXClass,比如FeatureLayerClass。FeatureLayer是Feature图层,Class翻译成什么,实例?种类?FeatureLayer其实我已经知道是FeatureLayer了,加个Class我想只要Arcgis可以创造出新的命名规则,C#,java等语言重来没有这么做过。 其他还有coclass(C++风格),p参数的风格,hook的风格
7)完全不能理解的IfieldEdit的属性Name_2的含义,Arcgis任意命名变量,完全不顾开发者是否懂其中含义,在Arcgis里只有一条成功的路,就是咨询+复制别人的代码.
8) 二次开发和原生的效果不一致的问题,比如在JSAPI中,如果自己写画线,会产生卡顿,而用原生的不会(用esri.toolbars.Draw方法,但是这个类还是有问题,就是第一点和第二点是没有连续的),这可能是由于没有找到相关的方法,或它内部进行了优化而为公开。
9) 总结,解决要记忆接口的办法就是直接写var 比如var point=new PointClass().而不再用IPoint point=PointClass(),这样无论他底层怎么改变,我既可以使用接口的信息,又可以转化为类的信息。
另外这也是ERSI放弃原来的东西的原因,他自己都不愿意维护了。在webAPP中就简洁很多,代码量和记忆量大大减少。
第二部分 我的破解之道
1)封装,大量封装成一个帮助类,虽然这个帮助类很庞大,但是很容易找,而且多重载函数,基本能够满足大部分的需求。
2)使用var 来定义名称,而不直接写接口,对已知的对象,不转换为接口
3)多写笔记,没办法的办法
4)自己写部分算法,Arcgis的比较慢,而且它的操作体验很差,限制了发挥空间,而你又做不到更好,还要差很多资料。
5)放弃Arcgis的编程风格,大胆改变,不然永远只是在Arcgis的屁股后面做事。
相关阅读
开发语言:C#平台版本:MapGIS K9 SP3MapGIS K9三维平台也提供了接口和组件以实现二次开发。用户可以根据提供的接口和组件进行二次开
想入门CATIA二次开发CAA的盆友看过来(谈谈开发经验,或许
前言 刚开始接触CATIA二次开发时候还是比较难熬的,因为没接触过CATIA、更重要的是没有C++基础。帮助文档 很难翻译成可以理解的中
如何使用高程DEM建立三维地图模型(Arcgis ArcScene)
相关教程:3DMAX三维制作地形图教程 工具准备 1、BIGEMAP地图下载器 2、ARCGIS10.2 3、global mapper ARCGIS下载地址
1.Discuz目录结构 1.1根目录文件 admin.php-----------------------------------------后台入口文件 api.php-----------------