ArcGIS 4.11 學(xué)習(xí)筆記之實(shí)現(xiàn)自定義測(cè)量工具

使用ArcGIS 4.11有一段時(shí)間了京痢。有時(shí)候官方的許多API的開(kāi)箱即用的部件還是不太能夠滿足需求些椒。最近還發(fā)現(xiàn)官方的測(cè)量面積工具在IE內(nèi)核下不能正常運(yùn)行朱躺。那么自定義實(shí)現(xiàn)是必不可少的了怎抛。實(shí)現(xiàn)自定義測(cè)量并不難揍拆,網(wǎng)上也有許多成熟的例子可以參考和借鑒拢操。自己的實(shí)現(xiàn)供各位參考參考锦亦,也是做一個(gè)筆記記錄。

實(shí)現(xiàn)的效果圖:


?



?

我的實(shí)現(xiàn)思路如下:

1.使用Draw繪制圖形令境。測(cè)距使用polyline類型杠园,測(cè)面積使用polygon類型。

2.繪制過(guò)程中舔庶,使用geometryEngine下的方法計(jì)算測(cè)量值抛蚁。geodesicLength()測(cè)量線總長(zhǎng)陈醒,geodesicArea()測(cè)量面積。

3.顯示測(cè)量信息瞧甩。測(cè)量時(shí)保持顯示的是最新的測(cè)量值钉跷。

4.添加編輯節(jié)點(diǎn),實(shí)現(xiàn)拖拽編輯圖形肚逸。通過(guò)繪制過(guò)程中可以獲取到的頂點(diǎn)數(shù)組然后構(gòu)建graphic添加上去尘应。

5.drag拖拽事件監(jiān)聽(tīng)編輯節(jié)點(diǎn),拖拽時(shí)保持圖形同步更新

下面是按照以上思路實(shí)現(xiàn)的部分代碼吼虎。

document.getElementById("sketch_polyline_btn").addEventListener("click", function() {
    graphicsLayer.removeAll();
    txtLayer.removeAll();
    editLayer.removeAll();
    var action = draw.create("polyline", {
        mode: "click"
    })
    // 獲取焦點(diǎn)
    view.focus();

    // 頂點(diǎn)添加事件
    action.on("vertex-add", createPolyline);

    //頂點(diǎn)移除事件
    action.on("vertex-remove", createPolyline);

    // 鼠標(biāo)移動(dòng)事件
    action.on("cursor-update", createPolyline);

    // 繪制完成事件
    action.on("draw-complete", createPolyline);
})
function createPolyline(event) {
    var graphic = null;
    var editGps = [];
    var vertices = event.vertices;
    graphicsLayer.removeAll()
    //還未按下鼠標(biāo)選定起點(diǎn)犬钢,鼠標(biāo)移動(dòng)的時(shí)候
    if(vertices.length == 1) {
        addEditPt(graphicsLayer, event.vertices[0], 0)
    }
    //大于兩個(gè)點(diǎn),顯示線
    if(vertices.length >= 2) {
        //線
        var line = new Polyline({
            paths: vertices,
            spatialReference: view.spatialReference
        })
        // 生成繪制的圖形
        graphic = new Graphic({
            geometry: line,
            symbol: {
                type: "simple-line", // autocasts as new SimpleFillSymbol
                color: "#ff5502",
                width: 2,
                cap: "round",
                join: "round"
            }
        });
        graphicsLayer.add(graphic)
        calLength(line.paths, view)
    }
    //每次單擊添加頂點(diǎn)時(shí)添加一個(gè)可移動(dòng)的編輯節(jié)點(diǎn)
    if(event.type == "vertex-add") {
        var addGp = addEditPt(editLayer, vertices[event.vertexIndex], event.vertexIndex)
        editGps.push(addGp)
        console.log(editGps)
    }
    if(event.type == "cursor-update") {

    }
    if(event.type == "draw-complete") {
        graphic.attributes = {
            "drawId": "draw"
        }
        console.log(graphic)
    }
}
//計(jì)算距離
function calLength(verties, view) {
    var polyline = new Polyline({
        paths: verties,
        spatialReference: view.spatialReference
    })
    if(view.spatialReference.isWebMercator) {
        polyline = webMercatorUtils.webMercatorToGeographic(polyline);
    }
    var length = geometryEngine.geodesicLength(polyline, "meters");
    var content = "距離:" + length + "米";
    var txtPt = new Point({
        x: verties[0][0][0],
        y: verties[0][0][1],
        spatialReference: view.spatialReference
    })
    createTextGraphic(content, txtPt);
}
//計(jì)算面積
function calArea(geom, view) {
    if(view.spatialReference.isWebMercator) {
        geom = webMercatorUtils.webMercatorToGeographic(geom);
    }
    var area = geometryEngine.geodesicArea(geom, "square-kilometers");
    if(area < 0) {
        // simplify the polygon if needed and calculate the area again
        var simplifiedPolygon = geometryEngine.simplify(geom);
        if(simplifiedPolygon) {
            area = geometryEngine.geodesicArea(simplifiedPolygon, "square-meters");
        }
    }
    var content = "面積:" + area.toFixed(4) + "平方千米";
    createTextGraphic(content, geom.centroid);
}
//生成顯示文本圖形
function createTextGraphic(content, point) {
    txtLayer.removeAll();
    var txtSym = {
        type: "text",
        text: content,
        color: [255, 0, 0],
        font: {
            size: 16,
        }
    }
    var txtGp = new Graphic({
        geometry: point,
        symbol: txtSym
    })
    txtLayer.add(txtGp);
}

這樣便實(shí)現(xiàn)了一個(gè)基本的測(cè)量工具思灰。功能比較簡(jiǎn)單點(diǎn)玷犹,有需要可以做得更加豐富點(diǎn)。像百度那樣每一段都有距離提示洒疚,可刪除節(jié)點(diǎn)等

demo地址:https://download.csdn.net/download/lf5566fl/11665092

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歹颓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子油湖,更是在濱河造成了極大的恐慌巍扛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乏德,死亡現(xiàn)場(chǎng)離奇詭異撤奸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)喊括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門胧瓜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人郑什,你說(shuō)我怎么就攤上這事府喳。” “怎么了蘑拯?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵钝满,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我申窘,道長(zhǎng)弯蚜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任偶洋,我火速辦了婚禮熟吏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己牵寺,他們只是感情好悍引,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著帽氓,像睡著了一般趣斤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黎休,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天浓领,我揣著相機(jī)與錄音,去河邊找鬼势腮。 笑死联贩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捎拯。 我是一名探鬼主播泪幌,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼署照!你這毒婦竟也來(lái)了祸泪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤建芙,失蹤者是張志新(化名)和其女友劉穎没隘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體禁荸,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡右蒲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屡限。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片品嚣。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钧大,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罩旋,我是刑警寧澤啊央,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站涨醋,受9級(jí)特大地震影響瓜饥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浴骂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一乓土、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦趣苏、人聲如沸狡相。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尽棕。三九已至,卻和暖如春彬伦,著一層夾襖步出監(jiān)牢的瞬間滔悉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工单绑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留回官,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓搂橙,卻偏偏與公主長(zhǎng)得像孙乖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子份氧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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