热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

吐槽下Arcgis的二次开发

作为加入GIS这个行业有7,8年历史的我,非常害怕和Arcgis的底层API去接触,我宁可自己写算法,也不愿意碰它。当然在一般情况下,这对我来说,基本可以不用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等语言重来没有这么做过。    

    7)完全不能理解的IFieldEdit的属性Name_2的含义,Arcgis任意命名变量,完全不顾开发者是否懂其中含义,在Arcgis里只有一条成功的路,就是咨询+复制别人的代码.

   8) 总结,解决要记忆接口的办法就是直接写var 比如var point=new PointClass().而不再用IPoint point=PointClass(),这样无论他底层怎么改变,我既可以使用接口的信息,又可以转化为类的信息。

       另外这也是ERSI放弃原来的东西的原因,他自己都不愿意维护了。


推荐阅读
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
啥也不会
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有