免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 2524|回复: 2
收起左侧

[技术交流] arcgis api for js入门开发系列二不同地图服务展示(含源代码)

[复制链接]

45

主题

8272

铜板

17

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
1122
QQ
发表于 2016-10-30 17:53 | 显示全部楼层 |阅读模式
      上一篇介绍了arcgis api离线部署,这篇开始正式介绍arcgis api for js开发;想要学习webgis开发,首先得熟悉了解前端技术,比如界面布局设计的html+css,核心的是javascript(js),arcgis api就是js写的,就是说想要开发gis功能前提下,你得熟悉了解js,不然你连源代码都看不懂。在这里,推荐esri官网的arcgis api for js:https://developers.arcgis.com/javascript/3/jsapi/;里面详细的介绍arcgis api各个类的介绍,还有就是在线例子:https://developers.arcgis.com/javascript/3/jssamples/;这个也是学习arcgis api的好素材。
      好了,进入正题,简单谈谈我的开发环境,开发工具:Microsoft Visual Studio 2012,前端技术:html+css+js,后台开发语言:C#,地图服务来源:arcgisserver以及在线天地图服务;附上我项目目录截图:
      1.项目的css目录,主要是css文件和image文件等;2.核心的js目录,包括arcgis api的js文件,jquery,地图开发的js文件,地图配置文件config以及自定义解析天地图的图层类等等;3和4,项目的界面html。
       效果图如下:
      下面谈谈个人认为重要之处,想要了解全部的话,请下载项目源代码运行看,最后地方提供下载。
       (1)map.html
               这个页面是主界面,arcgis api实现地图的加载显示功能之前,必须要引用arcgis api必须的css和js文件,引用的地方就是在map.html页面:
  1. <head>
  2. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  4.     <title>ArcGIS API for JS开发系列示例</title>
  5.     <script type="text/javascript">
  6.         //配置arcgis拓展解析天地图服务类引用的路径
  7.         dojoConfig = {
  8.             parseOnLoad: true,
  9.             packages: [{
  10.                 name: 'tdlib',
  11.                 location: this.location.pathname.replace(/\/[^/]+$/, "") + "/js/tdlib"
  12.                 //location: "js/tdlib"
  13.             }]
  14.         };
  15.     </script>
  16.     <script type="text/javascript" src="js/jquery/jquery.js"></script>
  17.     <link href="Content/map/map-index.css" rel="stylesheet" type="text/css" />
  18.     <link href="Content/bootstrap.css" rel="stylesheet" type="text/css" />
  19.     <link href="Content/site.css" rel="stylesheet" type="text/css" />
  20.     <link rel="stylesheet" href="js/arcgisapi/3.14/dijit/themes/nihilo/nihilo.css" />
  21.     <link rel="stylesheet" href="js/arcgisapi/3.14/esri/css/esri.css" />
  22.     <script type="text/javascript" src="js/arcgisapi/3.14/init.js"></script>
  23.     <script type="text/javascript" src="js/main/map.config.js"></script>
  24.     <script type="text/javascript" src="js/main/map.js"></script>
  25. </head>
复制代码
其中的tdlib路径是自定义解析天地图服务的图层类目录;map.config是地图配置文件,配置一些地图服务的信息,比如空间参考系、地图全图范围、初始化范围、lods、地图服务等等;map.js是开发gis功能的核心js文件,实现地图的初始化以及图层加载等等;
       (2)tdt.html
               这个页面类似map.html的作用,不过用来解析天地图服务的页面,显示在线天地图的效果,这里也是项目的瑕疵地方,为啥用两个页面的,因为arcgis地图服务我用自己本机的,切图的比例个在线天地图的不是一致的,所以在map.html展示天地图不了,所以跳转另一个页面来展示了。  
       (3)map.config
               配置地图的常量信息,可以在代码需要调用时候共享,一来是避免在代码里面写死,二来是方便实施人员部署项目。
               重点说一下lods ,这个是相对瓦片地图服务来说的,用来设置显示瓦片地图服务的级别,这个lods获取来源你发布的切片地图服务,不同的切片比例,这里填写的信息                是不一样的,这个很关键,不然填错了,底图显示不了的。
               比如我本机的是:
  1. /* --------------------------------地图初始信息配置-------------------------------- */
  2. function MapConfig() { }
  3. MapConfig.mapInitParams = {
  4.     fullExtent: {//全图范围
  5.         xmin: 121.29585473952106,
  6.         ymin: 39.49550677343447,
  7.         xmax: 123.05162192862765,
  8.         ymax: 139.982938778863684
  9.     },
  10.     extent: {//初始化范围
  11.         xmin: 120.8696333,
  12.         ymin: 38.65953686,
  13.         xmax: 123.6199347,
  14.         ymax: 40.202622
  15.     },
  16.     spatialReference: {//地图空间参考坐标系
  17.         wkid: 4326
  18.     },
  19.     lods: [//针对瓦片的地图服务的,用来控制瓦片级别的显示,有时候切片级别太多的话,可以只显示部分的级别地图
  20.            //resolution scale这些值的获取参照发布的切片地图服务详情
  21.            { "level": 0, "resolution": 0.00118973050291514, "scale": 500000 },
  22.            { "level": 1, "resolution": 5.9486525145757E-4, "scale": 250000 },
  23.            { "level": 2, "resolution": 2.3794610058302802E-4, "scale": 100000 },
  24.            { "level": 3, "resolution": 5.710706413992673E-5, "scale": 24000 },
  25.            { "level": 4, "resolution": 2.3794610058302804E-5, "scale": 10000 }
  26.     ]
  27. }
  28. /*地图调用*/
  29. MapConfig.vecMapUrl = "http://localhost:6080/arcgis/rest/services/dlsearch/MapServer";//ArcGIS动态服务
  30. MapConfig.imgMapUrl = "http://localhost:6080/arcgis/rest/services/dlMap/MapServer";//ArcGIS切图服务
