其他分享
首页 > 其他分享> > 地理信息系统(GIS)系列——Portal for ArcGIS

地理信息系统(GIS)系列——Portal for ArcGIS

作者:互联网

1、Portal

Portal 是一个基于 Web 的应用,它能提供个性化,单点登陆,不同源的内容聚合,和信息系统的表示层集中。聚合是整合不同 Web 页面源数据的过程。为了提供用户定制的内容,Portal 可能包含复杂的个性化特征。为不同用户创建内容的 Portal 页,可能包含不同的 Portlet 集。

Portal 的基本架构

Portal Web 应用处理客户请求,找回用户当前页中的 Portlet,然后调用 Portlet 容器,重新获取各个 Portlet 的内容。Portlet 容器提供Portlet 的运行时环境,并通过 Portlet API 调用 Portlet。Portal 通过 Portlet Invoker API 调用 Portlet 容器。Portlet 容器通过 Portlet Provider SPI(Service Provide Interface)获取 Portal 信息。

基本的 Portal 页面组件

Portal 页面本身代表一个完整的标记文档,并且聚集了一些 Portlet 窗口。除 Portlet 外,页面可能还包含导航区和标志区(Navigation Area and Banners)。一个 Portlet 窗口包含一个标题栏、装饰和Portlet 产生的内容。装饰可以包括改变 Portlet 窗口状态和模式的按钮。

Portlet

Portlet 是基于 Java 的 Web 组件,处理 request 并产生动态内容。Portlet 产生的内容称为片段,即一段遵守中心规则的标记(比如HTML,XHTML,WML(无线标记语言)),多个片段可以聚合成一个完整的文档。多个 Portlet 聚合在一起,组成 Portal 页。Portlet 容器控制 Portlet 的生命周期。
Web 客户通过 Portal 实现的 request/response 范例与 Portlet 交互。通常,Portlet 中的动作会被 Portal 接受,从而用户与 Portlet 中的内容交互(比如点击 Portlet 中的链接,提交表单),提交到Portlet 的目标。
对不同的用户,根据其配置,同一个 Portlet 会产生不同的内容。

Portlet 容器

Portlet 容器提供它们需求的运行时环境并运行 Portlet。它包含Portlets 并控制它们的生命周期。容器提供 Portlet 参数的持久存储机制,它接受来自 Portal 的 request,并在其持有的 Portlet 上执行 request。容器不负责 Portlet 产生内容的聚合,Portal 自己处理内容聚合。

2、Portal for ArcGIS

地理信息门户系统,新一代WEBGIS开发模式,一个综合性的GIS门户。

Portal for ArcGIS 特点
Portal for ArcGIS 主要功能
Portal for ArcGIS 定位
Portal for ArcGIS 理念

在这里插入图片描述

Portal for ArcGIS 组成
Portal for ArcGIS 资源类型
地图
数据图层
数据文件
应用程序
工具

3、Web Mapping APIs

