zoukankan      html  css  js  c++  java
  • lzugis——Arcgis Server for JavaScript API之自定义InfoWindow

    各位看到这个标题不要嫌烦,因为本人最近一直在研究相关的问题,所以相关文章也只能是这些,同时希望看过我的文章的朋友,我的文章能够给你帮助。


    在前面的两篇相关的文章里面,实现InfoWindow是通过div的东西实现的,本文要讲的是通过集成InfoWindowBase实现infowindow的。实现后InfoWindow主要修改了arcgis原来的样式,并加入了InfoWindow出界的处理。


    源代码奉上:

    InfoWindow.js

    define([
        "dojo/Evented",
        "dojo/parser",
        "dojo/on",
        "dojo/_base/declare",
        "dojo/dom-construct",
        "dojo/_base/array",
        "dojo/dom-style",
        "dojo/_base/lang",
        "dojo/dom-class",
        "dojo/fx",
        "dojo/Deferred",
        "esri/domUtils",
        "esri/InfoWindowBase"
    ],
    function(
        Evented,
        parser,
        on,
        declare,  
        domConstruct,
        array,
        domStyle,
        lang,
        domClass,
        coreFx,
        Deferred,
        domUtils,
        InfoWindowBase
    ) 
    {
    	var infoWidth,infoHeight;
    	var initMapCenter,initScreenCenter;
    	var showMapPoint,showScreenPoint=null;
    	
    	return declare([InfoWindowBase, Evented], 
    	{
            constructor: function(parameters) 
    		{
    			lang.mixin(this, parameters);
    			domClass.add(this.domNode, "myInfoWindow");
    			this._closeButton = domConstruct.create("div",{"class": "close", "title": "关闭"}, this.domNode);
    			this._title = domConstruct.create("div",{"class": "title"}, this.domNode);
    			this._content = domConstruct.create("div",{"class": "content"}, this.domNode);
    			this._arrow = domConstruct.create("div",{"class": "arrow"}, this.domNode);
    			on(this._closeButton, "click", lang.hitch(this, function(){
    				//hide the content when the info window is toggled close.
    				this.hide(); 
    			}));
    			//hide initial display 
    			domUtils.hide(this.domNode);
    			this.isShowing = false;
            },
            setMap: function(map)
    		{
    			this.inherited(arguments);
    			map.on("pan", lang.hitch(this, function(pan){
    				var movePoint=pan.delta;
    				if(this.isShowing)
    				{
    					if(showScreenPoint!=null)
    					{
    						this._showInfoWindow(showScreenPoint.x+movePoint.x,showScreenPoint.y+movePoint.y);
    					}	
    				}				
    			}));
    			map.on("pan-end", lang.hitch(this, function(panend){
    				var movedelta=panend.delta;
    				if(this.isShowing){
    					showScreenPoint.x=showScreenPoint.x+movedelta.x;
    					showScreenPoint.y=showScreenPoint.y+movedelta.y;
    				}
    			}));
    			map.on("zoom-start", lang.hitch(this, function(){
    				domUtils.hide(this.domNode);
    				this.onHide();				
    			}));
    			map.on("zoom-end", lang.hitch(this, function(){
    				if(this.isShowing){
    					showScreenPoint=this.map.toScreen(showMapPoint);
    					this._showInfoWindow(showScreenPoint.x,showScreenPoint.y);
    				}				
    			}));
            },
            setTitle: function(title){
    			this.place(title, this._title);
            },
            setContent: function(content){
    			this.place(content, this._content);
            },
    		_showInfoWindow:function(x,y)
    		{
    			//Position 10x10 pixels away from the specified location
    			domStyle.set(this.domNode,{
    				"left": x - infoWidth/2 + 15 + "px",
    				"top": y - infoHeight-75 + "px"
    			});
    			//display the info window
    			domUtils.show(this.domNode); 
    		},
            show: function(location)
    		{
    			showMapPoint=location;
    			
    			initMapCenter=this.map.extent.getCenter();
    			initScreenCenter=this.map.toScreen(initMapCenter);
    			
    			infoHeight= $(".myInfoWindow").height();
    			infoWidth= $(".myInfoWindow").width();
    			
    			if(location.spatialReference){
    				location = this.map.toScreen(location);
    			}
    			
    			var left=location.x-infoWidth/2;
    			var top=location.y-infoHeight-75;
    			showScreenPoint=location;
    			
    			if(top<5)
    			{
    				initScreenCenter.y=initScreenCenter.y+top-5;
    			}
    			if(left<5)
    			{
    				initScreenCenter.x=initScreenCenter.x+left-5;
    			}
    			this._showInfoWindow(showScreenPoint.x,showScreenPoint.y);
    			initMapCenter=this.map.toMap(initScreenCenter);
    			this.map.centerAt(initMapCenter);
    			this.isShowing = true;
    			this.onShow();
            },
            hide: function(){
    			domUtils.hide(this.domNode);
    			this.isShowing = false;
    			this.onHide();
            },
            resize: function(width, height){
    			domStyle.set(this._content,{
    				"width": width + "px",
    				"height": (height-60) + "px"
    			});
    			domStyle.set(this._title,{
    				"width": width + "px"
    			});
            },
            destroy: function(){
    			domConstruct.destroy(this.domNode);
    			this._closeButton = this._title = this._content = null;
            }
    	});
    	return InfoWindow;
    });
    InfoWindow.js
    .myInfoWindow {
      position: absolute;
      z-index: 100;
      font-family: sans-serif;
      font-size: 12px;
    }
    
    .dj_ie .myInfoWindow {
      border: 1px solid black;
    }
    
    .myInfoWindow .content {
      position: relative;
      background-color:#EFECCA;
      color:#002F2F;
      overflow: auto;
      padding-top:5px;
      padding-bottom:5px;
      padding-left:5px;
    }
    
    .myInfoWindow .arrow {
    	position: absolute;
    	 0px;
    	height: 0px;
    	line-height: 0px;/*为了防止ie下出现题型*/
    	border-top: 60px solid #EFECCA;
    	border-left: 5px solid transparent;
    	border-right: 20px solid transparent;
    	left: 45%;
    	bottom: -60px;
    }
    
    .myInfoWindow .close {
      position: absolute; top: 7px; right: 5px;
      cursor: pointer;
      background: url(http://serverapi.arcgisonline.com/jsapi/arcgis/2.6/js/dojo/dijit/themes/claro/layout/images/tabClose.png) no-repeat scroll 0 0 transparent;
       12px; height: 12px;
    }
    
    .myInfoWindow .close:hover  {
      background-color: #F7FCFF;
    }
    
    .myInfoWindow .title {
      font-weight: bold;
      background-color:#046380;
      color:#E6E2AF;
      padding-top:5px;
      padding-bottom:5px;
      padding-left:5px;
    }
    test.html

    <!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>Custom Info Window</title>
        <link rel="stylesheet" href="http://js.arcgis.com/3.8/js/esri/css/esri.css">
        <link rel="stylesheet" href="myModules/InfoWindow.css">
        <style>
          html, body, #mapDiv { height: 100%;  100%; margin: 0; padding: 0; } 
      
        </style>
    
        <script>
    	var dojoConfig = {
            parseOnLoad:true,
            packages: [{
              "name": "myModules",
              "location": location.pathname.replace(//[^/]+$/, "") + "/myModules"
            }]
          };
        </script>
        <script src="http://localhost/arcgis_js_api/library/3.9/3.9/init.js"></script>
        <script src="jquery.min.js"></script>
        <script>
    
        require([
          "dojo/dom",
          "dojo/dom-construct",
          "esri/map", 
          "myModules/InfoWindow",
          "esri/layers/ArcGISTiledMapServiceLayer",
          "esri/symbols/PictureMarkerSymbol",//图片点符号
          "esri/renderers/SimpleRenderer", //简单渲染
          "esri/layers/FeatureLayer",
          "esri/InfoTemplate",
          "dojo/string",
          "dojo/domReady!"
        ], function(
           dom,
           domConstruct,
           Map,
           InfoWindow,
           ArcGISTiledMapServiceLayer,
           PictureMarkerSymbol,
           SimpleRenderer,
           FeatureLayer,
           InfoTemplate,
           string
        ) {
          //create the custom info window specifying any input options
           var infoWindow = new  InfoWindow({
              domNode: domConstruct.create("div", null, dom.byId("mapDiv"))
           });
    
          var map = new Map("mapDiv", {
              logo:false,
              basemap: "gray",
              center: [-98.57, 39.82],
              zoom: 4,
              zoom: 4,
              slider: true,
          	  infoWindow: infoWindow
          });			
    
          //define the info template that is used to display the popup content. 
          var template = new InfoTemplate();
          template.setTitle("<b>${name}</b>");
          template.setContent("hello");
          template.setContent("<h1>我是中国人民的儿子</h1><br>你妹啊!!!"); 
    
    	  var featurelayercity = new FeatureLayer("http://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Boston_Marathon/FeatureServer/0", {
              mode: FeatureLayer.MODE_SNAPSHOT,
              infoTemplate: template,
    		  outFields: ["*"]
          });
    	  var pmsRed = new PictureMarkerSymbol('../images/location_icon_blue.png', 20, 20).setOffset(0, 15);
    	  //简单渲染
    	  var sr=new SimpleRenderer(pmsRed);
    	  featurelayercity.setRenderer(sr);		
          map.addLayer(featurelayercity);	  
    
          //resize the info window 
          map.infoWindow.resize(400, 200);
    
        });
        </script>
      </head>
      <body>
        <div id="mapDiv"></div>
      </body>
    </html>

    下载源代码


  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/lzugis/p/6539901.html
Copyright © 2011-2022 走看看