吐槽下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的屁股后面做事。
吐槽下Arcgis的二次开发相关推荐
- 【ArcGIS Pro二次开发】(15):用地用海名称和代码互转
在国土空间规划中,用地用海的名称和代码是一一对应的,手动修改用地代码后,还需要相应的修改名称,纯纯的重复工作,因此做了这个工具. 之前用Arcpy做过同样的功能的工具,参看这个: ArcGisPro脚 ...
- Arcgis ArcEngine二次开发: 输出宗地图、宗地草图、权属协议书附图、房产分层分户图、公示图、三调土地利用图、行政区划图、标准分幅图等各种图件
1.Arcgis ArcEngine二次开发: 输出宗地图.宗地草图.权属协议书附图.房产分层分户图.公示图.三调土地利用图.行政区划图.标准分幅图等各种图件 有需要联系QQ:185242573. ...
- 【ArcGIS Pro二次开发】系列学习笔记,持续更新,记得收藏
一.前言 这个系列是本人的一个学习笔记. 作为一个ArcGIS Pro二次开发的初学者,最困扰的就是无从入手.网上关于ArcGIS Pro二次开发的中文资料极少,官方文档对于我这样的英文苦手又太不友好 ...
- arcgis engine二次开发python-使用C#配合ArcGIS Engine进行地理信息系统开发
简单的地图读取.展示终于到暑假了...开始认真整理整理相关学习的心得体会咯~ 先把很久之前挖的关于C# 二次开发的坑给填上好了~ 这次先计划用一个月把C# ArcEngine 10.0相关开发的学习心 ...
- 【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功能的应用部 ...
- ArcGIS Pro二次开发环境配置及项目创建示例
一.软件版本 ArcGIS Pro 2.8 Visual Studio 2019 二.组件 ArcGIS Pro 2.8 SDK for .NET: proapp-sdk-templates.vsix ...
- arcgis python二次开发_arcgis二次开发python_arcgis二次开发是什么_arcgis二次开发
VS2013中ArcGIS二次开发部分问题问题解决方法VS2013中新建项目时没有ArcGIS模板解决办法:安装ArcGIS10.x会自动生成C:\Program Files x86 \Microso ...
- 【ArcGIS Engine二次开发】入门基础(1):ArcGIS Engine简介及开发环境搭建
文章目录 ArcGIS Engine概述 ArcGIS Engine与ArcObjects的关系 ArcGIS Engine下载及安装 ArcGIS Engine概述 ArcGIS Engine简介 ...
- 【ArcGIS Pro二次开发】(6):工程(Project)的基本操作
在ArcGIS Pro中我们对工程的基本操作一般包括打开.新建.保存等.下面演示在二次开发中如何用代码进行以上操作. 新建一个项目,命名为[ProjectManager],添加8个按钮,命名为[Cre ...
最新文章
- 面试官:来说说单点登录的三种实现方式
- Ubuntu常用翻译工具——星际译王StarDict
- Redis哨兵主备切换的数据丢失及Redis数据持久化
- 内存泄露严重吗_内存泄漏–测量频率和严重性
- linux设置php时间,修改 linux 时区时间和 php 时区(示例代码)
- 火力发电厂与变电站设计防火规范_玻璃防火门在新版的GB500162014建筑设计防火规范中的应用与注意的事项...
- [Data Structure Algorithm] 有向无环图的拓扑排序及关键路径
- xp系统整个计算机非常慢,xp系统电脑运行慢太卡了怎么办|xp系统运行卡顿的解决方法...
- 端口扫描 -- Masscan-Gui
- java 怎么使用 设计模式对业务进行解耦(一)
- 华硕笔记本电脑点击桌面后,鼠标一直转圈;右键后,鼠标一直转圈?
- HDU5619 Jam's store(最小费用最大流 MCMF)
- 聚观早报 | Apple Music推出新功能;苹果汽车最早于2026年发布
- uint_32定义的说明
- pycharm下django案例的环境搭建运行
- head first java勘误_《深入解析Oracle》一书勘误表
- 二开七色中文视频 图片 小说网站源码模板 苹果cms V10
- android外星人游戏,外星人全面战争
- 向日葵Android受控端老版本,向日葵Android端版本更新:支持远程开关机
- 论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=>翻译及理解(持续更新中)