复制代码
(4)map.js
               开发地图的核心js文件,实现展示地图,必须创建一个地图对象:
  1. var map = new esri.Map("map", { logo: false, lods: MapConfig.mapInitParams.lods });//创建一个map对象,然后地图填充在div容器,通过div的ID(map)来关联;{}里面是构造地图的可选参数设置,logo设置图标是否显示,lods是设置瓦片地图的显示级别level有哪些,从配置文件config获取
复制代码
默认展示底图为arcgis的瓦片地图:
  1.    var layer = new esri.layers.ArcGISTiledMapServiceLayer(MapConfig.imgMapUrl);//创建一个ArcGISTiledMapServiceLayer对象,解析arcgis的瓦片服务图层;MapConfig.imgMapUrl是layer对象的参数,请求发布地图服务的url,用来获取地图服务的数据来渲染
  2.     layer.id = "img";//layer的id,用来方便后面获取getLayer(id)图层
  3.     map.addLayer(layer);//layer添加到地图map对象
复制代码
地图初始化显示的范围:
  1. //设置地图初始范围
  2.     var initExtent = new esri.geometry.Extent({ xmin: MapConfig.mapInitParams.extent.xmin, ymin: MapConfig.mapInitParams.extent.ymin, xmax: MapConfig.mapInitParams.extent.xmax, ymax: MapConfig.mapInitParams.extent.ymax, spatialReference: MapConfig.mapInitParams.spatialReference });
  3.     map.setExtent(initExtent);
复制代码
    地图切换思路,来展示不同的地图服务,这里我采取的是当前地图只展示一个layer,即是切换不同地图服务之前,先删掉之前存在的图层;其实也可以采取设置图层的可见以及隐藏来达到目的的,这样不用每次都删掉再添加的思路。
  1. //地图切换
  2.     $("#BasemapToggle img").bind("click", function () {
  3.         var type = $(this).attr("id");
  4.         if (map.getLayer("img"))
  5.             map.removeLayer(map.getLayer("img"));
  6.         if (map.getLayer("vec"))
  7.             map.removeLayer(map.getLayer("vec"));
  8.         //三角形标识切换
  9.         switch (type) {
  10.             case "imgmap"://加载ArcGIS切图服务
  11.                 var layer = new esri.layers.ArcGISTiledMapServiceLayer(MapConfig.imgMapUrl);
  12.                 layer.id = "img";
  13.                 map.addLayer(layer);
  14.                 break;
  15.             case "vecmap"://加载ArcGIS动态服务
  16.                 var layer = new esri.layers.ArcGISDynamicMapServiceLayer(MapConfig.vecMapUrl);
  17.                 layer.id = "vec";
  18.                 map.addLayer(layer);
  19.                 break;
  20.             case "tdtmap"://加载天地图服务
  21.                 location.href = "tdt.html";//location.href实现客户端页面的跳转
  22.                 break;
  23.         }
  24.     });
复制代码
   最后,提供压缩的源代码和测试地图数据:http://pan.baidu.com/s/1nvAnSX7
GIS作品:百度搜索:GIS之家(https://shop116521643.taobao.com/shop/view_shop.htm);
QQ兴趣部落GIS技术交流:gis之家(http://buluo.qq.com/p/barindex.html?bid=327395);
GIS毕业设计&项目承接群:238339408;
GIS技术交流群:432512093


1

主题

2万

铜板

22

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1984
发表于 2016-10-31 14:15 | 显示全部楼层
难道这个帖子要上精华?
回复 支持 反对

使用道具 举报

45

主题

8272

铜板

17

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
1122
QQ
 楼主| 发表于 2016-10-31 14:19 | 显示全部楼层
shen1231500 发表于 2016-10-31 14:15
难道这个帖子要上精华?

估计哪有这么容易,这个论坛貌似不太重视gis开发的,都是gis应用的多:(
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表