Изменить порядок полигонов в векторном слое? (arcgis js 4.xx) - PullRequest
3 голосов
/ 10 июля 2020

Я попытался использовать приведенное ниже в моем первоначальном запросе и запросить прямо перед рисованием моих многоугольников с разрывами классов.

    query.orderByFields = ["Shape__Area DESC"];

Однако это, похоже, ничего не дало. Я также пробовал использовать поле grid_value .

Вот мой соответствующий код, в котором я запрашиваю, а затем делаю рисунок ... основная проблема заключается в том, что иногда большие полигоны блокируют более мелкие .. Я в основном их вижу, но проблема не в видимости .. Мне нужно также иметь возможность щелкать по ним ... если меньшие полигоны будут рисоваться поверх большинства слоев, или даже более высокие значения сетки должны решить эту проблему. Я нашел orderByFields в документации, но, похоже, ничего не делает ...

query.outFields = ["*"];
  //query.orderByFields = ["Shape__Area DESC"];
  query.returnDistinctValues = false;
  query.returnGeometry = true;
  QT.execute(query).then(function (evt) {
    evt.features.forEach(function (feature) {
      var att = feature.attributes
      var test = geometryEngine.convexHull(feature.geometry)
      var genpoly = null
      if (att.grid_value <= 4.0) {
        var rad = att.Shape__Length / 75
        genpoly = new Circle({
          center: test.centroid,
          radius: rad,
          radiusUnit: "meters"
        })
      } else {
        genpoly = test
      }
      var polygonGraphic = new Graphic({
        geometry: genpoly,
        attributes: att,
        type: "polygon"
      });
      gras.push(polygonGraphic);
    });
    var renderer = {
      type: "class-breaks",
      field: "grid_value",
      classificationMethod: "esriClassifyManual",
      classBreakInfos: [{
          minValue: 0,
          maxValue: 1.9999,
          symbol: {
            color: [0, 0, 0, 0],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "I (Not Felt)"
        },
        {
          minValue: 2.0,
          maxValue: 3.0,
          symbol: {
            color: [191, 204, 255, .3],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "II (Weak)"
        },
        {
          minValue: 3.1,
          maxValue: 3.9,
          symbol: {
            color: [153, 153, 255, .4],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "III (Weak)"
        },
        {
          minValue: 4.0,
          maxValue: 4.5,
          symbol: {
            color: [136, 255, 255, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "IV (Light)"
        },
        {
          minValue: 4.5,
          maxValue: 4.9999,
          symbol: {
            color: [125, 248, 148, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "V (Light)"
        },
        {
          minValue: 6.0,
          maxValue: 6.9999,
          symbol: {
            color: [255, 255, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "VI (Strong)"
        },
        {
          minValue: 7.0,
          maxValue: 7.9999,
          symbol: {
            color: [255, 221, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "VII (Very Strong)"
        },
        {
          minValue: 8.0,
          maxValue: 8.9999,
          symbol: {
            color: [255, 145, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "VIII (Severe) "
        },
        {
          minValue: 9.0,
          maxValue: 9.9999,
          symbol: {
            color: [255, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "IX (Violent)"
        },
        {
          minValue: 10.0,
          maxValue: 10.9999,
          symbol: {
            color: [221, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "X"
        },
        {
          minValue: 11.0,
          maxValue: 11.9999,
          symbol: {
            color: [136, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "XI"
        },
        {
          minValue: 12.0,
          maxValue: 12.0,
          symbol: {
            color: [68, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "XII"
        }
      ]
    }
         var popupTrails = {
             outFields: ["*"],
             "title": "Shake ID: {id}",
            "content": function (feature){
              let name_plc;
              let dlv = document.createElement("div");
              dlv.className = "popd";
              dlv.innerHTML = `<b><span class='name_plc'></span></b><br>ID: <span class="ida">${feature.graphic.attributes.id}</span><br> URL: <a href="${feature.graphic.attributes.url}" target="_blank">View</a> <br> Updated: ${feature.graphic.attributes.updated} <br>Grid_value: ${feature.graphic.attributes.grid_value}<br> Event Time: ${feature.graphic.attributes.eventTime} <style>.esri-popup__navigation { display: none;}</style>`;
              
              getName();
              
              function getName() {
               let cId = $('span.ida').text();
               if (cId) { 
                  //console.log(cId);
                  let q3 = new Query();
                  q3.where = "id = '"+ cId +"'";
                  q3.outFields = ["*"];
                   QTt.execute(q3).then(function (results) {
                      results.features.map(function (feat) {
                        let pID = feat.attributes["id"];
                        if (cId === pID) {
                           name_plc = feat.attributes["place"];
                             console.log(name_plc);
                             let tx = $('.name_plc').text();
                             if (tx == 0){
                               $(".name_plc").append(name_plc);
                             }
                        }
                      });
                  });
              } else {
                setTimeout(getName, 230);
              }
             }
              return dlv; 
      },
    };
    fl = new FeatureLayer({
      source: gras,
      objectIdField: "ObjectID",
      geometryType: "polygon",
      fields: [{
        name: "ObjectID",
        alias: "ObjectID",
        type: "oid"
      }, {
        name: "id",
        alias: "id",
        type: "string"
      }, {
        name: "updated",
        alias: "Last Update",
        type: "string"
      }, {
        name: "eventTime",
        alias: "eventTime",
        type: "string"
      }, {
        name: "url",
        alias: "url",
        type: "string"
      }, {
        name: "grid_value",
        alias: "grid_value",
        type: "double"
      }],
      renderer: renderer,
      popupEnabled: true,
      //outFields: ['*'],
      popupTemplate: popupTrails,
      visibleElements: [{
          featureNavigation: false, 
      }],
    });
    map.add(fl);

Вот и мой полный CodePen .. Любой способ сделать это на стороне клиента javascript? просто поменять индекс на самые маленькие полигоны сверху ?! В 1/3 раза некоторые из моих полигонов отображаются в правильном порядке ... но мне нужно убедиться, что они все всегда отображаются, чтобы они были видны, и я мог щелкнуть по ним.

Обновление:

Вот лучший снимок экрана: например, я пытаюсь щелкнуть зеленую фигуру посередине, самый большой синий кружок выделяется, а во всплывающем окне отображается только мета для вон тот. Невозможно щелкнуть меньшие внутренние.

т.е. перед щелчком.

enter image description here

i.e. after trying to click the green inner small polygon -- only outer is accessible.

введите описание изображения здесь

возможно, проблема в том, что мой заказ по пункту должен быть обработан в моем фильтре?

 eqLayerView.filter = {
          outFields: "*",
          orderByFields: "Shape__Area DESC",
          where: "id IN (" + sqlExp + ")"
        };

1 Ответ

2 голосов
/ 11 июля 2020

Взгляните на этот пример, он основан на вашем коде, я просто удаляю много вещей и оставляю важные, чтобы увидеть, как работает сортировка по областям. Как я уже говорил, слой плюс средство визуализации не помогли вам понять это. Просто щелкните, и вы увидите, что каждая функция была выбрана.

<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>OrderByFields - Render order</title>
  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
  </style>
  <link rel="stylesheet" href="https://js.arcgis.com/4.15/esri/themes/light/main.css">
  <script src="https://js.arcgis.com/4.15/"></script>

  <script>
    require([
      "esri/Map",
      "esri/views/MapView",
      "esri/layers/FeatureLayer",
      "esri/geometry/geometryEngine",
      "esri/geometry/Circle",
      "esri/Graphic",
      "esri/symbols/SimpleFillSymbol",
      "esri/tasks/QueryTask",
      "esri/tasks/support/Query"
    ], function (
      Map,
      MapView,
      FeatureLayer,
      geometryEngine,
      Circle,
      Graphic,
      SimpleFillSymbol,
      QueryTask,
      Query) {

      var map = new Map({
        basemap: "gray"
      });

      var view = new MapView({
        container: "viewDiv",
        map: map,
        center: [-122, 37],
        zoom: 2
      });

      let fl;
      let gras = [];
      let dVals = [];

      const QT = new QueryTask({
        url: "https://services9.arcgis.com/RHVPKKiFTONKtxq3/arcgis/rest/services/USGS_Seismic_Data_v1/FeatureServer/1"
      });

      const query = new Query();
      query.where = "eventTime >= CURRENT_TIMESTAMP - 30 AND updated >= CURRENT_TIMESTAMP - 30 AND grid_value > 2 AND id = 'us6000ah9t'";
      query.outFields = ["*"];
      query.orderByFields = ["Shape__Area DESC"];
      query.returnDistinctValues = false;
      query.returnGeometry = true;
      QT.execute(query).then(function (evt) {
        evt.features.forEach(function (feature) {
          const att = feature.attributes
          console.log(att.Shape__Area);
          const test = geometryEngine.convexHull(feature.geometry)
          let genpoly = null
          if (att.grid_value <= 4.0) {
            const rad = att.Shape__Length / 75
            genpoly = new Circle({
              center: test.centroid,
              radius: rad,
              radiusUnit: "meters"
            })
          } else {
            genpoly = test
          }
          att.newArea = geometryEngine.geodesicArea(genpoly);
          const polygonGraphic = new Graphic({
            geometry: genpoly,
            attributes: att,
            type: "polygon"
          });
          gras.push(polygonGraphic);
        });

        fl = new FeatureLayer({
          source: gras.sort((a, b) => {
            if (a.attributes.newArea < b.attributes.newArea) {
              return 1;
            }
            if (a.attributes.newArea > b.attributes.newArea) {
              return -1;
            }
            return 0;
          }),
          objectIdField: "ObjectID",
          geometryType: "polygon",
          fields: [
            {
              name: "ObjectID",
              alias: "ObjectID",
              type: "oid"
            }, {
              name: "id",
              alias: "id",
              type: "string"
            }, {
              name: "grid_value",
              alias: "grid_value",
              type: "double"
            }, {
              name: "Shape__Area",
              alias: "Original Area",
              type: "double"
            }, {
              name: "newArea",
              alias: "Process Area",
              type: "double"
            }
          ],
          popupTemplate: {
            title: "{id}",
            content: [
              {
                type: "fields",
                fieldInfos: [
                  {
                    fieldName: "grid_value",
                    label: "Grid Value"
                  },
                  {
                    fieldName: "Shape__Area",
                    label: "Old Area"
                  },
                  {
                    fieldName: "newArea",
                    label: "Process Area"
                  }
                ]
              }
            ]
          },
          renderer: {
            type: "simple",
            symbol: {
              type: "simple-fill",
              color: [255, 0, 0, 1],
              outline: {
                width: 1,
                color: "black"
              }
            }
          }
        });
        map.add(fl);
      });
    });
  </script>
</head>

<body>
  <div id="viewDiv"></div>
</body>

</html>

ОБНОВЛЕНИЕ:

После просмотра вашего обновления, я думаю, что лучше понимаю проблему, и я заметил кое-что, что я пропустил раньше, featureNavigation: false. Я почти уверен, что при нажатии выбираются все функции, проблема в том, что тот, который вам нужен, не появляется первым. Другими словами, у вас есть проблема с порядком, в котором всплывающее окно показывает выбранные функции.

Итак, я предложу вам простое решение, вручную откройте всплывающее окно с функцией желаний (в вашем случае то, что меньше площади). Для этого вам необходимо:

  1. отключить автоматическое открытие всплывающих окон
  2. обработать событие щелчка при просмотре
  3. использовать метод проверки результатов просмотра для получения функций
  4. открыть всплывающее окно с функцией desire

Взгляните на этот пример, который я сделал для вас, я добавляю дополнительное условие для извлечения некоторых функций, чтобы сделать его быстрее

<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>esriFieldTimeDate</title>
  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
  </style>
  <link rel="stylesheet" href="https://js.arcgis.com/4.15/esri/themes/light/main.css">
  <script src="https://js.arcgis.com/4.15/"></script>

  <script>
    require([
      "esri/Map",
      "esri/views/MapView",
      "esri/layers/FeatureLayer",
      "esri/geometry/geometryEngine",
      "esri/geometry/Circle",
      "esri/Graphic",
      "esri/symbols/SimpleFillSymbol",
      "esri/tasks/QueryTask",
      "esri/tasks/support/Query"
    ], function (
      Map,
      MapView,
      FeatureLayer,
      geometryEngine,
      Circle,
      Graphic,
      SimpleFillSymbol,
      QueryTask,
      Query) {

      var map = new Map({
        basemap: "gray"
      });

      var view = new MapView({
        container: "viewDiv",
        map: map,
        center: [-122, 37],
        zoom: 2
      });

      let fl;
      let gras = [];

      const QT = new QueryTask({
        url: "https://services9.arcgis.com/RHVPKKiFTONKtxq3/arcgis/rest/services/USGS_Seismic_Data_v1/FeatureServer/1"
      });

      function newAreaCompareFunction(a, b) {
        if (a.attributes.newArea < b.attributes.newArea) {
          return 1;
        }
        if (a.attributes.newArea > b.attributes.newArea) {
          return -1;
        }
        return 0;
      }

      const simpleRenderer = {
        type: "simple",
        symbol: {
          type: "simple-fill",
          color: [255, 0, 0, 1],
          outline: {
            width: 1,
            color: "black"
          }
        }
      };
      const docRenderer = {
        type: "class-breaks",
        field: "grid_value",
        classificationMethod: "esriClassifyManual",
        classBreakInfos: [{
          minValue: 0,
          maxValue: 1.9999,
          symbol: {
            color: [0, 0, 0, 0],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "I (Not Felt)"
        },
        {
          minValue: 2.0,
          maxValue: 3.0,
          symbol: {
            color: [191, 204, 255, .3],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "II (Weak)"
        },
        {
          minValue: 3.1,
          maxValue: 3.9,
          symbol: {
            color: [153, 153, 255, .4],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "III (Weak)"
        },
        {
          minValue: 4.0,
          maxValue: 4.5,
          symbol: {
            color: [136, 255, 255, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "IV (Light)"
        },
        {
          minValue: 4.5,
          maxValue: 4.9999,
          symbol: {
            color: [125, 248, 148, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "V (Light)"
        },
        {
          minValue: 6.0,
          maxValue: 6.9999,
          symbol: {
            color: [255, 255, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "VI (Strong)"
        },
        {
          minValue: 7.0,
          maxValue: 7.9999,
          symbol: {
            color: [255, 221, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "VII (Very Strong)"
        },
        {
          minValue: 8.0,
          maxValue: 8.9999,
          symbol: {
            color: [255, 145, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "VIII (Severe) "
        },
        {
          minValue: 9.0,
          maxValue: 9.9999,
          symbol: {
            color: [255, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "IX (Violent)"
        },
        {
          minValue: 10.0,
          maxValue: 10.9999,
          symbol: {
            color: [221, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "X"
        },
        {
          minValue: 11.0,
          maxValue: 11.9999,
          symbol: {
            color: [136, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "XI"
        },
        {
          minValue: 12.0,
          maxValue: 12.0,
          symbol: {
            color: [68, 0, 0, 1],
            outline: {
              color: [0, 0, 0, 0],
              width: 0.4,
              type: "simple-line",
              style: "solid"
            },
            type: "simple-fill",
            style: "solid"
          },
          label: "XII"
        }
        ]
      };

      const query = new Query();
      query.where = "eventTime >= CURRENT_TIMESTAMP - 30 AND updated >= CURRENT_TIMESTAMP - 30 AND grid_value > 2 AND id = 'us6000ah9t'";
      query.outFields = ["*"];
      query.orderByFields = ["Shape__Area DESC"];
      query.returnDistinctValues = false;
      query.returnGeometry = true;
      QT.execute(query).then(function (evt) {
        evt.features.forEach(function (feature) {
          const att = feature.attributes
          console.log(att.Shape__Area);
          const test = geometryEngine.convexHull(feature.geometry)
          let genpoly = null
          if (att.grid_value <= 4.0) {
            const rad = att.Shape__Length / 75
            genpoly = new Circle({
              center: test.centroid,
              radius: rad,
              radiusUnit: "meters"
            })
          } else {
            genpoly = test
          }
          att.newArea = geometryEngine.geodesicArea(genpoly);
          const polygonGraphic = new Graphic({
            geometry: genpoly,
            attributes: att,
            type: "polygon"
          });
          gras.push(polygonGraphic);
        });

        fl = new FeatureLayer({
          source: gras.sort(newAreaCompareFunction),
          objectIdField: "ObjectID",
          geometryType: "polygon",
          fields: [
            {
              name: "ObjectID",
              alias: "ObjectID",
              type: "oid"
            }, {
              name: "id",
              alias: "id",
              type: "string"
            }, {
              name: "grid_value",
              alias: "grid_value",
              type: "double"
            }, {
              name: "Shape__Area",
              alias: "Original Area",
              type: "double"
            }, {
              name: "newArea",
              alias: "Process Area",
              type: "double"
            }
          ],
          popupTemplate: {
            title: "{id}",
            content: [
              {
                type: "fields",
                fieldInfos: [
                  {
                    fieldName: "ObjectID",
                    label: "Object ID"
                  },
                  {
                    fieldName: "grid_value",
                    label: "Grid Value"
                  },
                  {
                    fieldName: "Shape__Area",
                    label: "Old Area"
                  },
                  {
                    fieldName: "newArea",
                    label: "Process Area"
                  }
                ]
              }
            ]
          },
          renderer: docRenderer
        });
        map.add(fl);

        view.goTo(
          gras
            .map(f => f.geometry.extent)
            .reduce(
              (p, c) => p ? p.union(c) : c
            )
        );

        view.popup.autoOpenEnabled = false; // <- disable view popup auto open
        view.on("click", function (event) { // <- listen to view click event
          view.hitTest(event, { include: fl }) // <- retrieve features
            .then(function (response) {
              if (response.results.length) {
                var feature = response.results // <- get desire feature 
                  .map(result => result.graphic)
                  .reduce(
                    (p, c) => 
                    p ? (c.attributes.newArea < p.attributes.newArea ? c : p) : c
                  )
                  ;
                view.popup.open({ // <- open popup
                  location: event.mapPoint, // <- use map point of the click event
                  features: [feature] // <- add the desire feature
                });
              }
            });
        });
      });
    });
  </script>
</head>

<body>
  <div id="viewDiv"></div>
</body>

</html>
...