Web Mapping APIs 主要 API 类
Portal
new Portal(url)
Portal 属性
Portal 方法
Portal 事件
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <!--The viewport meta tag is used to improve the presentation and behavior of the samples on iOS devices-->
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Grid Layout</title>

    <link rel="stylesheet" href="css/grid960.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.14/esri/css/esri.css">     
    <script>var dojoConfig = { parseOnLoad: true };</script>
    <script src="http://js.arcgis.com/3.14/"></script>
    <script>
        dojo.require('esri.arcgis.Portal');			// 注册门户类
        dojo.require("esri.IdentityManager");		// 身份管理器
        dojo.require("dojox.lang.aspect");			// 外貌

        var displayOptions = {						// 显示选项
            templateUrl: 'http://www.arcgis.com/apps/OnePane/basicviewer/profile.html',
            themeName: 'gray',						// 样式
            numItemsPerPage: 6,						// 每页的项目
            group: {								// 组对象
                "owner": "Kelly",
                "title": "Running Routes"
            },
            portalUrl: 'http://www.arcgis.com'
        };
        var portal;
        var group;
        var nextQueryParams;
        var queryParams;

        function init() {
            // 创建门户对象
            portal = new esri.arcgis.Portal(displayOptions.portalUrl);
            // 绑定加载事件
            dojo.connect(portal, 'onLoad', loadPortal);
            // 对门户执行一个查询返回一个延迟,当解决returnsPortalQueryResult包含一个数组ofPortalItem
           	// 对象输入查询相匹配的结果
            // 或文本数据可以通过项目数据资源。查看ArcGIS门户API其他文档项目的更多细节。
            // 参数一门户,参数二为方法,
            // 参数三定义为一个对象,或一个函数,它返回这样的对象,或一个数组之前的项目
           	// 建议对象可以定义成员函数: afterReturning(在这之后返回) afterThrowing(在这之后抛出)
            dojox.lang.aspect.advise(portal, "queryItems", {               
            	{
            	// cc为延迟(Deferred)对象
                afterReturning: function (cc) 
                	// then添加新的回调延迟函数,result为PortalQueryResult对象,详细信息查询的结果
                    cc.then(function (result) {
                    	// 下一组结果的查询参数
                        nextQueryParams = result.nextQueryParams;
                        // 第一组结果的查询参数
                        queryParams = result.queryParams;
                    });
                }
            });
        }

        function loadPortal() {
        	// 查询参数
            var params = {
                q: 'title: ' + displayOptions.group.title + ' AND owner:' + displayOptions.group.owner
            };
            // 根据参数,查询门户资源内容
            portal.queryGroups(params).then(function (groups) {
            	// 根据参数,延缓推出查询内容
                // 获得群组信息,包含缩略图的url groups.results.返回结果
                // 设置组的信息
                if (groups.results.length > 0) {
                    // 获取群组下的一个组对象
                    // 第一个对象
                    group = groups.results[0];
                    // 组织的缩略图的url(完整路径)
                    if (group.thumbnailUrl) {
                        dojo.create('img', {
                        	// 组织的缩略图的url(完整路径)
                            src: group.thumbnailUrl,
                            width: 64,
                            height: 64,
                            // 标题
                            alt: group.title
                            // 绑定缩略图标签
                        }, dojo.byId('groupThumbnail'));
                    }
					// 组标题
                    dojo.byId('groupTitle').innerHTML =group.title;
                    // 组片段描述
                    dojo.byId('sidebar').innerHTML = group.snippet;

                    // 检索从组织和显示web地图和应用程序
                    var params = {
                        q: ' type: Web Map',
                        // 页码
                        num: displayOptions.numItemsPerPage
                    };
                    // 查询组内的资源
                    // 执行更新方法
                    group.queryItems(params).then(updateGrid);
                }
            });
        }
        // 查询组内项目资源展现出来
        function updateGrid(queryResponse) {
            // 更新画廊下一页项目
            var galleryList = dojo.byId('galleryList');
            // 空画廊删除现有的项目
            dojo.empty(galleryList);

            // 导航按钮
            (queryResponse.results.length < 6) ? esri.hide(dojo.byId('next')) : esri.show(dojo.byId('next'));
            (queryResponse.queryParams.start > 1) ? esri.show(dojo.byId('prev')) : esri.hide(dojo.byId('prev'));

            // 建立每个项目缩略图将显示缩略图,点击网络地图模板或web应用程序
            var frag = document.createDocumentFragment();
            dojo.forEach(queryResponse.results, function (item) {
                if (item.id) {
                    var url = (item.type === 'Web Map') ?
                      displayOptions.templateUrl + '?webmap=' + item.id + '&theme=' + displayOptions.themeName ://服务路径
                      item.url;

                    var li = dojo.create('li', {}, frag);
                    var a = dojo.create('a', {
                        href: url,
                        target: '_blank',
                        innerHTML: '<div class="tooltip"><p>' + item.snippet + '</p></div><img src="' + item.thumbnailUrl + '"/><div>' + item.title + '</div>'
                    }, li);
                }
            });

            dojo.place(frag, galleryList);
        }

        function getNext() {
            if (nextQueryParams.start > -1) {
                group.queryItems(nextQueryParams).then(updateGrid);
            }
        }

        function getPrevious() {
        	// we aren't at the beginning keep querying. 
            if (nextQueryParams.start !== 1) {
                var params = queryParams;
                params.start = params.start - params.num;
                group.queryItems(params).then(updateGrid);
            }
        }

        dojo.ready(init);
    </script>
  </head>
  
  <body>
    <div id='header'>
      <div class='container_16'>
        <div class='grid_2'>
          <span id='groupThumbnail'></span>
        </div>
        <div class='grid_14'>
          <h1 id='groupTitle'></h1>
        </div>
      </div>
    </div>
    <div id='mainContent'>
      <div class='container_16'>
        <div class="grid_3">
          <div id='sidebar'></div>
        </div>
        <div class="grid_13">
          <a id='prev' style='left:-8px;' class="large leftbutton gray navButton"
          href='javascript:getPrevious();'>&#9668; Prev</a>
          <ul id='galleryList' class='gallery'></ul>
          <a id='next' style='right:20px;' class="large rightbutton gray navButton"
          href='javascript:getNext();'>Next &#9658;</a>
        </div>
      </div>
    </div>
  </body>

