ArcGIS JavaScriptAPI----- 緩衝區操作

来源:http://www.cnblogs.com/MaFeng0213/archive/2017/04/17/6724716.html
-Advertisement-
Play Games

描述 使用ArcGIS Server 幾何服務(geometry service)來對繪製在地圖上的圖形生成緩衝區。幾何服務能夠在基於瀏覽器的應用程式中執行緩衝操作(buffering),投影要素(project feature),計算可測量值。 利用幾何服務創建緩衝區之前,需創建一個 (緩衝參數) ...


描述

使用ArcGIS Server 幾何服務(geometry service)來對繪製在地圖上的圖形生成緩衝區。幾何服務能夠在基於瀏覽器的應用程式中執行緩衝操作(buffering),投影要素(project feature),計算可測量值。
利用幾何服務創建緩衝區之前,需創建一個BufferParameters(緩衝參數)的實例,並且明確緩衝距離(distance),單位(unit)以及坐標系統(spatial reference)。通過傳入這個參數(parameters)和一個當緩衝執行完成時調用的回調函數(callback)來調用緩衝(buffer)功能。

geometryService.buffer(params,function(features){showBuffer(features)});

註意:

  • 在下麵的例子中使用了ArcGIS JavaScript API 自帶的繪製工具條,通過工具條產生的幾何(geometry)作為緩衝操作的輸入幾何。如果幾何的類型是多邊形,則程式會在其作為參數進行緩衝處理之前進行簡化(simplify)操作。這是用來找出那些邊界線相交的非法拓撲多邊形。簡化操作能強行將這些多邊形轉變為合法的多部分的要素(multipart features)。

  • 這個示例醫用了一個代理頁面,以防幾何的GET請求超過了某些Web瀏覽器強加的2000字元的限制。有關如何建立自己的代理頁面,請參閱代理頁面的說明。

<!DOCTYPE html>
<!--<html lang="en"> 加入lang會導致dojo的樣式錯誤--> 
<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>Buffer</title>
<link rel="stylesheet" href="https://js.arcgis.com/3.20/dijit/themes/claro/claro.css">
<link rel="stylesheet" href="https://js.arcgis.com/3.20/esri/css/esri.css">
<style>
   html, body {
    height: 100%;
    width: 100%;
    margin: 0; 
    padding: 0;
    overflow:hidden;
  }
  #leftPane{
    color:#000;
    width:250px;
    padding-bottom:15px;
  }n
  #map{
    padding:0;
  }
  .details{
    font-size:14px;
    font-weight:600;
    padding-bottom:20px;
  }

  button{
    margin:2px;
    cursor:pointer;
  }
</style>
<script src="https://js.arcgis.com/3.20/"></script>
<script type="text/javascript">
    var map,tb;

    // AMD模塊
    require(["dojo/dom",

        "dojo/_base/array",
        "dojo/parser",
        "dojo/query",
        "dojo/on",

        "esri/Color",
        "esri/config",
        "esri/map",
        "esri/graphic",

        "esri/geometry/normalizeUtils",
        "esri/tasks/GeometryService",
        "esri/tasks/BufferParameters",

        "esri/toolbars/draw",

        "esri/symbols/SimpleMarkerSymbol",
        "esri/symbols/SimpleLineSymbol",
        "esri/symbols/SimpleFillSymbol",

        "dijit/layout/BorderContainer",
        "dijit/layout/ContentPane",
        "dijit/form/Button",

        "dojo/domReady!"
        ],
        function(dom, array, parser, query, on, Color, esriConfig, Map, Graphic, normalizeUtils, GeometryService, BufferParameters, Draw, SimpleMarkerSymbol, SimpleLineSymbol, SimpleFillSymbol){
        
            // dojo根據dom標簽的屬性實例化控制項
            parser.parse();

            // esriconfig : The default values for all JS API configuration options. 
            esriConfig.defaults.geometryService = new GeometryService("https://utility.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");

            // proxy 用於跨域
            esriConfig.defaults.io.proxyUrl = "/proxy/";
            esriConfig.defaults.io.alwaysUseProxy = false;

            //dojo用於事件綁定
            on(dom.byId("clearGraphics"),"click",function(){
                if(map){
                    map.graphics.clear();
                }
            });

            // dojo 的選擇器
            query(".tool").on("click",function(evt){
                if(tb){
                    tb.activate(evt.target.id);
                }
            });

            map = new Map("map",{
                basemap:"streets",
                center:[-111.5,39.541],
                zoom:7
            });
            
            // map載入成功後然後初始化工具條
            map.on("load",initToolbar);

            // evtObj 屬於 事件參數
            function initToolbar(evtObj){
                tb = new Draw(evtObj.map);
                tb.on("draw-complete",doBuffer);// 已經不建議使用draw-end事件了,改為draw-complete
            }

            function doBuffer(evtObj){
                tb.deactivate();
                var geometry = evtObj.geometry,
                    symbol;
                switch(geometry.type){
                    case "point":
                        symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE,10,new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, new Color([255,0,0]), 1), new Color([0,255,0,0.25]) );
                        break;
                    case "polyline":
                        symbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH,new Color([255,0,0]),1);
                        break;
                    case "polygon":
                        symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_NONE,new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,new Color([255,0,0]),2),new Color([255,255,0,0.25]));
                        break;

                }

                // 顯示畫的幾何:形狀 + 樣式
                var graphic = new Graphic(geometry,symbol);
                map.graphics.add(graphic);

                // 設立緩衝參數
                var params = new BufferParameters();
                params.distances = [dom.byId("distance").value];  // 參數為數組
                params.outSpatialReference = map.spatialReference;
                params.unit = GeometryService[dom.byId("unit").value];

                // Normalizes geometries that intersect the central meridian or fall outside the world extent so they stay within the current coordinate system. Only supported for Web Mercator and geographic coordinates.(子午線規範化工具)
                normalizeUtils.normalizeCentralMeridian([geometry]).then(function(normalizedGeometries){
                    var normalizedGeometry = normalizedGeometries[0];
                    if(normalizedGeometry.type === "polygon"){
                       
// 規範化多邊形幾何操作
esriConfig.defaults.geometryService.simplify([normalizedGeometry],function(geometries){
                            params.geometries = geometries;

                            // 進行緩衝操作
                            esriConfig.defaults.geometryService.buffer(params,showBuffer);// ShowBuffer is callback function
                        });
                    }else{
                        params.geometries = [normalizedGeometry];
                        esriConfig.defaults.geometryService.buffer(params,showBuffer);
                    }
                });

            }

            function showBuffer(bufferedGeometries){
               // 設置緩衝區顯示樣式
                var symbol = new SimpleFillSymbol(
                    SimpleFillSymbol.STYLE_SOLID,
                    new SimpleLineSymbol(
                        SimpleLineSymbol.STYLE_SOLID,
                        new Color([255,0,0,0.65]),2),
                    new Color([255,0,0,0.35])
                    );

                // dojo 數組遍歷
                array.forEach(bufferedGeometries,function(geometry){

                    // 顯示地圖繪製樣式
                    var graphic = new Graphic(geometry,symbol);
                    map.graphics.add(graphic);
                });
            }
        });
