几天时间过完了一本《WebGIS 从基础到开发实践》
(电子版下载地址: http://www.25mg.cn/wp/training/webgis/webgis从基础到开发实践/)
如今阅读技术书籍也同读小说一样,风里来雨里去,恢宏巨著,从洪荒原始到当今现代。由于是媳妇在图书馆给借的书,在这里将这本书做一个总结和笔记。
一、为什么要读这本书。
美国的esri公司,全称美国环境系统研究所公司(Environmental Systems Research Institute, Inc.)是全世界最大的最专业最领先的地理信息软件及解决方案提供商,相当于oracle在数据库行业的地位,也相当于windows在操作系统领域的地位,也相当于IBM在服务器行业的地位,还相当于EMC在存储设备领域的地位。没错,esri是一家技术垄断的商业公司,因此它能够提供众多的,全面的,可靠的,专业的地理信息解决方案。
但是,既然涉足信息技术领域,那么就必然有开源社区与之匹配(作对),由于本人目前只专注webgis领域,故仅提web的B/S两端。WebGIS的服务器端主要负责将目前所有的地图存储格式及地理信息,进行适当的格式化,并按照一定的规则提供成为Web上面能够访问的资源。esri的产品叫做ArcGIs server,相应的开源软件叫做geoServer。WebGIS的客户端都是基于javascript语言的,主要功能为获取WebGIS服务器资源,适当组织后展示给用户,并提供一些交互功能。esri在前端的产品就是这个ArcGIS API forJavaScript框架,这个东西应该是随着其他产品附送的,没有看到有收费要求,在官网上面注册就可以下载(2018年中美贸易大战,禁止中国区下载,可以到此处下载),也可以使用CDN的在线版本。相应的前端开源软件为大名鼎鼎的openlayers。
二、这本书的内容范围
这本书针对前端应用,介绍了gis的一下基础知识,对于ArcGIS server仅简单介绍发布服务的方法,另介绍了dojo的使用,介绍了ArcGIS API for JavaScript框架的使用。书中内容繁杂,略去所有无用的东西,只留干货。
三、地图资源
自己发布
可以使用ArcMap或者ArcCatalog软件来发布自己的ArcGIS服务,ArcGIS server发布的服务默认都是REST风格的,当然也支持其他风格供需要的客户端使用。ArcGIS server发布的服务的url类似于:http://<hostname>:<port>/arcgis/rest/services。
在线资源
ArcGIS Online提供了一些esri公司提供的公共的在线的ArcGIS server服务,主要有下面三个位置:
http://server.arcgisonline.com/ArcGIS/rest/services
http://sampleserver1.arcgisonline.com/arcgis/rest/services
http://sampleserver2.arcgisonline.com/arcgis/rest/services
访问进去之后即可看到所有服务的详细内容,默认是REST风格。可以看到:图层名称、文档信息、支持的程序接口等。
另外还有众多的其他的在线资源,例如国内的百度地图(需要做特殊的坐标转换),天地图,高德地图,国外的bing地图,谷歌地图等等。
这么多的地图资源,无论是来自于建设规划、商业设计还是在线应用等领域的需求,基本上都能满足。
四、ArcGIS API for JavaScript
dojo
这个框架基于dojo框架,开发。本人也是第一次学习dojo框架,之前看到相关的语法(reqire/define)都会避之不及,通过学习,认为dojo还是一个不错的框架。dojo基本上可以实现jquery及其一些组建(例如easyui)的大部分类似功能,其几乎包含了js操作的所有需求。其与其他框架最打的区别是按需加载,仅加载有用的组建。可以很大的减少网络开销,提高页面相应效率。所以说,对于ol办公系统,jquery系列还算可以,但是如果是用户群里较大,访问较为频繁的web站点,那么应该是使用dojo。至于为什么要使用框架,一方面是加快开发速度,统一页面风格,提高代码质量,另外一方面很大的原因是要解决跨浏览器的问题,这个做个前端的人都可以理解。在这里还要推荐一个解决跨浏览器问题的小的工具,叫做Ployfill,具体自己百度。
哈哈,书上两章的内容,我一段话带过。具体学习的话可以直接上dojo toolkit的官网,翔实的学习资料,众多的demo,跟着做几个就明白它的套路了。
地图对象(Layer-Map-View)
本文不分析框架结构,有兴趣的可以直接上API网站自行组织,本人发现这个框架(名字太长,后面通称‘这个框架’)的结构有一定的变化,毕竟是商业公司的代码,改起来好不心疼,只要是领导觉得对,就改。
1.携带地图资源的对象是Layer(直接决定了能够显示的在线地图种类)
最主要的是TileLayer,可以加载所有符合WMS标准的SOAP格式的地图Web服务,不需要问这些名词是什么,只管用就行。ArcGIS server发布的地图服务一般都支持这个格式。其他的服务器发布的也基本上都支持。
对于一些比较浪的地图服务,你用TileLayer对象无能为力,可以使用WebTiledLayer类来加载,可以自定义加载参数(x,y,z)。
对于比较名牌的地图服务,比如osm,可以直接在Map对象中,定义basemap属性为‘osm’来实现。同时Map对象的basemap属性还支持如下众多,做地图的话,个人认为足够了,如果想使用速度更快的国内底图,那么就尝试前面两段中的两个对象吧。
{name:'streets'},
{name:'satellite'},
{name:'hybrid'},
{name:'topo'},
{name:'gray'},
{name:'dark-gray'},
{name:'oceans'},
{name:'national-geographic'},
{name:'terrain'},
{name:'osm'},
{name:'dark-gray-vector'},
{name:'gray-vector'},
{name:'streets-vector'},
{name:'topo-vector'},
{name:'streets-night-vector'},
{name:'streets-relief-vector'},
{name:'streets-navigation-vector'}
WMSLayer/WMTSLayer类是用来加载WMTS规范的地图的,之间我没有看出功能上的区别,只是格式不同而已,个人认为属于比较早期各种技术不太先进的时候,大家做的一套解决方案,现在不知道用的还多不多,理解有限,诚恳希望得到您的矫正。
GraphicLayer是纯客户端的一个layer对象,用来承载数据表,图形,与Draw工具搭配使用来显示和符号化Draw绘制出来的图形。GraphicLayer还可以相应一些事件。
MapImageLayer允许你把一张image展示到地图上,图像可以来自服务器,甚至可以来自前端客户机,但是和图像一同提供的还要有TFW文件(用来描述图像的空间位置信息)。
KMLLayer 基于谷歌标准的地图服务都可以用这个来加载
这个框架不支持热度图,因此需要采用第三方工具,例如Patrick Wied,集成一个DynamicMapServiceLayer类,实现热度图。
2.组织图层资源的对象是Map
Map可以将众多的图层组织在自己内部(一个数组属性)
3.呈现地图的对象是View
这个框架提供了两个实现MapView和SceneView,前者是2d的地图,后者是3d的地图,效果很不错。
空间参考系统
计算机专业的人对于所谓的参考系统都不是很理解。对于一个基于坐标的应用,那么每个坐标都要有其基准,或者说通过什么来确定这个坐标值的相对位置。空间参考系统分为:地理坐标系统和投影坐标系统。地理坐标系统是真实的地球定位坐标系统,一般采用经纬度坐标系统,也有极坐标系统。投影坐标系统,是为了解决平面显示球形对象时候,的一个投影坐标系统,将一个球上面的所有点通过一定的投影方式对应到平面上来。由于html5技术的实现,web已经可以进行三维展示,就像上面图片中的地球一样,所以这里投影的目标不一定都是2维的平面,也有可能是三维的球面。
SpatialReference类用来设置空间参考系统。
EPSG,在地理信息行业这个简写经常见到,那么有多少人知道它的来历呢。European Petroleum Survery Group欧洲石油调查组织是也。他们对于空间参考系统进行了总结,并且都编上了id,例如id为4326的空间参考系统极为WGS84地理坐标系统,id为102113、102100、3857等都是web墨卡托投影,只是其中的参数稍有区别。这个id的全称为wkid(Well-Known id)。
对于使用地理坐标系统和投影坐标系统的地图,都要求切片图层的空间参考与地图的空间参考一致。因此涉及到需要将某一种地理坐标系统转换为某一种投影坐标系统,或者反过来转换。这个框架的esri/geometry/webMercatorUtils模块中提供了函数可以进行简单转换,对于复杂的转换需要调用后台的esri/tasks/GeometryService几何对象服务完成。
一般从网络上通过SOAP或者REST风格接口获得的符合WMS、WMTS规范的地图切片资源都会自带有空间参照系统,可以从Layer对象中获取出来。如果要指定Map的空间参照系统,则可以在定义Map对象的时候,指定属性extent,extent属性中需要包含spatialReference属性指明即可。
几何对象
这个是用来实现地图对象的交互性的,可以自己在地图上面绘制一些图形。esri/geometry/Geometry系列对象为几何图形类,可以使用esri/toolbars/Draw类来自定义小工具(widget)实现绘制功能。openlayers中实现绘制自定义图形处理的我觉得比这个框架要好,openlayers中是把自定义图形做成了一个vectorLayer,和从服务器加载过来的矢量图层一样的对象,这样在控制起来,以及转换成为其它格式输出或者提交都更加方便。
暂时结束到这里,还有要素图层,专题图层和空间分析三大块,这些也是esri家族的拿手好戏,等到下次再总结吧。对于实际代码,由于版本更新较快,可以到官网上面查找最新的demo和api。欢迎留言。