</html>
PortalComment
PortalComment 属性
PortalFolder
PortalFolder 属性
PortalFolder 方法
PortalGroup
PortalGroup 属性
PortalGroup 方法
PortalGroupMembers
主要属性
PortalQueryParams
主要属性
PortalQueryResult
主要属性
PortalRating
主要属性
PortalItem
PortalItem 主要属性
PortalItem 方法
PortalUser
PortalUser 主要属性
PortalUser 主要方法
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Group ID Finder</title>
    <link rel="stylesheet" href="//js.arcgis.com/3.14/dojo/resources/dojo.css">
    <link rel="stylesheet" href="//js.arcgis.com/3.14/dgrid/css/dgrid.css">
    <link rel="stylesheet" href="//js.arcgis.com/3.14/dgrid/css/skins/claro.css">
    <link rel="stylesheet" href="//js.arcgis.com/3.14/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="//js.arcgis.com/3.14/esri/css/esri.css">
    <link rel="stylesheet" href="css/layout.css">

    <script>
        // async is a new dojoConfig option. The default value of false will load all the Dojo base modules
        // here we set it to true to take advantage of the asynchronous nature of dojo and the the base modules
        // are not automatically loaded.
        // 利用dojo的异步性质和基本模块
        var dojoConfig = { async: true };
    </script>
    <script src="//js.arcgis.com/3.14/"></script>
    <script>
        // require function accepts an array of module ids and a function. The modules are provided as return variables passed as arguments to the function. This replaces the dojo.requires statements.
        require([
          "dojo/parser",
          "dojo/ready",
          "dojo/dom",
          "dojo/dom-construct",
          "dojo/_base/array",
          "dijit/registry",
          "dojo/on",
          "esri/arcgis/Portal",
          "esri/config",
          "esri/lang",
          "dgrid/Grid",
          "dijit/layout/BorderContainer",
          "dijit/layout/ContentPane"
        ], function (
          parser,
          ready,
          dom,
          domConstruct,
          array,
          registry,
          on,
          arcgisPortal,
          config,
          esriLang,
          Grid
        ) {
            var portal, portalUrl, groupGrid;
            
            ready(function () {
            	// 在dojoConfig中 取代 parseOnLoad = true
                parser.parse(); 

                config.defaults.io.proxyUrl = '../proxy/proxy.ashx';
                portalUrl = document.location.protocol + '//www.arcgis.com';

                // 创建门户
                portal = new arcgisPortal.Portal(portalUrl);

                on(portal, 'load', function (p) {
                    dom.byId('groupFinderSubmit').disabled = false;
                    dom.byId('signIn').disabled = false;

                    // 登录点击事件
                    on(dom.byId('signIn'), 'click', signIn);

                    // 搜索时输入键被按下或单击按钮
                    on(dom.byId('groupFinderSubmit'), 'click', findArcGISGroup);
                    // 操作内容框,按键事件
                    on(dom.byId('groupFinder'), 'keyup', function (e) {
                        if (e.keyCode === 13) {
                            findArcGISGroup();
                        }
                    });
                });
            });

            // 基于输入关键字搜索
            function findArcGISGroup() {
                var keyword = dom.byId('groupFinder').value;
                var params = {
                    q: keyword,
                    // 排序字段
                    sortField: 'modified',
                    // 倒序查找
                    sortOrder: 'desc',
                    // 查找项数量
                    num: 20  
                };
                portal.queryGroups(params).then(function (data) {
                	// 查询显示
                    showGroupResults(data);
                });
            }


            // 显示一个组列表相匹配的输入用户名
            function showGroupResults(response) {
                // 明确的任何现有的结果
                var data = [];
                if (groupGrid) {
                    groupGrid.refresh();
                }
                if (response.total > 0) {
                    // 创建一个数组属性为每个组——我们将在一个dojo dgrid显示这些
                    data = array.map(response.results, function (group) {
                        return {
                        	// 一个简短的总结描述
                            'snippet': group.snippet,
                            'title': group.title,
                            'url': group.url,
                            'thumbnail': group.thumbnailUrl || '',//缩略图
                            'id': group.id,
                            // 组的所有者的用户名
                            'owner': group.owner

                        };
                    });
                    // 创建 Grid
                    groupGrid = new Grid({
                        columns: {
                        	// 缩略图
                            thumbnail: 'Group Icon',
                            title: 'Group',
                            // 一个简短的总结描述
                            snippet: 'Description',
                            id: 'Group ID'
                        },
                        // 渲染,相当于定义模板
                        renderRow: renderTable,
                        showHeader: false
                    }, "grid");
                    // 绑定数据
                    groupGrid.renderArray(data);

                } else {
                    dom.byId('groupResults').innerHTML = '<h2>Group Results</h2><p>No groups were found. If the group is not public use the sign-in link to sign in and find private groups.</p>';
                }
            }
			// 渲染表格
            function renderTable(obj, options) {

                var template = '<div class="thumbnail"><img src=${thumbnail} width="50" height="50"/></div><a target="_blank" class="title" href=${url}>${title}</a><span class="owner"> (${owner} ) </span><div class="summary">${snippet} </div><textarea class="group=id" readonly="readonly" rows="1" cols="30">${id}</textarea>';

                obj.url = portalUrl + '/home/group.html?groupid=id:' + obj.id;
                obj.thumbnail = obj.thumbnail || '';

                // 创建 div
                return div = domConstruct.create("div", {
                    innerHTML: esriLang.substitute(obj, template)
                });

            }

            // 登录
            function signIn() {
                var signInLink = dom.byId('signIn');

                if (signInLink.innerHTML.indexOf('In') !== -1) {
                    portal.signIn().then(function (loggedInUser) {
                        signInLink.innerHTML = "Sign Out";
                        // 更新结果
                        findArcGISGroup();
                        // 错误返回
                    }, function (error) {
                        signInLink.innerHTML = 'Sign In';   
                    });
                } else {
                    portal.signOut().then(function (portalInfo) {
                        signInLink.innerHTML = "Sign In";
                        findArcGISGroup();
                    });
                }
            }
        });
    </script>
  </head>

  <body class="claro">
    <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline',gutters:false"
    style="width:100%;height:100%;margin:0;">
      <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
        <h1>ArcGIS Online Group ID Finder</h1>
        <a id="signIn" disabled='disabled'>Sign In</a>
        <p>Find group ids based on search term. Sign-in to search for private groups.</p>
        <input name="groupFinder"  id="groupFinder" placeholder="username" value="esri" size="30" />
        <input name="groupFinderSubmit" disabled='disabled' type="submit" value="Submit" id="groupFinderSubmit" />
      </div>
      <div id='gridpane' data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'">
        <div id='grid'></div>
        <div id="groupResults"></div>
      </div>
    </div>
  </body>
