微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript - 从TileLayer通过Javascript ArcGIS Api绘制折线或多边形时,如何获取特定区域中选定地点的值?

如何解决javascript - 从TileLayer通过Javascript ArcGIS Api绘制折线或多边形时,如何获取特定区域中选定地点的值?

实际上我使用的是 ArcGIS API for JavaScript 4.7 并且我有一个自定义内部层。我想在绘制折线时获取特定区域的名称,列名称为 (PLC_NAME) 。如何做到这一点? 假设我通过折线绘制一个区域。在这方面有地方。现在我需要获取这些地方的名称

您可以在下面找到使用代码,我正在使用 TileLayer。

require([
"esri/views/MapView","esri/Map","esri/Basemap","esri/layers/TileLayer","esri/layers/MapImageLayer","esri/widgets/Sketch/Sketchviewmodel","esri/geometry/geometryEngine","esri/widgets/CoordinateConversion","esri/geometry/support/webMercatorUtils","esri/Graphic","esri/layers/Graphicslayer","esri/config","esri/core/urlUtils","esri/widgets/Search","esri/tasks/Locator","esri/layers/FeatureLayer","esri/widgets/Expand","dojo/domready!" 

],function (
MapView,Map,Basemap,TileLayer,MapImageLayer,Sketchviewmodel,geometryEngine,CoordinateConversion,webMercatorUtils,Graphic,Graphicslayer,esriConfig,urlUtils,Search,Locator,FeatureLayer,Expand
) {

esriConfig.request.proxyUrl = "xxxxxxxxxxxxxxx";
    
urlUtils.addProxyRule({
    urlPrefix: "xxxxxxxxxxxxxxxxxxx",proxyUrl: "xxxxxxxxxxxxxxxxxx"

});

var tempGraphicslayer = new Graphicslayer();
var saveGraphicslayer = new Graphicslayer();    
var updateGraphic;
let highlight = null;
    'xxxxxxxxxxxxxxxxxxxxxxxxx';        
var myMap;

    var layer = new TileLayer({
        url: mapUrl            
    });
    var towerLayer = new MapImageLayer({
        url: 'xxxxxxxxxxxxxxxxxxxxxxx'
    });
    myMap = new Map({
        layers: [layer,tempGraphicslayer,saveGraphicslayer]
    });        
    myMap.add(towerLayer);
 

view = new MapView({
    center: [-55.1683665,39.951817],container: "viewDiv",map: myMap,zoom: 14
});


var ccwidget = new CoordinateConversion({
    view: view
});


 // Adds the search widget below other elements in
// the top left corner of the view
view.ui.add(searchWidget,{
           position: "top-right",index: 1
            });

view.ui.add(ccwidget,"bottom-left");
view.ui.add("topbar","top-right");
var pointSymbol = { // symbol used for points
    type: "simple-marker",// autocasts as new SimpleMarkerSymbol()
    style: "square",color: "#8A2BE2",size: "16px",outline: { // autocasts as new SimpleLinesymbol()
        color: [255,255,255],width: 3 // points
    }
}
var polylinesymbol = { // symbol used for polylines
    type: "simple-line",// autocasts as new SimpleLinesymbol()
    color: "#8A2BE2",width: "4",style: "dash"
}
var polygonSymbol = { // symbol used for polygons
    type: "simple-fill",// autocasts as new SimpleFillSymbol()
    color: "rgba(138,43,226,0.8)",style: "solid",outline: {
        color: "white",width: 1
    }
}

 var polygonBoundrySymbol = { // symbol used for polygons
    type: "simple-line",// autocasts as new SimpleFillSymbol()
    color: "red"
 }    
// ################## U R HERE ################## ################## U R HERE ################## 
################## U R HERE ################## 

let drawBoundry = function(){
    //let boundryJson = '&G_GEO_LIMITS.';
    let boundryJson = $v('P0_USER_LIMITS');
    if(boundryJson){
//            let boundry = Graphic.fromJSON(JSON.parse('&G_GEO_LIMITS.'));
        let boundry = Graphic.fromJSON(JSON.parse(boundryJson));            
        boundry.symbol = polygonBoundrySymbol;

        tempGraphicslayer.add(boundry);
        return boundry;
    }         
}
/*
let boundry = drawBoundry();
    */


view.when(function () {
    $('.esri-view-root').on('click','.esri-print__export-button',function(e){
        //console.log('event bubbling',e);
        //console.log('event bubbling this',this);
        e.preventDefault();
        saveExportedImg();
    });

    // create a new sketch view model
    var sketchviewmodel = new Sketchviewmodel({
        view: view,layer: tempGraphicslayer,pointSymbol: pointSymbol,polylinesymbol: polylinesymbol,polygonSymbol: polygonSymbol
    });
    

    //setUpClickHandler();
    // ************************************************************
    // Get the completed graphic from the event and add it to view.
    // This event fires when user presses
    // * "C" key to finish sketching point,polygon or polyline.
    // * Double-clicks to finish sketching polyline or polygon.
    // * Clicks to finish sketching a point geometry.
    // ***********************************************************
    sketchviewmodel.on("draw-complete",addGraphic);
    sketchviewmodel.on("update-complete",addGraphic);
    sketchviewmodel.on("update-cancel",addGraphic);
    sketchviewmodel.on("vertex-add",addGraphic);

    function addGraphic(evt) {
       // console.log ('graphic.geometry',evt.geometry)
        //let currentGraphic = popActiveGraphic(tempGraphicslayer);
        let currentGraphic = saveGraphicslayer.graphics.items.pop();
        
        var geometry = evt.geometry;
        var vertices = evt.vertices;
        var symbol;
        var attr = {
            Name: "Selected Area",X: $v('P24_X'),Y: $v('P24_Y')
        };
        // Choose a valid symbol based on return geometry
        switch (geometry.type) {
            case "point":
                symbol = pointSymbol;
                break;
            case "polyline":
                symbol = polylinesymbol;
                break;
            default:
                symbol = polygonSymbol;
                break;
        }
        // Create a new graphic; add it to the Graphicslayer
       // console.log("b4 graphic");
        geometry =  webMercatorUtils.webMercatorToGeographic(geometry)
        /*if(boundry){
            var contains = geometryEngine.contains(boundry.geometry,geometry);
            var within = geometryEngine.within(geometry,boundry.geometry);                
        } else {*/
            var within = true;
        //}
                    
        if(within){
            
            let graphic = new Graphic({
                    geometry: geometry,symbol: symbol,//attributes: attr,popupTemplate: {
                        title: "{Name}",content: [{
                            type: "fields",fieldInfos: [{
                                fieldName: "X"
                            },{
                                fieldName: "Y"
                            }]
                        }]
                   }
            });                          
            tempGraphicslayer.add(graphic);
            if(currentGraphic){
                //currentGraphic.geometry.rings.push(geometry.rings[0]);
                geometry.rings.forEach( ring => currentGraphic.geometry.addRing(ring));
                //currentGraphic.geometry.addRing(geometry.rings);
                //console.log('current active',geometry);
               // console.log('current graphic',currentGraphic.geometry);
                graphic = currentGraphic;                    
            }                 
            var saveObj = graphic.toJSON();                        
           // console.log('saveObj',saveObj);
            $x('P24_JSON').value = JSON.stringify(saveObj);
          
        } else {
            apex.message.alert('&G_MAP_BOUNDRY_MSG.');
        }
        updateGraphic = null;
    }
    
   
   function addMultiGraph(evt1) {
       
        //let currentGraphic = popActiveGraphic(tempGraphicslayer);
        let currentGraphic = saveGraphicslayer.graphics.items.pop();
        
        var geometry = evt1.geometry;
        var vertices = evt1.vertices;
        var symbol;
     
        // Choose a valid symbol based on return geometry
        switch (geometry.type) {
            case "point":
                symbol = pointSymbol;
                break;
            case "polyline":
                symbol = polylinesymbol;
                break;
            default:
                symbol = polygonSymbol;
                break;
        }
       //console.log("ring",geometry.rings )
            let graphic = new Graphic({
                    geometry: geometry,{
                                fieldName: "Y"
                            }]
                        }]
                   }
            });                       
            tempGraphicslayer.add(graphic);
            if(currentGraphic){
                
                geometry.rings.forEach( ring => currentGraphic.geometry.addRing(ring));
                
            }              
            var saveObj1 = graphic.toJSON();                        
            //console.log('saveObj',graphic);
            $x('P24_JSON').value = JSON.stringify(saveObj1);
             
           
        
        updateGraphic = null;
    }

    window.loadGraphic = function(polygon){
        if(polygon===undefined || polygon === ''){
            console.error('no polygon');
        } else {
            
            
            var graphic = Graphic.fromJSON(JSON.parse(polygon));  
            if (graphic.geometry){
             
            
             
              addMultiGraph(graphic);
        
            //*********************************************************************
               view.center.longitude = graphic.geometry.centroid.longitude;
               view.center.latitude = graphic.geometry.centroid.latitude;
               view.center = [graphic.geometry.centroid.longitude,graphic.geometry.centroid.latitude];
                view.zoom = 12;
            }
        }
        
    }
    

    
    // *************************************
    // activate the sketch to create a point
    // *************************************
    var drawPointButton = document.getElementById("pointButton");
    drawPointButton.onclick = function () {
        // set the sketch to create a point geometry
        sketchviewmodel.create("point");
        setActiveButton(this);
    };
    // ****************************************
    // activate the sketch to create a polyline
    // ****************************************
    var drawLineButton = document.getElementById("polylineButton");
    drawLineButton.onclick = function () {
        // set the sketch to create a polyline geometry
        sketchviewmodel.create("polyline");
        setActiveButton(this);
    };

    var drawpolygonButton = document.getElementById("polygonButton");
    drawpolygonButton.onclick = function () {
        // set the sketch to create a polygon geometry
        sketchviewmodel.create("polygon");
        setActiveButton(this);
    };
    // ***************************************
    // activate the sketch to create a rectangle
    // ***************************************
    var drawRectangleButton = document.getElementById(
        "rectangleButton");
    drawRectangleButton.onclick = function () {
        // set the sketch to create a polygon geometry
        sketchviewmodel.create("rectangle");
        setActiveButton(this);
    };

    document.getElementById("resetBtn").onclick = function () {
       sketchviewmodel.reset();
      tempGraphicslayer.removeAll();
      saveGraphicslayer.removeAll();
      setActiveButton();
      drawBoundry();
    };

    function setActiveButton(selectedButton) {
        // focus the view to activate keyboard shortcuts for sketching
        view.focus();
        var elements = document.getElementsByClassName("active");
        for (var i = 0; i < elements.length; i++) {
            elements[i].classList.remove("active");
        }
        if (selectedButton) {
            selectedButton.classList.add("active");
        }
    }
    // ************************************************************************************
    // set up logic to handle geometry update and reflect the update on "tempGraphicslayer"
    // ************************************************************************************
    function setUpClickHandler() {
        view.on("click",function (evt) {
            view.hitTest(evt).then(function (response) {
                var results = response.results;
                // Found a valid graphic                    
                if (results.length && results[results.length - 1]
                    .graphic) {
                    // Check if we're already editing a graphic
                    if (!updateGraphic) {
                        // Save a reference to the graphic we intend to update
                        updateGraphic = results[results.length - 1].graphic;
                        // Remove the graphic from the Graphicslayer
                        // Sketch will handle displaying the graphic while being updated
                        tempGraphicslayer.remove(updateGraphic);
                        sketchviewmodel.update(updateGraphic.geometry);
                    }
                }
            });
        });
    } 
    

    function errorCallback(error) {
    console.log('error:',error);
  }
            // ************************************************************************************
    // returns graphic object if drawn on the map to contcat new graphics to it
    // ************************************************************************************
    function popActiveGraphic(graphicslayer){            
        let length = graphicslayer.graphics.length;
        let count = 0;
        if($v('P0_USER_LIMITS').length > 0){
            count++;
        }
        if(length > count){ //active drawing detected
            let result = graphicslayer.graphics.items[length-1];
            graphicslayer.remove(result);
            return result;
        }
    }
});
});

