Esri公司推出的ArcGIS产品是一个非常强大的体系,里面包含ArcGIS Desktop、ArcGIS Server、ArcGIS Engine、ArcSDE、ArcGIS Online等,那么这些产品不仅仅包含基础平台软件,也包含供用户二次开发的组件,那么这些组件也包含C/S、B/S、移动端的,下面就简单的给大家说一下,也让初学者有一个简单的了解。
C/S架构
主要是应用于局域网方面,一般是安装开发软件,一般情况下机器都不连互联网,主要处理数据编辑、数据入库、地图整饰等对机器性能要求比较高,那么这种开发模式包含
B/S架构
主要应用于局域网或者互联网,一般情况下使用浏览器,主要是进行数据查询、分析等
针对现在火爆的移动开发
各种API相关的下载地址:http://support.esrichina.com.cn/support/download/software/
因为本人对B/S和移动端没有多少开发经验,就根据自己的理解简单介绍一下C/S的开发模式,其他的大家感兴趣的参考帮助吧。
从上面的图我们可以看出,针对ArcGIS提供的三种GDB类型,AO都可以进行操作,FileGDB API直观看出只能操作FileGDB,剩下的SQL和ArcSDE API只能操作ArcSDE GDB,因为ArcGIS Runtime我没怎么用过,ArcGIS10.1才有,先不做讨论。
看看都能做什么?
AO:可以这么说,凡是ArcGIS Desktop能够做的,AO都可以搞定,ArcGIS Engine开发(有些功能因为许可问题不能实现),这种开发模式就是开发系统或者在桌面的基础上增加相关功能。
空间SQL:对ArcGIS简单对象(点、线、面、多点、多片)进行查询、编辑(增删改),编辑支持ArcGIS版本和非版本,不支持复杂对象(拓扑、几何网络等),支持影像
ArcSDE API:其实跟SQL类似,但是多了关于ArcSDE管理、投影转换、Schema、XML对象操作等
FileGeodatabase API:FGDB创建删除、数据编辑、属性查询、简单空间查询等
开发语言
AO:.Net(C#、VB)、Java、QT、C++(有些根据版本不同不再支持)
SQL:会写SQL语句即可
ArcSDE API:Java、C++
FileGeodatabase API:C++
系统部署
AO:在ArcGIS Desktop机器上使用VBA、AddIn、Python或者其他
ArcGIS Engine:开发的话安装ArcGIS Engine Developkit,部署的话安装ArcGIS Engine Runtime
SQL:不同的数据库配置不太相同,以oracle为例,需要引用相关的dll或者so文件
ArcSDE10.1配置Oracle 监听器来使用SQL操作ST_Geometry
怎么配置 Oracle 侦听器来使用SQL操作ST_Geometry
FileGeodatabase API:把相关的dll加载上去即可
ArcSDE API:因为C++我没有用过,java的也没有怎么部署过,应该和普通java开发引用包部署类似开发效率
以下是我的一个同事做的相关测试在如下环境进行测试比较AO和SQL的效率
测试环境: 数据库服务器: CPU: Interl(R) Xeon™ 2.8G 4core memory: 4G CentOS 5.2 32bit Oracle: 11.2.0.1 测试数据:一个包含60个点串坐标的面状要素 测试方法:分别使用PL/SQL和ArcObject在loadonly模式下录入同样的数据1千万次在测试过程中,使用AO每秒可以插入500条记录,但是使用SQL每秒只能插入50条记录。
解释一下,为什么SQL查询和编辑比AO慢
编辑情况:WKT(string)============>AO对象================>BLOB
如果了解SQL操作的话都知道,我们传入的都是WKT串,比如POLYGON ((10.0 10.0, 50.0 10.0, 50.0 50.0, 10.0 50.0, 10.0 10.0)),那么我们需要将这个WKT串转换为AO对象,这一步是比较耗费CPU资源的,那么AO的话我们之间使用接口就可以将传入的坐标转换为AO对象,差别就出来了,剩下的就是将AO对象存储在数据库的BLOB对象。
查询情况:BLOB=================>AO对象============>WKT(string)===========>展现
那么在查询的时候,还需要将在数据库存储的BLOB转换为AO对象,AO可以直接将这些对象展示在Mapcontrol上,但是SQL还需要将AO对象转换为WKT串,最主要的是这些WKT串并不是最终的展示结果,我们还需将WKT串的坐标解析出来,显示出来,点对象或者线对象还好说,如果是面对象,洞、岛等就更耗时了。
那么性能最快的是什么呢,当然是ArcSDE API,光从名字上就可以看出来,ArcSDE API底层是C的程序,AO也是将ArcSDE API封装为COM组件,所以理论上也有性能的损失,所以性能方面的比较就是
ArcSDE API>AO>SQL
以下仅供参考
为什么SQL效率最低,还会有人用呢?
从上面的开发环境我们可以看出,SQL的开发对环境要求不高,可以说只要能够执行SQL语句就可以进行操作,前提还需要进行配置SQL引用
因为不是所有公司都是专业的GIS公司,其他IT公司也可以承担GIS项目,那么没有GIS专业或者ArcGIS经验的开发者来说,使用SQL操作就比较方面了,不需要再花时间去学习AO或者ArcSDE API的开发,这是好多公司选择SQL的一个原因。
另外好多公司的业务比如电力或者电信都是点、线居多,那么数据量少的话,效率方面差别是没有感觉的。
还有一点,SQL开发可以集成多种查询、构造函数与一体执行,这是其他两种开发方式不可比拟的
SQL>select objectid from hamlet where st_within(shape,st_buffer(st_point(118.9297,32.7093,2),0.01))=1; OBJECID ---------- 1 2 3 4 5从上面可以看到我使用WKT串构造一个点,使用ST_Buffer做一个缓冲区,然后再做一个查询,一个SQL语句都可以搞定,想想这个操作,那些开发方式需要几行代码?
另外,在SQL开发中还需要注重效率问题。
关于SQL开发的效率参考
另外,SQL开发并不是简单的SQL语句执行就行了,都是在一定的应用环境下,不能把空间SQL与简单的非空间数据表的操作进行比较,可以这么说,如果是对空间数据读,你随便折腾都没有问题,但是对空间数据写的话,就不是普通数据增删改那么简单了。
因为空间数据与非空间数据区别很大,简单说明,空间数据要记录位置,有投影,有空间索引,等,使用AO开发或者ArcSDE API这些东西系统都会自动做了,根本不需要用户来管理,举个例子,往一个要素类里面添加数据,北京要素类,我添加了个天津蓟县的数据,如果是AO操作,添加完毕之后,系统会自动更新该要素类的extent,因为天津的数据以及超出了北京要素类的范围,但是使用SQL操作增加肯定能加进去,但是自动更新要素类extent的步骤你明没有操作。你也可以理解为AO执行了两步SQL语句第一步insert数据,第二步就是更新extent,但是如果你不了解GIS的知识,只走第一步,肯定会有问题的。
所以SQL使用需谨慎。
ArcObject和ArcGIS Engine
好多ArcGIS开发者对这两个概念比较模糊,其实这些东西没有必要纠结,ArcObject是相关的COM组件
ArcObjects components are installed with ArcGIS for Desktop, ArcGIS Engine, and ArcGIS for Server and can be used in the following ways: To customize ArcGIS for Desktop applications To build stand-alone mapping applications To develop Web applications从上面的帮助可以看出,ArcObject包含三个方向
ArcGIS Desktop的自定义应用,扩展
ArcGIS Engine建立自己的应用
ArcGIS Server建立自己的Web应用(如果大家都觉得Web是经常使用WebAPI,其实原来的ADF或者现在的SOE都是AO的概念)
总体来说,没有必要纠结这个概念问题,ArcObject是基础,但是ArcObject可以实现的功能,ArcGIS Engine不一定可以实现。(至少我是这样理解的)
参考一下帮助文档其实也很清楚
上面的是支持ArcGIS Desktop开发
PS参考:
File Geodatabase API开发及空间SQL应用
SQL访问Geodatabase
ArcSDE SDK介绍
File Geodatabase API介绍
感谢@风的专栏作者帮助
-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
------------------------------------------------------------------------------------------------------