</html>

4、在线添加地图数据

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Add Shapefile</title>

    <link rel="stylesheet" href="http://js.arcgis.com/3.14/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="css/app.css">
    <!--[if !IE]> -->
    <link rel="stylesheet" href="css/fileupload.css">
    <!-- <![endif]-->
    <link rel="stylesheet" href="http://js.arcgis.com/3.14/esri/css/esri.css">    
    <script src="http://js.arcgis.com/3.14/"></script>
    <script>
        var map;

        require([
          "esri/config",
          "esri/InfoTemplate",
          "esri/map",
          "esri/request",
          "esri/geometry/scaleUtils",
          "esri/layers/FeatureLayer",
          "esri/renderers/SimpleRenderer",
          "esri/symbols/PictureMarkerSymbol",
          "esri/symbols/SimpleFillSymbol",
          "esri/symbols/SimpleLineSymbol",
          "dojo/dom",
          "dojo/json",
          "dojo/on",
          "dojo/parser",
          "dojo/sniff",
          "dojo/_base/array",
          "esri/Color",
          "dojo/_base/lang",
          "dijit/layout/BorderContainer",
          "dijit/layout/ContentPane",
          "dojo/domReady!"
        ],
          function (
          esriConfig, 
          InfoTemplate, 
          Map, 
          request, 
          scaleUtils, 
          FeatureLayer,
          SimpleRenderer, 
          PictureMarkerSymbol, 
          SimpleFillSymbol, 
          SimpleLineSymbol,
          dom, 
          JSON, 
          on, 
          parser, 
          sniff, 
          arrayUtils, 
          Color, 
          lang
        ) {

              parser.parse();

              var portalUrl = "http://www.arcgis.com";//定义门户路径

              esriConfig.defaults.io.proxyUrl = "/proxy/";
			  // 上传事件绑定,change事件
              on(dom.byId("uploadForm"), "change", function (event) {
              	  // 转换为小写
                  var fileName = event.target.value.toLowerCase();
                  // sniff这个模块集()标记基于当前浏览器
                  // 在IE中提取文件的完整路径,文件名
                  if (sniff("ie")) {
                  	  // "\"分组
                      var arr = fileName.split("\\");
                      // 获取文件名
                      fileName = arr[arr.length - 1];
                  }
                  // 判断是否为.zip文件,如果是,则添加文件
                  if (fileName.indexOf(".zip") !== -1) {
                      generateFeatureCollection(fileName);
                  }
                  // 如果不是,提示信息
                  else {
                      dom.byId('upload-status').innerHTML = '<p style="color:red">Add shapefile as .zip file</p>';
                  }
              });

              map = new Map("mapCanvas", {
                  basemap: "gray",
                  center: [-41.647, 36.41],
                  zoom: 3,
                  slider: false
              });
              // 添加文件
              function generateFeatureCollection(fileName) {
              	  // 根据“.”分组
                  var name = fileName.split(".");
                  // 如果是路径 c:\fakepath  - 需要移除
                  // 看到这个链接以获得更多信息: http://davidwalsh.name/fakepath
                  name = name[0].replace("c:\\fakepath\\", "");
				  // 加载提示信息
                  dom.byId('upload-status').innerHTML = '<b>Loading… </b>' + name;

                  // 定义输入参数
                  var params = {
                      'name': name,
                      'targetSR': map.spatialReference,
                      'maxRecordCount': 1000,
                      // 输入文件大小限制
                      'enforceInputFileSizeLimit': true,
                      // Json 文件输出大小限制
                      'enforceOutputJsonSizeLimit': true
                  };

                  // generalize features for display Here we generalize at 1:40,000 which is approx 10 meters
                  // 当使用 web 墨卡托这应该工作得很好
                  // 获取地图范围
                  var extent = scaleUtils.getExtentForScale(map, 40000);
                  // 获取分辨率
                  var resolution = extent.getWidth() / map.width;
                  params.generalize = true;                  
                  params.maxAllowableOffset = resolution;
                  // 精度
                  params.reducePrecision = true;
                  // 小数点后的位数
                  params.numberOfDigitsAfterDecimal = 0;

                  var myContent = {
                  	   // 文件类型为shp文件
                      'filetype': 'shapefile',
                      'publishParameters': JSON.stringify(params),
                      // 返回一个JSON对象的序列化,格式为 JSON
                      'f': 'json',
                      'callback.html': 'textarea'
                  };

                  //使用其余的生成操作来生成一个压缩shapefile功能集合
                  // 发送一个请求使用默认当前平台
                  request({
                      url: portalUrl + '/sharing/rest/content/features/generate',
                      content: myContent,
                      form: dom.byId('uploadForm'),
                      handleAs: 'json',
                      // 返回一个函数,它只会在给定的范围内执行
                      load: lang.hitch(this, function (response) {
                          if (response.error) {
                              errorHandler(response.error);
                              return;
                          }
                          // 图层名称
                          var layerName = response.featureCollection.layers[0].layerDefinition.name;
                          dom.byId('upload-status').innerHTML = '<b>Loaded: </b>' + layerName;
                          // 加载文件
                          addShapefileToMap(response.featureCollection);
                      }),
                      error: lang.hitch(this, errorHandler)
                  });
              }
              // 错误信息
              function errorHandler(error) {
                  dom.byId('upload-status').innerHTML =
                  "<p style='color:red'>" + error.message + "</p>";
              }
              // 添加文件
              function addShapefileToMap(featureCollection) {
                  // add the shapefile to the map and zoom to the feature collection extent
                  // If you want to persist the feature collection when you reload browser you could store the collection in
                  // local storage by serializing the layer using featureLayer.toJson()  see the 'Feature Collection in Local Storage' sample
                  // for an example of how to work with local storage.
                  var fullExtent;
                  var layers = [];
                  // 遍历图层
                  arrayUtils.forEach(featureCollection.layers, function (layer) {
                  	  // 设置信息模板,显示所有内容
                      var infoTemplate = new InfoTemplate("Details", "${*}");
                      // 定义返回结果为featureLayer
                      var featureLayer = new FeatureLayer(layer, {
                          infoTemplate: infoTemplate
                      });
                      // 绑定单机时间,显示项目信息
                      featureLayer.on('click', function (event) {
                          map.infoWindow.setFeatures([event.graphic]);
                      });
                      // change default symbol if desired. Comment this out and the layer will draw with the default symbology
                      // 改变图层渲染
                      changeRenderer(featureLayer);
                      fullExtent = fullExtent ?
                        fullExtent.union(featureLayer.fullExtent) : featureLayer.fullExtent;
                      // featureLayer 添加到图层数组
                      layers.push(featureLayer);
                  });
                  // 添加到地图
                  map.addLayers(layers);
                  // 定位到新添加的地图范围
                  map.setExtent(fullExtent.expand(1.25), true);

                  dom.byId('upload-status').innerHTML = "";
              }

              function changeRenderer(layer) {
                  // 改变默认的符号特征多边形和集合点
                  var symbol = null;
                  switch (layer.geometryType) {
                      case 'esriGeometryPoint':
                          symbol = new PictureMarkerSymbol({
                              'angle': 0,
                              'xoffset': 0,
                              'yoffset': 0,
                              'type': 'esriPMS',
                              'url': 'http://static.arcgis.com/images/Symbols/Shapes/BluePin1LargeB.png',
                              'contentType': 'image/png',
                              'width': 20,
                              'height': 20
                          });
                          break;
                      case 'esriGeometryPolygon':
                          symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
                            new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                              new Color([112, 112, 112]), 1), new Color([136, 136, 136, 0.25]));
                          break;
                  }
                  if (symbol) {
                  	  // 设置渲染适配器
                      layer.setRenderer(new SimpleRenderer(symbol));
                  }
              }
          });
    </script>
  </head>
  
  <body class="claro">
    <div id="mainWindow" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline',gutters:false" style="width:100%; height:100%;">
      <div data-dojo-type="dijit/layout/ContentPane" id="rightPane" data-dojo-props="region:'right'">
        <div style='padding-left:4px;'>
          <p>
            Add a zipped shapefile to the map.</p><p>Visit the
            <a target='_blank' href="http://doc.arcgis.com/en/arcgis-online/reference/shapefiles.htm">Shapefiles</a> help topic for information and limitations.</p>
              <form enctype="multipart/form-data" method="post" id="uploadForm">
              <div class="field">
                  <label class="file-upload">
                      <span><strong>Add File</strong></span>
                      <input type="file" name="file" id="inFile" />
                  </label>
              </div>
              </form>
              <span class="file-upload-status" style="opacity:1;" id="upload-status"></span>
              <div id="fileInfo">&nbsp;</div>
        </div>
    </div>
    <div id="mapCanvas" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'"></div>
  </div>
