創(chuàng)建類(點(diǎn)擊獲得位置信息)—ArcGIS API for JavaScript

不知道大家有沒有這種體驗(yàn)雕薪,我們開始學(xué)web開發(fā)的時(shí)候昧诱,會(huì)把HTML、JavaScript所袁、CSS代碼都堆疊在一個(gè)HTML文件中盏档,慢慢地,隨著代碼量的增多燥爷,不同的代碼堆疊在一起顯得很亂蜈亩,我們開始把html、css前翎、js獨(dú)立到不同的文件中稚配。隨著JS代碼的數(shù)量不斷增長(zhǎng),JS文件的數(shù)量也一樣港华,管理和引用js代碼也變得復(fù)雜起來道川,而解決這種問題一個(gè)有效的方法就是采用“面向?qū)ο螅∣O)”模式。通過使用面向?qū)ο蟮娘L(fēng)格,可以避免應(yīng)用程序中代碼混亂冒萄,并且可以增加代碼的復(fù)用性臊岸,簡(jiǎn)化應(yīng)用程序后期維護(hù),可以使錯(cuò)誤更快地修復(fù)尊流,并在更短的時(shí)間內(nèi)實(shí)現(xiàn)新功能帅戒。

ArcGIS API中的模塊

Dojo Toolkit是一個(gè)開源的模塊化JavaScript庫(或更具體地說是JavaScript工具包),Dojo的代碼被劃分為邏輯單元稱之為模塊, 這有點(diǎn)類似于Java中的package崖技,模塊中可以包含類和簡(jiǎn)單方法逻住。而ArcGIS API for JavaScript就是建立在Dojo的基礎(chǔ)之上,然后增加了自己的模塊响疚。

我們平常使用ArcGIS API for JavaScript開發(fā)時(shí)鄙信,首先得require需要用到的類,比如我們要?jiǎng)?chuàng)建一副地圖忿晕,首先得引用map類:

require(["esri/map"], function(Map) { /* code goes here */ });

如果你在本地部署了ArcGIS API就能看到在esri文件夾下有個(gè)map.js文件装诡,我們需要的Map類也就是在這個(gè)模塊中定義的。

我們可以打開map.js的源碼践盼,網(wǎng)上隨便找個(gè)工具格式化下鸦采,折疊declaredClass: "esri.Map"之后的代碼:

可以發(fā)現(xiàn),Map對(duì)象的方法和屬性都在其中定義咕幻。

自己寫一個(gè)模塊

1渔伯、使用define()來加載模塊所需的依賴,具體用法可以參考文檔肄程。
declare用于創(chuàng)建一個(gè)可以實(shí)例化的類,所以必須引用

define(["dojo/_base/declare"],function(declare){


});

2锣吼、用declare(className,superclass,props)建一個(gè)類

參數(shù) 類型 描述
className String 構(gòu)造函數(shù)的可選名稱。它將被用作創(chuàng)建的構(gòu)造函數(shù)的全局名稱蓝厌。
superclass Function or Function[] 可以為空玄叠,函數(shù)或函數(shù)數(shù)組。這個(gè)參數(shù)指定一個(gè)繼承表(最左邊一個(gè)是最原始的父類)
props Objectid 定義類屬性和方法的對(duì)象拓提。通過使其成為一個(gè)名為“constructor”的屬性來定義一個(gè)構(gòu)造函數(shù)读恃。

下面這個(gè)示例定義一個(gè)Geocoder.js模塊,通過創(chuàng)建一個(gè)類Geocoder代态,調(diào)用百度地址逆編碼API寺惫,將Point轉(zhuǎn)為地址信息。

define(["dojo/_base/declare","dojo/request/script","dojo/json","dojo/dom"],function(declare,script,JSON,dom){
     return declare(null, {

        ak: null,

        constructor: function(){
            this.ak="WtSZiDjE0KEgfSMsxGY7pxng";
        },
       
        getLocation: function(opt){

            var point=opt.point;
            var domID=opt.domId;
            var detailed=("detailed" in opt)?opt.detailed:false;              //默認(rèn)為false蹦疑,不顯示詳細(xì)地址信息

            var result={};

                script.get("http://api.map.baidu.com/geocoder/v2/?coordtype=wgs84ll&location="+opt.point.getLatitude()+","+opt.point.getLongitude()+"&output=json&pois=1&ak="+this.ak, {
                jsonp: "callback"
            }).then(function(data){
                
                result["description"]=data.result.sematic_description;
                result["address"]=data.result.formatted_address;

                console.log(result)

                if(detailed){
                    dom.byId(opt.domId).innerHTML=result.address+","+result.description;
                }else{
                    dom.byId(opt.domId).innerHTML=result.description;
                }
            })
        
        }
    })
})
  • constructor:構(gòu)造函數(shù)西雀,給ak屬性賦值
  • getLocation:獲取地址信息方法,其中opt參數(shù)為一個(gè)Objectid