解决方法

好的,您可以在客户端或服务器上解析查询。取决于您的任务,您可以选择哪些选项。

如果您要使用空间查询,就像您提到的那样,并且您将其应用于 FeatureLayer,则您可以在客户端上解决它。这是一个很好的解决方案,因为您已经拥有这些功能,并且正在看到它们。在这种情况下,您有一个问题,how-to-get-get-name-of-hospital-or-street-in-particular-area-when-draw-polyline

现在,如果您需要查询可能不在您范围内的内容(您没有这些功能)或者您没有使用 FeatureLayer,您可能需要命令服务器执行此操作。但别担心,该库有多种工具可供使用,例如 QueryTask

这里有与之前相同的答案链接示例,但使用了 QueryTask

<html>

<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no'>
  <title>Select Feature With Polygon</title>
  <style>
    html,body {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 400px;
      width: 100%;
    }
    #namesDiv {
      margin: 10px;
      height: 200px;
      width: 100%;
      font-style: italic;
      font-weight: bold;
      font-family: Arial,Helvetica,sans-serif;
      font-size: 16px;
      color: green;
      overflow: auto;
    }
  </style>

  <link rel='stylesheet' href='https://js.arcgis.com/4.15/esri/css/main.css'>
  <script src='https://js.arcgis.com/4.15/'></script>

  <script>
    require([
      'esri/Map','esri/views/MapView','esri/layers/MapImageLayer','esri/layers/GraphicsLayer','esri/widgets/Sketch/SketchViewModel','esri/Graphic','esri/widgets/Expand','esri/tasks/QueryTask','esri/tasks/support/Query'
    ],function (
      Map,MapView,MapImageLayer,GraphicsLayer,SketchViewModel,Graphic,Expand,QueryTask,Query
    ) {
      let highlight = null;

      const states = new MapImageLayer({
        url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer'
      });

      const queryTask = new QueryTask({
        url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/2'
      });

      const polygonGraphicsLayer = new GraphicsLayer();

      const selected = new GraphicsLayer();

      const map = new Map({
        basemap: 'streets',layers: [states,polygonGraphicsLayer,selected]
      });

      const view = new MapView({
        container: 'viewDiv',map: map,center: [-75.1683665,39.951817],zoom: 8
      });

      const sketchViewModel = new SketchViewModel({
        view: view,layer: polygonGraphicsLayer,pointSymbol: {
          type: 'simple-marker',color: [255,255,0],size: '1px',outline: {
            color: 'gray',width: 0
          }
        }
      });

      sketchViewModel.on('create',function (event) {
        if (event.state === 'complete') {
          polygonGraphicsLayer.remove(event.graphic);
          selectFeatures(event.graphic.geometry);
        }
      });

      const namesDiv = document.getElementById('namesDiv');

      view.ui.add('select-by-polygon','top-left');
      const selectButton = document.getElementById('select-by-polygon');

      selectButton.addEventListener('click',function () {
        clearUpSelection();
        sketchViewModel.create('polygon');
      });

      function selectFeatures(geometry) {
        selected.removeAll();
        const query = new Query();
        query.returnGeometry = true;
        query.outFields = ['*'];
        query.geometry = geometry;
        queryTask
          .execute(query)
          .then(function (results) {
            const graphics = results.features.map(r => {
              r.symbol = {
                type: 'simple-fill',fill: 'none',outline: {
                  color: 'cyan',width: 2
                }
              };
              return r;
            });
            selected.addMany(graphics);
            namesDiv.innerHTML = graphics.map(g => g.attributes.NAME).join(',');
          })
          .catch(errorCallback);
      }

      function clearUpSelection() {
        selected.removeAll();
        namesDiv.innerHTML = null;
      }

      function errorCallback(error) {
        console.log('error:',error);
      }

    });
  </script>
</head>

<body>
  <div id='viewDiv'>
    <div
      id="select-by-polygon"
      class="esri-widget esri-widget--button esri-widget esri-interactive"
      title="Select counties by polygon"
    >
      <span class="esri-icon-checkbox-unchecked"></span>
    </div>
  </div>
  <div id="namesDiv"></div>
</body>

</html>

最后,我将这个 link 留给文档,该文档很好地解释了所有的可能性、优点和缺点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。