</body>

</html>

5、Web Map Viewer(地图服务列表视图)

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <!--The viewport meta tag is used to improve the presentation and behavior of the samples on iOS devices-->
  <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
  <title>Web Map Viewer</title>

  <link rel="stylesheet" href="http://jsapi.thinkgis.cn/esri/css/esri.css">
  <link rel='stylesheet' href='css1/layout.css'>
  <script>var dojoConfig = { parseOnLoad: true };</script>
  <script src="http://jsapi.thinkgis.cn/init.js"></script>
  <script>
      dojo.require('esri.arcgis.Portal');
      dojo.require('esri.arcgis.utils');
      dojo.require("esri.map");
      dojo.require('esri.dijit.Attribution');

      var portal, items;
      var webmaps = [], map, currentMap = 0;
      // var i18n;

      function init() {
      	  // 创建portal
          portal = new esri.arcgis.Portal('http://www.arcgis.com');
          // portal加载事件
          dojo.connect(portal, 'onLoad', loadPortal);
      }

      function loadPortal() {
          // 查询条件
          var params = {
              q: 'title:Community Basemaps AND owner:esri'
          };
          // 群组查询
          portal.queryGroups(params)
          	// 执行函数
            .then(function (response) {
            	// 判断结果是否为0
                if (response.results.length > 0) {
                    var group = response.results[0];
                    var queryParams = {
                        q: 'type:"Web Map" -type:"Web Mapping Application"',
                        num: 10
                    };
                    // 组内项查询
                    group.queryItems(queryParams)
                      .then(function (response) {
                          if (response.results.length > 0) {
                              items = response.results;
                              // 创建地图
                              createMap(items[0]);
                              // 创建缩略图画廊
                              createThumbs(items);
                          } else {
                              console.log('This group does not contain any public web maps to display.');
                              // 隐藏
                              esri.hide(dojo.byId('loadingImg'));
                          }

                      });
                } else {
                	// 隐藏
                    esri.hide(dojo.byId('loadingImg'));
                }
            });
      }
	  // 创建地图
      function createMap(item) {
          var mapDeferred = esri.arcgis.utils.createMap(item.id, dojo.create('div', {
              id: item.id
          }, dojo.byId('mainMap')), {
              mapOptions: {
                  showAttribution: true,
                  slider: false
              }
          });
          // 设置地图信息
          mapDeferred.then(function (response) {
              map = response.map;
              map.id = item.id;
              map.title = item.title;
              map.owner = item.owner;
              map.snippet = item.snippet;
              webmaps[currentMap] = map;
			  // 更新地图
              updateDetails(map);
              // 隐藏地图
              esri.hide(dojo.byId('loadingImg'));
          }, function (error) {
              if (map) {
                  map.destroy();
                  dojo.destroy(map.container);
                  getNext();
              }
          });
      }
	  // 创建缩略图
      function createThumbs(items) {
      	  // 创建文档
          var frag = document.createDocumentFragment();
          dojo.forEach(items, function (item, index) {
              if (item.id) {
              	  // use default image if one is not provided
                  var thumbnail = item.thumbnailUrl || 'https://static.arcgis.com/images/desktopapp.png'; 
                  var li = dojo.create('li', {
                      innerHTML: '<img src="' + thumbnail + '"/><p class="ellipsis">' + item.title + '</p>'

                  }, frag);
                  // 添加项目样式
                  dojo.addClass(li, 'grid_2 gallery_grid');
              }
              // 单击显示隐藏地图
              dojo.connect(li, 'onclick', function () {
                  //close the thumbnail panel 
                  hideMap();
                  esri.hide(dojo.byId('thumbnailContainer'));
                  currentMap = index;
                  // 显示地图
                  showMap();
              });
          });
          // 替换
          dojo.place(frag, 'thumbnailList');
      }

      function showMap() {
          // animate the display of the next map to fade-in 
          // increment the map count div
          // 根据索引创建地图
          var myMap = webmaps[currentMap];
          if (myMap && myMap.id) {
              var node = dojo.byId(myMap.id);
              esri.show(node);
              updateDetails(myMap);
              // 淡入
              var anim = dojo.fadeIn({
                  node: node
              });
              anim.play();
          } else {
              // create the map 
              esri.show(dojo.byId('loadingImg'));
              createMap(items[currentMap]);
          }
      }
      // 更新细节
      function updateDetails(item) {
          dojo.byId('mapTitle')
            .innerHTML = item.title;
          dojo.byId('mapOwner')
            .innerHTML = item.snippet;
          dojo.byId('mapCount')
            .innerHTML = dojo.string.substitute(
            "Map ${page} of  ${total}", {
                page: (currentMap + 1),
                total: items.length
            });
      }
      // 淡出前面的地图
      function hideMap() {
          // Fade out the previous map 
          var node = dojo.byId(webmaps[currentMap].id);
          esri.hide(node);
          dojo.byId('mapTitle').innerHTML = '';
          dojo.byId('mapOwner').innerHTML = '';
          dojo.byId('mapCount').innerHTML = '';
          // 淡出动画
          var anim = dojo.fadeOut({
              node: node
          });
          anim.play();
      }

      function getNext() {
          // hide the existing map 
          hideMap();
          (currentMap >= -1 && currentMap < (items.length - 1)) ? currentMap += 1 : currentMap = 0;
          showMap();
      }

      function getPrevious() {
          hideMap();
          (currentMap <= items.length && currentMap > 0) ? currentMap -= 1 : currentMap = items.length - 1;
          showMap();
      }
      // 切换画廊
      function toggleGallery() {
          var tc = dojo.byId('thumbnailContainer');
          tc.style.display === 'none' ? esri.show(tc) : esri.hide(tc);
      }

      dojo.ready(init);
  </script>
