代码之家  ›  专栏  ›  技术社区  ›  Lakhwinder Singh

ArcGIS:h{name:“esri.layers.graphics.QueryEngine”,消息:“Unsupported query”,详细信息:undefined}使用api请求加载数据时

  •  0
  • Lakhwinder Singh  · 技术社区  · 7 年前

    我面临着功能层的问题。用本地数据绘制地图时。但是,当我在要素图层中使用托管数据时,图形要素工作正常,对图形数据的查询也工作正常。

    但是,当我使用api请求使用本地系统数据时,在map上绘制对象可以正常工作,但是查询过滤不能处理要素层数据。下面是示例代码。

    <link rel="stylesheet" href="https://js.arcgis.com/4.8/esri/css/main.css">
    
    <style>
        #viewDiv {
            height: 100%;
        }
        .popUpMapView {
            height: 400px;
            border: 1px solid #A8A8A8;
        }
        #drawActions {
            padding: 0 5px;
            background: #eee;
            border-left: 1px solid #999;
            border-right: 1px solid #999;
        }
        #drawActions ul {
            list-style-type: none;
            margin: 0;
            padding: 0;
        }
        #drawActions ul li {
            display: inline-block;
        }
        #drawActions ul li .esri-widget--button {
            background: #eee;
        }
        #drawActions ul li .esri-widget--button:hover {
            background: #fff;
        }
        .esri-ui-top-left .esri-component {
            margin-bottom: 0;
            border-top: solid 1px rgba(50,50,50,0.25);
        }
        .esri-popup.esri-widget {
          max-height: 100%;
        }
    
        .esri-view-width-xlarge .esri-popup__main-container {
          width: 580px;
        }
    
        .esri-view-height-less-than-medium .esri-popup__main-container {
          max-height: 500px;
        }
    
        .esri-view-height-small .esri-ui-corner .esri-component .esri-expand__content,
        .esri-view-width-greater-than-xsmall .esri-expand--auto .esri-expand__content {
            margin-left: 0;
            white-space: nowrap;
        }
        .esri-widget--button {
            outline: 0;
        }
        .esri-legend__layer-body {
            display: table;
            width: 100%;
            margin: 0;
        }
        .color-selection-item-container {
            cursor: pointer;
        }
        .item-selected .color-selection-item-container {
            opacity: 0.5;
        }
        .item-selected .color-selection-item-container.active {
            opacity: 1;
        }
        .item-selected .color-selection-item-container.active .esri-legend__layer-cell--info {
            color: #000;
        }
    </style>
    
    
    <script>
        var dojoConfig = {
            has: {
                "esri-featurelayer-webgl": 1
            }
        }
    </script>
    <script src="https://js.arcgis.com/4.8/"></script>
    <script>
        let highlight;
        let highlightFields = [];
        let povLayer;
        let plantTypeFilterObj = [];
        require([
            "esri/Map",
            "esri/views/MapView",
            "esri/WebMap",
            "esri/widgets/Sketch/SketchViewModel",
            "esri/Graphic",
            "esri/layers/GraphicsLayer",
            "esri/layers/FeatureLayer",
            "esri/widgets/Home",
            "esri/widgets/Legend",
            "esri/widgets/Expand",
            "esri/geometry/Point",
            "esri/config",
            "esri/request",
            "dojo/domReady!"
        ], function(
            Map, MapView, WebMap, SketchViewModel, Graphic, GraphicsLayer, FeatureLayer, Home, Legend, Expand, Point, erisConfig, Request
        ) {
    
            const tempGraphicsLayer = new GraphicsLayer();
    
            var map = new Map({
                basemap: "dark-gray",
                layers: [tempGraphicsLayer]
            });
    
            const view = new MapView({
                map: map,
                container: "viewDiv",
                center: [-91.891111, 42.477778],
                zoom: 4,
                highlightOptions: {
                  color: "black",
                  haloOpacity: 0,
                  fillOpacity: 0.45
                },
            });
    
            let highlightHandle = null;
    
            view.when(function() {
    
                    getData()
                        .then(createGraphics)
                        .then(createLayer)
                        .catch(errback);
            });
    
            function getData() {
                let url = "http://localhost/arcgis/points-listing";
                return Request(url, {
                    responseType: "json"
                });
            }
    
            function createGraphics(response) {
                let items = response.data.data;
                let geojson = items.map(function(item, i) {
                    return {
                        geometry: new Point({
                            x: item.lng,
                            y: item.lat
                        }),
                        attributes: {
                            ObjectID:           item.plant_id,
                            name:               item.name,
                            address:            item.street_address,
                            city:               item.city,
                            state_code:         item.state_code,
                            zip:                item.zip,
                            county:             item.county,
                            lng:                item.lng,
                            lat:                item.lat,
                            nameplate_capacity: item.nameplate_capacity,
                            plant_type:         item.plant_type
                        }
                    };
                });
    
                return geojson;
            }
    
            function createLayer(graphics) {
    
                let layer = new FeatureLayer({
                    source: graphics,
    
                    fields: getFields(), 
                    objectIdField: "ObjectID",
                    renderer: getRender(),
                    geometryType: "point",
                    popupTemplate: getTemplate(),
                    elevationInfo: {
                        mode: "on-the-ground"
                    }
                });
    
                var legend = new Legend({
                    view: view,
                    layerInfos: [{
                        layer: layer,
                        title: "Plants detail"
                    }]
                });
                view.ui.add(legend, "top-right");
                map.add(layer);
    
                view.whenLayerView(layer).then(function(layerView) {
                    sketchGraphics(layerView);
                    setTimeout(function() {
                        hideShowPointsOnPlantTypeBasis();
                        colorSelectionClick();
                    }, 1000);
                });
                return layer;
            }
    
            function hideShowPointsOnPlantTypeBasis()
            {
                let legendContainer = document.getElementsByClassName("esri-legend__layer-table--size-ramp")[0];
                legendContainer.className += " color-section";
                let legendInfoItem = legendContainer.getElementsByClassName("esri-legend__layer-cell--info");
    
    
                for (let i = 0; i < legendInfoItem.length; i++) {
    
                    let element = legendInfoItem[i];
                    let text = element.innerHTML;
                    let value = (text.toUpperCase()).replace(" ", "_");
    
                    checkbox = document.createElement("input");
                    checkbox.setAttribute("type", "checkbox");
                    checkbox.setAttribute("class", "plant-type-filtering-checkbox");
                    checkbox.setAttribute("style", "display:none;");
                    checkbox.setAttribute("value", value);
    
                    element.parentNode.classList.add("color-selection-item-container");
                    element.parentNode.insertBefore(checkbox, element.parentNode.firstChild);
    
                }
            }
    
            function colorSelectionClick() {
                $('.esri-expand__content').on('click', '.color-selection-item-container', function(e) {
                    e.preventDefault();
                    let $this = $(this);
                    let $input = $this.find('input.plant-type-filtering-checkbox');
                    let selectedVal = $input.val();
    
                    if(!$input.is(':checked')) {
                        plantTypeFilterObj.push(selectedVal);
                        $input.prop('checked', true);
                        $this.addClass('active');
    
                    } else {
                        $this.removeClass('active');
                        plantTypeFilterObj = plantTypeFilterObj.filter(function(value, index, arr){
                            return value != selectedVal;
                        });
                        $input.prop('checked', false);
                    }
    
                    let layerViews = view.layerViews;
                    if(plantTypeFilterObj.length > 0) {
                        viewLayer.layer.definitionExpression = "nameplate_capacity > 0 AND plant_type IN ('" + plantTypeFilterObj.join("','") + "')";
                    } else {
                        viewLayer.layer.definitionExpression = '';
                    }
    
                    let selectedCount = $('.esri-expand__content').find('.color-selection-item-container.active').length;
                    if(selectedCount > 0) {
                        $('.esri-expand__content').addClass('item-selected');
                    } else {
                        $('.esri-expand__content').removeClass('item-selected');
                    }
                });
            }
    
            function sketchGraphics(layer) {
    
                viewLayer = layer;
    
                // create a new sketch view model
                const sketchViewModel = new SketchViewModel({
                    view: view,
                    layer: tempGraphicsLayer,
                    pointSymbol: {
                        type: "simple-marker", // autocasts as new SimpleMarkerSymbol()
                        style: "square",
                        size: "16px"
                    }
                });
    
    
                setUpClickHandler(view);
                sketchViewModel.on("create", createGraphic);
                sketchViewModel.on("create-complete", addGraphic);
    
                // Listen the sketchViewModel's update-complete and update-cancel events
                sketchViewModel.on("update-complete", updateGraphic);
                sketchViewModel.on("update-cancel", updateGraphic);
    
    
                var drawCircleButton = document.getElementById("circleButton");
                var drawRectangleButton = document.getElementById("rectangleButton");
                var drawPolygonButton = document.getElementById("polygonButton");
    
                drawCircleButton.onclick = function() {
                  resetSketchView();
                  sketchViewModel.create("circle");
    
                  setActiveButton(this);
                };
    
                drawRectangleButton.onclick = function() {
                  resetSketchView();
                  sketchViewModel.create("rectangle");
    
                  setActiveButton(this);
                };
    
                drawPolygonButton.onclick = function() {
                    resetSketchView();
    
                    sketchViewModel.create("polygon");
                    setActiveButton(this);
                };
    
                view.on('click', function(event) {
                    resetSketchView();
                });
    
                // reset all the changes from map on btn click.
                document.getElementById("resetBtn").onclick = function() {
                    resetSketchView();
                };
    
                function addGraphic(event) {
                    const graphic = new Graphic({
                        geometry: event.geometry,
                        symbol: sketchViewModel.graphic.symbol
                    });
                    tempGraphicsLayer.add(graphic);
                    selectFeatures(event.geometry);
                }
    
                function createGraphic(event) {
                    resetHideShowPoints();
                }
    
                function updateGraphic(event) {
                  event.graphic.geometry = event.geometry;
                  tempGraphicsLayer.add(event.graphic);
    
                  editGraphic = null;
                }
    
                function setActiveButton(selectedButton) {
    
                    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");
                    }
                }
    
                function resetSketchView() {
                    sketchViewModel.reset();
                    tempGraphicsLayer.removeAll();
    
                    // remove existing highlighted features
                    if (highlight) {
                        highlight.remove();
                    }
                }
            }
    
            function selectFeatures(geometry) {
    
                view.graphics.removeAll();
                if (viewLayer) {
    
                    let query = {};
                    query.returnGeometry = true;
                    query.outFields = ["*"];
    
                    viewLayer.queryFeatures(query).then(function(results) {
    
                        const graphics = results.features;
    
                        if (graphics.length > 0) {
    
                            // remove existing highlighted features
                            if (highlight) {
                                highlight.remove();
                            }
    
                            highlight = viewLayer.highlight(graphics);
                        }
                    })
                    .catch(errback);
                }
            }
    
            function removeUnSelectedPoints(viewLayer, graphics)
            {
                graphics.forEach(item => {
                    highlightFields.push(item.attributes.FID);
                });
    
                setTimeout(function() {
                    viewLayer.layer.definitionExpression = "FID IN (" + highlightFields.join(",") + ")";
                }, 1000);
            }
    
            function resetHideShowPoints() {
    
                if(highlightFields.length > 0) {
                    highlightFields = [];
                    viewLayer.layer.definitionExpression = "";
                    console.log('reset', highlightFields);
                }
            }
    
            function errback(error) {
                console.error(error);
            }
    
            function setUpClickHandler(mapview) {
                mapview.on("click", function(event) {
    
                    event.stopPropagation();
                    streetView(view, event)
    
                    mapview.hitTest(event).then(function(response) {
                        var results = response.results;
                    });
                });
            }
    
            function streetView(mainMapView, event) {
    
                // Make sure that there is a valid latitude/longitude
                if (event && event.mapPoint) {
    
                    // Create lat/lon vars to display in popup title
                    var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
                    var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;
    
                    mainMapView.popup.open({
                        // Set the popup's title to the coordinates of the location
                        title: "Map view coordinates: [" + lon + ", " + lat + "]",
                        location: event.mapPoint, // Set the location of the popup to the clicked location
                        content: innerMapPopUp(
                            mainMapView,
                            mainMapView.center,
                            mainMapView.scale
                        )
                    });
                } else {
                    mainMapView.popup.open({
                        // Set the popup's title to the coordinates of the location
                        title: "Invalid point location",
                        location: event.mapPoint, // Set the location of the popup to the clicked location
                        content: "Please click on a valid location."
                    });
                }
            }
    
            function innerMapPopUp(mainMapView, center, scale) {
                var popupDiv = document.createElement("div");
                popupDiv.classList.add("popUpMapView");
    
                var popupView = new MapView({
                    container: popupDiv,
                    map: new Map({
                        basemap: "topo"
                    }),
                    center: center,
                    zoom: 8,
                    ui: {
                        components: []
                    }
                });
                console.log(popupView);
                // Return a dom node
                return popupView.container;
            }
    
            function getFields() {
                var fields = [
                    {
                        name: "ObjectID",
                        alias: "ObjectID",
                        type: "oid"
                    }, {
                        name: "name",
                        alias: "name",
                        type: "string"
                    }, {
                        name: "address",
                        alias: "address",
                        type: "string"
                    }, {
                        name: "city",
                        alias: "city",
                        type: "string"
                    }, {
                        name: "state_code",
                        alias: "state_code",
                        type: "string"
                    }, {
                        name: "zip",
                        alias: "zip",
                        type: "string"
                    }, {
                        name: "county",
                        alias: "county",
                        type: "string"
                    }, {
                        name: "plant_type",
                        alias: "plant_type",
                        type: "string"
                    }, {
                        name: "nameplate_capacity",
                        alias: "nameplate_capacity",
                        type: "double"
                    }
                ];
                return fields;
            }
            function getTemplate() {
                // Set up popup template for the layer
                var pTemplate = {
                    title: "{name}",
                    content: [{
                        type: "fields",
                        fieldInfos: [
                            {
                                fieldName: "street_address",
                                label: "Address",
                                visible: true
                            }, 
                            {
                                fieldName: "city",
                                label: "City",
                                visible: true
                            }, 
                            {
                                fieldName: "state_code",
                                label: "State Code",
                                visible: true
                            }, 
                            {
                                fieldName: "zip",
                                label: "Zip",
                                visible: true
                            },
                            {
                                fieldName: "county",
                                label: "County",
                                visible: true
                            },
                            {
                                fieldName: "plant_type",
                                label: "Plant Type",
                                visible: true
                            },
                            {
                                fieldName: "latitude",
                                label: "Latitude",
                                visible: true
                            },
                            {
                                fieldName: "longitude",
                                label: "Longitude",
                                visible: true
                            },
                            {
                                fieldName: "nameplate_capacity",
                                label: "Capacity (MW)",
                                visible: true
                            }
                        ]
                    }]
                };
                return pTemplate;
            }
    
            function getRender() {
    
                var renderer = {
                    type: "unique-value", // autocasts as new SimpleRenderer()
                    // Define a default marker symbol with a small outline
                    symbol: {
                      type: "simple-marker", // autocasts as new SimpleMarkerSymbol()
                      color: "#FFD733"
                    },
                    defaultLabel: "Other",
                    field: "plant_type",
                    label: "Plant Type",
    
                    uniqueValueInfos: [
                        {
                            value: "HYDRO",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(345,80%, 65%, 1)"
                            },
                            label: "Hydro"
                        },
                        {
                            value: "NATURAL_GAS",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(213,80%, 65%, 1)"
                            },
                            label: "Natural Gas"
                        },
                        {
                            value: "BIOMASS",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(195,80%, 65%, 1)"
                            },
                            label: "Biomass"
                        },
                        {
                            value: "COAL",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(336,80%, 65%, 1)"
                            },
                            label: "Coal"
                        },
                        {
                            value: "NUCLEAR",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(224,80%, 65%, 1)"
                            },
                            label: "Nuclear"
                        },
                        {
                            value: "PETROLIUM",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(264,80%, 65%, 1)"
                            },
                            label: "Petrolium"
                        },
                        {
                            value: "SOLAR",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(287,80%, 65%, 1)"
                            },
                            label: "Solar"
                        },
                        {
                            value: "WIND",
                            symbol: {
                                type: "simple-marker",
                                color: "hsla(344,80%, 65%, 1)"
                            },
                            label: "Wind"
                        }
                    ],
                    visualVariables: [
                        {
                            type: "size",
                            field: "nameplate_capacity",
                            valueUnit: "unknown",
                            legendOptions: {
                                  title: "Nameplate Capacity (MW)"
                            },
                            stops: [
                            {
                              value: 500,
                              size: 10,
                              label: "<500"
                            },
                            {
                              value: 2000,
                              size: 15,
                              label: "1000"
                            },
                            {
                              value: 3000,
                              size: 20,
                              label: "4000"
                            },
                            {
                              value: 5000,
                              size: 35,
                              label: "< 10000"
                            }]
                        }
                    ]
                };
    
                return renderer;
            }
    
            // Set up a home button for resetting the viewpoint to the intial extent
            var homeBtn = new Home({
                view: view
            }, "homeDiv");
    
            // Instructions expand widget
            const drawIcons = document.getElementById("drawActions");
            instructionsExpand = new Expand({
              expandIconClass: "esri-icon-expand",
              expandTooltip: "Draw Actions",
              expanded: false,
              view: view,
              iconNumber: 4,
              content: drawIcons
            });
    
            view.ui.add(homeBtn, "top-left");
            view.ui.add(instructionsExpand, "top-left");
    
            // hide the instructions expand widget when the view becomes focused
            view.watch("focused", function(newValue, oldValue, property, object) {
              if (newValue) {
                instructionsExpand.expanded = false;
              }
            });
        });
    </script>
    

    下面是我得到的问题的屏幕截图。 enter image description here

    请告诉我我遗漏了什么。

    1 回复  |  直到 7 年前
        1
  •  1
  •   BigGerman    7 年前

    您似乎没有正确设置查询。你有:

    let query = {};
    query.returnGeometry = true;
    query.outFields = ["*"];
    viewLayer.queryFeatures(query)
    

    你需要使用 featureLayer's createQuery

    let query = layer.createQuery();
    query.returnGeometry = true;
    query.outFields = ["*"];
    viewLayer.queryFeatures(query)
    

    此外,WebGL渲染仅支持ArcGIS Online或ArcGIS服务器10.6.1上托管的图层,因此highlight和其他功能在不满足这些要求的图层上不起作用。

    推荐文章