</script>

</head>

<body class="claro">
<div data-dojo-type="dijit/layout/BorderContainer" 
     data-dojo-props="gutters:'true', design:'sidebar'" 
     style="width:100%;height:100%;">

  <div id="map" 
       data-dojo-type="dijit/layout/ContentPane" 
       data-dojo-props="region:'center'">
  </div>

  <div id="leftPane" 
       data-dojo-type="dijit/layout/ContentPane" 
       data-dojo-props="region:'left'">
    <div class="details">Pick a tool and draw on the map. The drawn graphic will be buffered based on the specified parameters.</div>
    <button type="button" class="tool" id="line">Line</button>
    <button type="button" class="tool" id="polyline">Polyline</button>
    <button type="button" class="tool" id="freehandpolyline">Freehand Polyline</button>
    <br/>
    <button type="button" class="tool" id="polygon">Polygon</button>
    <button type="button" class="tool" id="freehandpolygon">Freehand Polygon</button>
    <br/><hr />
    <div><b>Buffer Parameters</b></div>
    Distance:&nbsp;<input type="text" id="distance" size="5" value="25" />
    <select id="unit" style="width:100px;">
      <option value="UNIT_STATUTE_MILE">Miles</option>
      <option value="UNIT_FOOT">Feet</option>
      <option value="UNIT_KILOMETER">Kilometers</option>
      <option value="UNIT_METER">Meters</option>
      <option value="UNIT_NAUTICAL_MILE">Nautical Miles</option>
      <option value="UNIT_US_NAUTICAL_MILE">US Nautical Miles</option>
      <option value="UNIT_DEGREE">Degrees</option>
    </select><br />
    <button type="button" id="clearGraphics">Clear Graphics</button>
  </div>
</div>
</body>
</html>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在gulpfile.js里添加var ejs = require('gulp-ejs') 命令行中執行: npm install gulp-ejs gulp.task('gulp-ejs', function(){ gulp.src(模版目錄 + '/**/*.html') .pipe(data(f ...
  • display || visibility list style : list style type || list style position || list style image position top || right || bottom || left z index clear fl ...
  • <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <style> /*跟運動相關的模塊都需要絕對定位*/ #idv1 {background: #CCCCCC;display: none;width: 50px;p ...
  • 說到ES6的 變數聲明,我估計很多人會想起下麵幾個主要的特點: 沒有變數聲明提升 擁有塊級作用域 暫時死區 不能重覆聲明 很多教程和總結基本都說到了這幾點(說實話大部分文章都大同小異,摘錄的居多),習慣性我還是去看了MDN上的文檔,立馬發現一個問題: In ECMAScript 2015, let ...
  • SVN
    [1]安裝 [2]配置 [3]基本操作 [4]協作 [5]常見問題 ...
  • 前言:這是筆者學習之後自己的理解與整理。如果有錯誤或者疑問的地方,請大家指正,我會持續更新! 元素節點 元素節點就是HTML標簽元素,元素節點主要提供了對元素標簽名、子節點及屬性的訪問; 元素節點的三個node屬性:nodeType:1、nodeName/TagName:元素的標簽名大寫、nodeV ...
  • (1)window對象 彈塊的方法 提示塊: window.alert("提示信息"); Code: var res = alert("xxx"); alert(res); Code: var res = alert("xxx"); alert(res); 確認塊: window.confirm(" ...
  • $.each()與$(selector).each()不同, 後者專用於jquery對象的遍歷, 前者可用於遍歷任何的集 合(無論是數組或對象),如果是數組,回調函數每次傳入數組的索引和對應的值(值亦可以通過this 關鍵字獲取,但javascript總會包裝this 值作為一個對象—儘管是一個字元 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...