opt={
    point:    //Point對(duì)象必尼,逆編碼的點(diǎn)
    domID:    //將地址信息插入的DOM的ID
    detailed: //是否詳細(xì)輸出地址信息(true||false)
}

使用自己的模塊

在ArcGIS API 文件目錄(arcgis_js_api/library/3.20/3.20/)中新建一個(gè)文件夾為“gisxxcom”蒋搜,再將自己寫的模塊Geocoder.js放入其中篡撵。

項(xiàng)目中使用自己的模塊:

<!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>Simple Map</title>
    <link rel="stylesheet" >
    <style>html, body { height: 100%; width: 100%; margin: 0; padding: 0; } #map{ width: 75%; height: 100%; float: left; } #result{ width: 25%; height: 100%; float: left; }</style>
    <script src="http://115.28.149.107/arcgis_js_api/library/3.20/3.20/init.js"></script>
  </head>
  
  <body>
    <div id="map"></div>
    <div id="result">
      <h4 id="description"></h4>
    </div>
  </body>
  <script>
  require(["esri/map", "esri/geometry/Point", "gisxxcom/Geocoder", "dojo/domReady!"],
    function(Map, Point, Geocoder) {

      var map = new Map("map", {
        basemap: "osm",
        center: [116.026, 28.6826],
        zoom: "15"
      });

      var geocoder = new Geocoder();

      map.on("click",
      function(e) {

        console.log(e.mapPoint.getLongitude() + "," + e.mapPoint.getLatitude());
        geocoder.getLocation({
          point: e.mapPoint,
          domId: "description"
        });

      });
    });
</script>
</html>

效果預(yù)覽:

本文首發(fā)微信公眾號(hào) :GISXXCOM

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末判莉,一起剝皮案震驚了整個(gè)濱河市豆挽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌券盅,老刑警劉巖帮哈,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锰镀,居然都是意外死亡娘侍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門泳炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憾筏,“玉大人,你說我怎么就攤上這事花鹅⊙跹” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵刨肃,是天一觀的道長(zhǎng)古拴。 經(jīng)常有香客問我,道長(zhǎng)真友,這世上最難降的妖魔是什么黄痪? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮盔然,結(jié)果婚禮上桅打,老公的妹妹穿的比我還像新娘。我一直安慰自己愈案,他們只是感情好挺尾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刻帚,像睡著了一般潦嘶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崇众,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天掂僵,我揣著相機(jī)與錄音,去河邊找鬼顷歌。 笑死锰蓬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眯漩。 我是一名探鬼主播芹扭,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼麻顶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了舱卡?” 一聲冷哼從身側(cè)響起辅肾,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轮锥,沒想到半個(gè)月后矫钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舍杜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年新娜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片既绩。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡概龄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饲握,到底是詐尸還是另有隱情私杜,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布互拾,位于F島的核電站歪今,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颜矿。R本人自食惡果不足惜寄猩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骑疆。 院中可真熱鬧田篇,春花似錦、人聲如沸箍铭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈火。三九已至兽赁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冷守,已是汗流浹背刀崖。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拍摇,地道東北人亮钦。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像充活,于是被迫代替她去往敵國(guó)和親蜂莉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜡娶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 又被拒稿了窖张,看著《簡(jiǎn)書》消息里,正方形標(biāo)記里沮喪著的臉男公,都不用看后面的話荤堪,我就已經(jīng)明白了合陵,寫了這么多次稿子枢赔,“正方...
    紫色的冬日閱讀 262評(píng)論 8 1
  • a.動(dòng)詞分類: 1.be 動(dòng)詞 一般指狀態(tài),存在 am are is 2.一般動(dòng)詞 一般是動(dòng)作
    xhjncao閱讀 288評(píng)論 0 0
  • 許多人都在為這個(gè)社會(huì)拥知、這個(gè)國(guó)家努力著踏拜、奮斗著,但他們默默無聞低剔、無私奉獻(xiàn)速梗,不圖回報(bào)。盡管人們并不注意他們襟齿,但他們?nèi)詧?jiān)...
    螢火蟲教室閱讀 196評(píng)論 0 0