桌面GIS、WebGIS和移动GIS是GIS软件开发的三种模式。桌面GIS的功能更为丰富软件设计更加灵活加之历史溯源GIS软件开发的初学者往往都是从桌面GIS的开发入门这也符合软件开发的一般学习规律。具体到ArcGIS的开发就需要学习者从ArcGISEngine入手。由于ArcGIS的桌面、服务器和移动端是采用一套ArcObjects构建的因此在掌握了ArcGISEngine的开发思路和开发接口以后就会很容易地过渡到WebGIS和移动GIS的开发上来。同时由于基于ArcGISEngine进行二次开发已经成为业界桌面GIS开发的事实上的标准因此GIS行业的开发者大都是从学ArcGISEngine开始的。
地理信息科学专业学生的专业技能往往被简单描述为掌握GIS的基础理论(可以理解为本科所学的理论课程)掌握一门GIS软件(往往特指ArcGIS)学会使用一种语言进行GIS软件开发(基于ArcGISEngine使用C#语言开发是最常见的方式)。以作者多年的教学经验来看绝大多数学生经过四年的学习能够基本掌握GIS的理论知识大部分学生能够熟悉ArcGIS软件的操作但是只有少数学生能够掌握ArcGIS软件的开发。这是因为一个专业的所有理论课程是一个前后衔接、互相支持的体系当所有课程学完这个体系也就比较容易建立起来。ArcGIS软件尽管体系庞大学习有一定难度但它是专业理论知识的体现和印证经过多次练习也是能够掌握其操作过程的。软件开发不仅需要熟悉编程语言熟悉ArcGISEngine纷繁芜杂的接口还要熟悉软件架构与软件设计的有关知识而且软件开发具有一定的灵活性和创造性使得学习难度加大导致学生普遍存在畏难心理。由此尽管存在强烈的学习愿望实践上却往往停留在语言的语法学习和ArcGISEngine的接口学习层面上一遍遍翻阅书本却不去写下一行代码导致眼高手低、心有余而力不足。当然缺少一本合适的参考书也是一个重要的因素。
本书站在学生的角度面向工程的实际应用充分兼顾不同层次读者的知识结构和知识水平来设计。具有权威性、全面性和实战性由易及难、由浅入深、循循善诱、内容丰富既使基础比较薄弱而又有强烈的ArcGISEngine开发欲望的读者容易入门又使具有一定基础的读者有提高水平的余地。
全书分为4篇12章。第1篇是入门篇包括第1~2章在总体上介绍了ArcGISEngine编程的基本概念和开发桌面GIS应用软件的几种不同的方式。第2篇是数据篇包括第3~6章主要讲解地图的基本操作、空间查询与统计、地图制图和数据编辑等。这一部分内容是任何一个GIS系统都必须具备的功能。第3篇是分析篇包括第7~11章主要讲解矢量和栅格数据空间分析、几何网络分析、交通网络分析和三维分析等内容。第4篇是实例篇包括第12章介绍了Esri杯全国软件开发大赛总决赛一等奖的获奖作品并提供了全套的源代码供读者学习参考。
在学习过程中建议所有读者都读一下第1章和第2章从总体上了解ArcGISEngine编程的概念和方法。第2章介绍的ArcGIS二次开发的历史有助于读者了解ArcGISEngine的由来便于更好地理解ArcGISEngine的程序设计与架构。第3章是地图的基本操作包括数据加载、地图浏览、量测、书签、数据视图和布局视图、鹰眼和图层控制等内容。这一章是初学者必须认真学习的章节。一是该章内容是所有GIS软件必备的二是该章接口较少、相对简单便于自学。从未进行过编程的读者建议将这一章的代码按照光盘逐字逐句地重新敲一遍以体会软件编译与简单调试的技巧。第4章查询与统计对应于ArcGIS的选择菜单包括属性查询、空间查询和图形查询还包括选择集的设置和统计分析等功能。第5章介绍地图的样式与符号化、专题制图、地图整饰等内容。第6章数据编辑以一个编辑流程的操作顺序为主线进行空间数据编辑的详细讲解。这几部分内容是一个GIS软件的功能框架如果读者特别是在校学生熟练掌握这些内容也就能算一个基本合格的GIS程序员了。空间分析篇的内容有一定的深度读者可以根据需要有选择地学习。第7章矢量分析介绍了空间拓扑和空间关系、叠加分析、数据格式转换、添加XY 数据和使用GP工具进行分析等内容。第8章栅格分析的内容对应于ArcGIS的空间分析可实现空间插值、填挖方的计算、密度分析等工程中常用的功能。鉴于广大读者对网络分析很感兴趣而现有的教材和参考书对这一部分往往语焉不详或者概念不甚清楚。本书特意安排了第9章几何网络分析和第10章交通网络分析两章供读者甄别学习几何网络分析主要解决城市管线的网络分析对应于ArcGIS的UtilityNetworkAnalyst工具条;交通网络分析用于模拟现实世界的交通网络对应于NetworkAnalyst工具条。第11 章三维分析介绍了MultiPatch 和TIN 的各种分析还给出了SceneControl和GlobeControl进行三维可视化的方法并给出了一个三维数字校园的综合实例贴近学生生活激发学习兴趣。第12章是Esri大赛全国总决赛一等奖的获奖作品全部由在校本科生完成。读者特别是在校学生可以此为对照看看自己的编程水平处在一个什么样的位置。在你认真学习完本书并掌握了本书的内容后相信你的编程水平定会超过获奖作品的水平。
本书读者应该特别注意光盘代码和数据的配合使用。本书代码都经过严格测试确保都能正确运行如果在使用中发现不能正常运行的情况首先应该检查自己的软件配置和数据情况然后再去考虑代码是否存在错误。本书的代码来源于作者的长期积累包括很多实际工程的代码其中必然有来自于ArcGISEngine帮助和网上的代码但是这些代码经过了多次加工已无法溯源也就无法一一标引。由此尽管本书的代码大多来源于工程实践且具有很强的工程价值但作者并不授权读者将这些代码应用于商业活动。同时在编入本书的过程中为了方便读者的学习减弱了很多代码的封装力度但是考虑工程上往往具有较强的封装性在本书的后几章中对代码进行了适度封装读者要注意哪些函数是自己编写的哪些函数是系统提供的。还有不同章节在实现类似功能的时候代码也不完全一样作者刻意保留了这些差别目的是使读者认识到同一个功能可以具有不同的实现方法便于开阔视野、打开思路。
除了第3章建议从未编过程序的读者一个个字母敲入之外当掌握了代码输入的基本技巧和熟悉了基本的调试方法后其他章节的代码建议直接拷贝到自己的工程中或者直接运行光盘的代码在你体会到程序正确运行的喜悦的同时也进一步激发了你学习编程的兴趣和克服困难的信心这对于快速入门是大有裨益的。因为很多初学者都是在学习了较长一段时间后发现自己的代码总是不能运行而慢慢地磨掉了学习的信心和乐趣从而放弃学习编程的。
此外读者在学习ArcGISEngine编程的时候要注意编程实现的功能和ArcGIS已有功能的联系。实际上大多工程项目的功能如果不编写程序仅仅使用ArcGIS也基本上可以满足要求之所以还要编程目的无非是更便捷化、智能化、个性化一些。在某种程度上来讲编程序不就是把软件多次点击实现的功能合并成一次点击而实现吗? 在这种意义上说读者要想学好编程首先应该熟悉ArcGIS软件在实现一些功能的时候建议先在ArcGIS中操作一遍看看它是如何设计和操作的这将有助于优化代码编写和功能实现的流程。
为使本书博采众长特意邀请了多个高校的教师和企事业单位的一线程序员参加编写。本书架构由山东科技大学的牟乃夏、戴洪磊青岛市勘察测绘研究院的王海银南阳师范学院的李丹河南城建学院的高松峰、武汉理工大学的詹云军和济南大学的冯群等多次讨论确定并各负责了一部分内容的编写。参加本书编写的人员还有山东科技大学的张灵先、杨腾飞、王普乐、祝帅兵、张园园青岛积成电子有限公司的李乃林北京洛斯达科技发展有限公司的刘永涛福建省地质测绘院厦门分院的洪平卫等。研究生骆川、杨佰义、张昌景、郭俏琳、赵雨琪、张娟、朱海川、徐玉静、赵明月等对各章节的文稿和代码进行了反复的检查和测试。为了验证初学者特别是在校本科生对本书的需求与期望本科生林尚纬等人也对部分文稿进行了学习和编程他们从一个初学者的角度提出了中肯的意见。测绘出版社的编辑为本书的出版付出了大量心血在此一并表示衷心感谢!
本书从2012年开始规划和编写由于体系庞大参与人员众多着实遇到了不少困难加之我个人工作的羁绊、中途个别参编人员的更换也曾有过放弃的念头。但此时我以山东省高级访问学者和博士后身份来到中科院地理所陆锋研究员的团队进行学习和科研这个团队奋发向上的激情、精益求精的理念、团结务实的态度和孜孜以求的精神使我在各种困难中学会了坚持和坚强也促使了本书的出版再次特别向这个团队表示感谢和敬意!
尽管本书近90万字但是依然不能全面阐述ArcGISEngine编程的所有内容。ArcGISEngine的帮助才是最全面、最丰富的编程知识库读者在熟悉了ArcGISEngine的编程后要学习和习惯使用它的帮助来完成本书没有覆盖的功能。
虽然本书编写用了两年半的时间所有章节多次易稿但由于我们水平所限错误与不妥之处在所难免敬请读者批评指正。读者的批评和建议请致信
mounaixia@163.com或者访问作者的新浪博客和微博@山东科大牟乃夏老师GISer作者将不定期发布本书的勘误读者的建议、意见和学习指导等。