吐槽下Arcgis的二次开发

时间:2024-04-07 07:03:24

     作为加入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)封装,大量封装成一个帮助类,虽然这个帮助类很庞大,但是很容易找,而且多重载函数,基本能够满足大部分的需求。

吐槽下Arcgis的二次开发

2)使用var 来定义名称,而不直接写接口,对已知的对象,不转换为接口

吐槽下Arcgis的二次开发

3)多写笔记,没办法的办法

4)自己写部分算法,Arcgis的比较慢,而且它的操作体验很差,限制了发挥空间,而你又做不到更好,还要差很多资料。

5)放弃Arcgis的编程风格,大胆改变,不然永远只是在Arcgis的屁股后面做事。