1. 程式人生 > >Arcgis Server for JavaScript API之自定義InfoWindow

Arcgis Server for JavaScript API之自定義InfoWindow

各位看到這個標題不要嫌煩,因為本人最近一直在研究相關的問題,所以相關文章也只能是這些,同時希望看過我的文章的朋友,我的文章能夠給你幫助。

在前面的兩篇相關的文章裡面,實現InfoWindow是通過div的東西實現的,本文要講的是通過整合InfoWindowBase實現infowindow的。實現後InfoWindow主要修改了arcgis原來的樣式,並加入了InfoWindow出界的處理。

原始碼奉上:

myInfoWindow/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; });
myInfoWindow/InfoWindow.css
.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;
width: 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;
  width: 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%; width: 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>

相關推薦

Arcgis Server for JavaScript API定義InfoWindow

各位看到這個標題不要嫌煩,因為本人最近一直在研究相關的問題,所以相關文章也只能是這些,同時希望看過我的文章的朋友,我的文章能夠給你幫助。 在前面的兩篇相關的文章裡面,實現InfoWindow是通過div的東西實現的,本文要講的是通過整合InfoWindowBase實現infowindow的。實現後Inf

arcgis api for javascript(一)使用定義資料對FeatureLayer進行渲染

基於arcgis api for javascript3.17,arcgis server10.3 本文主要針對esriGeometryPolygon型(面要素)FeatureLayer中新增自定義屬性列的需求。這種client端的資料修改並不會儲存到server端 我們知

高德地圖api定義載入地圖

高德地圖api有幾大功能模組:Amap,Location,Search,OfflineMap 首先我們檢視文件,並匯入Demo專案來學習一下basic map功能: 首先有幾個重要的類: 開啟jar package(Android_Map_V2.jar)中的packag

arcgis api for js定義範圍查詢

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定義範圍</title> <!-

ArcGIS API for Flex(六)載入定義Web平鋪圖層

效果如下 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://n

百度地圖JavaScript API 學習定義標註圖示(二)

地圖繪製之新增自定義標註圖示(二) 官方提供了兩種方法來自定義標註圖示: 通過引數MarkerOptions的icon屬性進行設定 使用Marker.setIcon()方法。 第二

關於Arcgis for JavaScript API 4.5本地配置與相關變化的探索

    最近由於學習需求對於Arcgis JavaScript API需要一定的運用。翻看了一下官方網站的版本,已經更新到4.7版本。為了方便前端的開發,對4.5的版本進行了一番研究。     首先,我們要執行一個簡單的網頁地圖,必須獲得Arcgis JavaScript

kubernetes學習筆記十二:資源指標API定義指標API

第一章、前言 以前是用heapster來收集資源指標才能看,現在heapster要廢棄了從1.8以後引入了資源api指標監視 資源指標:metrics-server(核心指標) 自定義指標:prometheus,k8s-prometheus-adapter(將Prometheus採集的資料轉換為指

ArcGIS For JavaScript API Overview Map(鷹眼/概覽圖) ————(二十五)

轉載自:http://blog.csdn.net/xiaokui_wingfly/article/details/8508026 描述: 此示例顯示瞭如何新增一個的地形底圖層到您的應用程式和使用OverviewMap的dijit顯示的主要地圖右上角的總覽圖。總覽

ArcGIS For JavaScript API Drawing Tool(繪圖工具)————(十七)

描述:                    您可以使用繪圖工具欄繪製在地圖上的多種幾何形狀。. esri.toolbars.Draw 常量 常量 描述 ARROW 繪製箭頭. UP_ARROW 繪製一個上箭頭. DOWN_ARROW 繪製一個下箭頭 LEFT_AR

ArcGIS For JavaScript API 新增一個dynamic Service(動態服務)————(一)

描述: 此示例演示如何新增一個地圖繪製的伺服器在使用者每次縮放或平移。這樣的地圖不具有快取記憶體的瓦片,被稱為動態地圖服務層。在ArcGISJavaScript API的動態地圖服務為代表的ArcGISDynamicMapServiceLayer。 下面的程式碼行建

ArcGIS For JavaScript API Feature layer hover(功能圖層的懸浮)————(二十六)

描述:  在”South Carolina南卡羅來納州“的縣上進行滑鼠懸浮,跳出提示框。滑鼠事件進行控制其顯示方式。 重要程式碼: (1)控制顯示的州 var southCarolinaCounties=new esri.layers.FeatureLayer("ht

利用Arcgis for javascript API繪製GeoJSON並同時彈出多個Popup

1.引言   由於Arcgis for javascript API不可以繪製Geojson,並且提供的Popup一般只可以彈出一個,在很多專題圖製作中,會遇到不少的麻煩。因此本文結合了兩個現有的Arcgis for javascript API擴充庫,對其進行改造達到

Qt定義外掛(for Qt Designer)

QLedPlugin::QLedPlugin(QObject *parent) : QObject(parent) { initialized = false; } void QLedPlugin::initialize(QDesignerFormEditorInterface * )

python定義異步IO客戶端

class close sel 封裝 [0 urn 簡單 pytho syn #!/usr/bin/env python # -*- coding: utf8 -*- # __Author: "Skiler Hao" # date: 2017/5/16 15:04

Hadoop實戰-Flume定義Sink(十九)

current ioe back urn oop print out java try import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream;

C#定義特性

創建 tip comm 字段 運算符 包含 自動 名稱 程序   在前面介紹的代碼中有使用特性,這些特性都是Microsoft定義好的,作為.NET Framework類庫的一部分,許多特性都得到了C#編譯器的支持。   .NET Frmework也允許定義自己的特性。自

Qt定義搜索框——QLineEdit裏增加一個Layout,還不影響正常輸入文字(好像是一種比較通吃的方法)

too 步驟 set box 文本 csdn sub void 鼠標 簡述 關於搜索框,大家都經常接觸。例如:瀏覽器搜索、Windows資源管理器搜索等。 當然,這些對於Qt實現來說毫無壓力,只要思路清晰,分分鐘搞定。 方案一:調用QLineEdit現

前端學PHP定義模板引擎

php什麽是網站模板?準確地說,是指網站頁面模板,即每個頁面僅是一個板式,包括結構、樣式和頁面布局,是創建網頁內容的樣板,也可以理解為已有的網頁框架。可以將模板中原有的內容替換成從服務器端數據庫中動態內容,目的是可以保持頁面風格一致  PHP是一種HTML內嵌式的在服務器端執行的腳本語言,所以大部分PHP開發

Django定義分頁

plugin style 定義 mage user_list .sh render 進行 blog 應用於各頁面中的分頁實現,實現的結果如下圖 1.先自定義一個有關分頁的PageInfo類 1 class PageInfo(object): 2 3