2 votos

select features within buffer arcgis javascript

Estoy intentando utilizar el javascript de arcgis para crear un buffer select. cuando intento añadir el script para seleccionar las características dentro del buffer, no funciona nada, pero cuando quito la parte de selección del script el buffer funciona. Si alguien me puede ayudar. Aquí está el código:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<title></title>

<link rel="stylesheet" href="http://js.arcgis.com/3.14/dijit/themes/tundra/tundra.css">
<link rel="stylesheet" href="http://js.arcgis.com/3.14/esri/css/esri.css">
<style>
  html, body { height: 100%; width: 100%; margin: 0; padding: 0; }
  h3 { margin: 0 0 5px 0; border-bottom: 1px solid #444; }
  .shadow {
    -moz-box-shadow: 0 0 5px #888;
    -webkit-box-shadow: 0 0 5px #888;
    box-shadow: 0 0 5px #888;
  }
  #map{ margin: 0; padding: 0; }
  #feedback {
    background: #fff;
    color: #444;
    position: absolute;
    font-family: arial;
    height: 200px;
    left: 30px;
    margin: 5px;
    padding: 10px;
    bottom: 30px;
    width: 300px;
    z-index: 40;
  }
  #note { font-size: 80%; font-weight: 700; padding: 0 0 10px 0; }
</style>

<script>var dojoConfig = { parseOnLoad: true };</script>
<script src="http://js.arcgis.com/3.14/"></script>
<script>
  dojo.require("dijit.layout.BorderContainer");
  dojo.require("dijit.layout.ContentPane");
  dojo.require("esri.map");
  dojo.require("esri.tasks.geometry");
  dojo.require("esri.tasks.query");
  dojo.require("esri.layers.FeatureLayer");

  // one global for persistent app variables
  var app = {};

  function init() {
    var basemap;
    app.map = new esri.Map("map", { 
      basemap: "streets",
      center: [-82.44, 28.3],
      zoom: 12,
      slider: false
    });

    var layer = new esri.layers.ArcGISDynamicMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer");  
    app.map.addLayer(layer);

    app.qtask = new esri.tasks.QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/0");

    app.map.addLayer(new esri.layers.GraphicsLayer({ "id": "Geodesic" }));
    app.map.addLayer(new esri.layers.GraphicsLayer({ "id": "Euclidean" }));

    dojo.connect(app.map, "onClick", createBuffers);

    app.gsvc = new esri.tasks.GeometryService("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Utilities/Geometry/GeometryServer");
  }

  function createBuffers(e) {
    var line, twentyPixels, bufferEuclidean, bufferGeodesic, distance, unit;

    app.map.getLayer("Geodesic").clear();
    app.map.getLayer("Euclidean").clear();
    app.map.graphics.clear();
    app.map.infoWindow.hide();

    twentyPixels = (app.map.extent.getWidth() / app.map.width) * 20;
    line = new esri.geometry.Polyline(app.map.spatialReference);
    line.addPath([
      [e.mapPoint.x - twentyPixels, e.mapPoint.y - twentyPixels],
      [e.mapPoint.x + twentyPixels, e.mapPoint.y + twentyPixels]
    ]);

    app.map.graphics.add(
      new esri.Graphic(line, new esri.symbol.SimpleLineSymbol())
    );

    distance = 660;
    unit = esri.tasks.GeometryService.UNIT_FOOT;

    bufferEuclidean = new esri.tasks.BufferParameters();
    bufferEuclidean.geometries = [ line ];
    bufferEuclidean.distances = [ distance ];
    bufferEuclidean.unit = unit;
    bufferEuclidean.outSpatialReference = app.map.spatialReference;

    bufferGeodesic = new esri.tasks.BufferParameters();
    bufferGeodesic.geometries = [ line ];
    bufferGeodesic.distances = [ distance ];
    bufferGeodesic.outSpatialReference = app.map.spatialReference;
    bufferGeodesic.unit = unit;
    bufferGeodesic.geodesic = true;

    app.gsvc.buffer(bufferEuclidean, showEuclidean);
    app.gsvc.buffer(bufferGeodesic, showGeodesic);

  }

  function drawPolygon() {  
      var polygon = new esri.geometry.Polygon(distance);  
      var symbol = new esri.symbol.SimpleFillSymbol().setStyle(esri.symbol.SimpleFillSymbol.STYLE_SOLID);  
      polylineGraphic = new esri.Graphic(polygon, symbol);  
      map.graphics.add(polylineGraphic);  
  }
  //The code to select features within the buffer starts here

  function doQuery() {

      var query = new esri.tasks.Query();
      query.geometry = app.bufferGeodesic.getExtent();
      layer.queryFeatures(query, queryCallback);

      var query = new esri.tasks.Query();  
      query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_CONTAINS;  
      query.geometry = polylineGraphic.geometry;  
      query.returnGeometry = true;  
      qtask.execute(query, queryCallback);  
     }

  function queryCallback(featureSet) {  
      var symbol = new esri.symbol.SimpleMarkerSymbol();  
      app.symbol.style = esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE;  
      app.symbol.setSize(12);  
      app.symbol.setColor(new dojo.Color([255,255,0,0.5]));  

      var features = featureSet.features;  
      dojo.forEach(features, function(feature) {  
       feature.setSymbol(symbol);  
       map.graphics.add(feature);  
      });  
     }  

    dojo.addOnLoad(init); 