</head>

<body>
	<div class='container_12'>
		<div  id='mapSection' class='grid_12 rounded'>
  			<div id='mainMap' >
 				<div id='thumbnailContainer' class='gallery-thumbs-container' style='display:none;'>
					<div id='thumbnailList' class='container_12 gallery-thumbs-list'></div>
	 			</div>
     			<img id="loadingImg" alt="" src="images/loading.gif" style="position:absolute; right:50%; top:50%; z-index:100;display:none;"/>                
    			<div class="gallery-nav">
        			<div class="gallery-nav-right" onclick='getNext();'></div>
        			<div class="gallery-nav-left" onclick='getPrevious();'></div>
    			</div>
  			</div>
  		</div>
  
  		<div class='clear' ></div>   
  		<div id='detailsSection' class='grid_12 rounded'>
  			<div class='grid_9 alpha'>
    			<div class='pod' style='padding-left:10px;'>
      				<div id='mapTitle' class='title' ></div>
      				<div class='subtitle' id='mapOwner'></div>
    			</div>
  			</div>

  			<div class='grid_3 omega'>
    			<div class='pod'>
      				<div id='mapCount' class='subtitle'></div>
    			</div>
  			</div>
      		<div>
         		<div id='thumbs' class='gallery-thumb' onclick='toggleGallery();'></div>
  			</div> 
  		</div>

	</div>
</body>
</html>

标签:function,dojo,GIS,ArcGIS,Portal,var,byId,esri
来源: https://blog.csdn.net/gongxifacai_believe/article/details/113093313