作为加入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的屁股后面做事。

吐槽下Arcgis的二次开发相关推荐

  1. 【ArcGIS Pro二次开发】(15):用地用海名称和代码互转

    在国土空间规划中,用地用海的名称和代码是一一对应的,手动修改用地代码后,还需要相应的修改名称,纯纯的重复工作,因此做了这个工具. 之前用Arcpy做过同样的功能的工具,参看这个: ArcGisPro脚 ...

  2. Arcgis ArcEngine二次开发: 输出宗地图、宗地草图、权属协议书附图、房产分层分户图、公示图、三调土地利用图、行政区划图、标准分幅图等各种图件

    1.Arcgis  ArcEngine二次开发: 输出宗地图.宗地草图.权属协议书附图.房产分层分户图.公示图.三调土地利用图.行政区划图.标准分幅图等各种图件 有需要联系QQ:185242573. ...

  3. 【ArcGIS Pro二次开发】系列学习笔记,持续更新,记得收藏

    一.前言 这个系列是本人的一个学习笔记. 作为一个ArcGIS Pro二次开发的初学者,最困扰的就是无从入手.网上关于ArcGIS Pro二次开发的中文资料极少,官方文档对于我这样的英文苦手又太不友好 ...

  4. arcgis engine二次开发python-使用C#配合ArcGIS Engine进行地理信息系统开发

    简单的地图读取.展示终于到暑假了...开始认真整理整理相关学习的心得体会咯~ 先把很久之前挖的关于C# 二次开发的坑给填上好了~ 这次先计划用一个月把C# ArcEngine 10.0相关开发的学习心 ...

  5. 【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比

    文章目录 2.1 使用VBA进行桌面软件开发 2.1.1 VBA开发方式 2.1.1 VBA代码的安全性 2.2 使用DLL进行桌面软件开发 2.2.1 DLL开发方式 2.2.2 DLL功能的应用部 ...

  6. ArcGIS Pro二次开发环境配置及项目创建示例

    一.软件版本 ArcGIS Pro 2.8 Visual Studio 2019 二.组件 ArcGIS Pro 2.8 SDK for .NET: proapp-sdk-templates.vsix ...

  7. arcgis python二次开发_arcgis二次开发python_arcgis二次开发是什么_arcgis二次开发

    VS2013中ArcGIS二次开发部分问题问题解决方法VS2013中新建项目时没有ArcGIS模板解决办法:安装ArcGIS10.x会自动生成C:\Program Files x86 \Microso ...

  8. 【ArcGIS Engine二次开发】入门基础(1):ArcGIS Engine简介及开发环境搭建

    文章目录 ArcGIS Engine概述 ArcGIS Engine与ArcObjects的关系 ArcGIS Engine下载及安装 ArcGIS Engine概述 ArcGIS Engine简介 ...

  9. 【ArcGIS Pro二次开发】(6):工程(Project)的基本操作

    在ArcGIS Pro中我们对工程的基本操作一般包括打开.新建.保存等.下面演示在二次开发中如何用代码进行以上操作. 新建一个项目,命名为[ProjectManager],添加8个按钮,命名为[Cre ...

最新文章

  1. 面试官:来说说单点登录的三种实现方式
  2. Ubuntu常用翻译工具——星际译王StarDict
  3. Redis哨兵主备切换的数据丢失及Redis数据持久化
  4. 内存泄露严重吗_内存泄漏–测量频率和严重性
  5. linux设置php时间,修改 linux 时区时间和 php 时区(示例代码)
  6. 火力发电厂与变电站设计防火规范_玻璃防火门在新版的GB500162014建筑设计防火规范中的应用与注意的事项...
  7. [Data Structure Algorithm] 有向无环图的拓扑排序及关键路径
  8. xp系统整个计算机非常慢,xp系统电脑运行慢太卡了怎么办|xp系统运行卡顿的解决方法...
  9. 端口扫描 -- Masscan-Gui
  10. java 怎么使用 设计模式对业务进行解耦(一)
  11. 华硕笔记本电脑点击桌面后,鼠标一直转圈;右键后,鼠标一直转圈?
  12. HDU5619 Jam's store(最小费用最大流 MCMF)
  13. 聚观早报 | Apple Music推出新功能;苹果汽车最早于2026年发布
  14. uint_32定义的说明
  15. pycharm下django案例的环境搭建运行
  16. head first java勘误_《深入解析Oracle》一书勘误表
  17. 二开七色中文视频 图片 小说网站源码模板 苹果cms V10
  18. android外星人游戏,外星人全面战争
  19. 向日葵Android受控端老版本,向日葵Android端版本更新:支持远程开关机
  20. 论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=>翻译及理解(持续更新中)

热门文章

  1. 根据电路建立微分方程
  2. html怎么搞一个微信图标,微信的图标怎么弄
  3. 为变量赋值(SQL)
  4. python模块之 paramiko
  5. 华为 BGP协议基础配置与总结
  6. Htmlunit 使用总结
  7. 数学对计算机的重要性
  8. 计算机论文要多少截图,毕业论文可以用截图吗 毕业论文注意事项
  9. 用实例给新手讲解易懂的RSA加密解密算法
  10. Python 图片去除背景