//The code to select features within the buffer ends here

  function showEuclidean(b) {
    var attrs, sym;

    attrs = { "type": "Euclidean" };
    sym = new esri.symbol.SimpleFillSymbol();
    sym.setColor(null);
    sym.setOutline(new esri.symbol.SimpleLineSymbol("solid", new dojo.Color([0, 0, 255, 1]), 2));
    addGraphic(b[0], attrs, sym);
  }

  function showGeodesic(b) {
    var attrs, sym;

    attrs = { "type": "Geodesic" };
    sym = new esri.symbol.SimpleFillSymbol();
    sym.setColor(null);
    sym.setOutline(new esri.symbol.SimpleLineSymbol("solid", new dojo.Color([255, 0, 0, 1]), 2));
    addGraphic(b[0], attrs, sym);
  }

  function addGraphic(geom, attrs, sym) {
    var template, g, s;

    template = new esri.InfoTemplate("660 Feet Buffer", "Type: ${type}");
    g = app.map.getLayer("Geodesic");
    s = app.map.getLayer("Euclidean");
    app.map.getLayer(attrs.type).add(
      new esri.Graphic(geom, sym, attrs, template)
    );

    if ( g.graphics.length > 0 &&
         s.graphics.length > 0 )  {
      app.map.setExtent(esri.graphicsExtent([g.graphics[0], s.graphics[0]]), true);
    }
  }

  function errorHandler(err) {
    console.log("error: ", err);
  }

  dojo.ready(init);

</script>
</head>

<body class="tundra">
<div data-dojo-type="dijit.layout.BorderContainer"
     data-dojo-props="design:'headline',gutters:false"
     style="width: 100%; height: 100%; margin: 0;">
  <div id="map"
       data-dojo-type="dijit.layout.ContentPane"
       data-dojo-props="region:'center'">

    <div id="feedback" class="shadow">
      <h3>Geodesic Buffering</h3>
      <div id="info">
        <div id="note">
          Note:  This sample requires an ArcGIS Server version 10.1 geometry service.
        </div>
        <div id="instructions">
          Click the map to generate a line and buffer the line by 660 Feet. 
          Geodesic buffer in red, euclidean in blue. The closer the click point to the equator, 
          the more similar the results will be.

          <input type="button" value="Query for points within the polygon graphic." onclick="doQuery();" />
        </div>
      </div>
    </div>
  </div>
</div>
</body>
</html>

1voto

user21012 Puntos 21

He eliminado la llamada de abajo y una vez más fue capaz de generar búferes.

dojo.addOnLoad(init)

después, pude ver que la referencia a app.bufferGeodesic dentro de su doQuery() lo que tiene sentido, porque no veo ninguna mención de la misma en cualquier otro lugar.

He reescrito la muestra original en AMD y voy a pedir al equipo que lo actualice en nuestro sitio web en vivo. dicho esto, es probable que sea mejor utilizar nuestro local más moderno geometryEngine como punto de partida que este otro más antiguo que se basa en hacer una llamada a un servicio de geometría.

consulte este blog para obtener más información: http://blogs.esri.com/esri/arcgis/2015/09/23/geometryengine-part-3-overlay-analysis/

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X