2017-10-18 17 views
2

사용자가 160-ish 레이어 사이를 전환 할 수있는 웹 애플리케이션이 있습니다. 대부분이 기능 레이어이지만 일부는 ArcGISDynamicMapServiceLayer 유형입니다.레이어 쿼리가 성공한 직후 인포메이션 윈도우를 보여줍니다.

필자는 FeatureLayers에서와 마찬가지로 레이어를 쿼리 할 수 ​​있어야합니다.지도의 아무 지점이나 클릭하여 정보 창을 표시 할 수 있어야합니다.

executeQueryTask: function(evt, scope) { 
    //"this" is the map object in this context, so we pass in the scope from the caller, 
    //which will enable us to call the layer and map object and all the other precious widget properties 
    scope.map.graphics.clear(); 
    scope.map.infoWindow.hide(); 
    //we create a new Circle and set its center at the mappoint. The radius will be 20 meters 
    //default unit is meters. 
    var circle = new Circle({ 
     /*...*/ 
    }); 
    // draw the circle to the map: 
    var circleGraphic = new Graphic(circle, /*...*/)); 

    scope.map.graphics.add(circleGraphic); 

    var queryTask = new QueryTask(scope.layer.layer.url + "/" + scope.layer.layer.visibleLayers[0]); 
    var query = new Query(); 
    query.returnGeometry = true; 
    query.outFields = ["*"]; 
    query.geometry = circle.getExtent(); 
    var infoTemplate = new InfoTemplate().setTitle(""); 
    queryTask.execute(query, function(resultSet) { 
     array.forEach(resultSet.features, function(feature) { 
      var graphic = feature; 
      graphic.setSymbol(/*...*/)); 
      //Set the infoTemplate. 
      // graphic.setInfoTemplate(infoTemplate); 
      //Add graphic to the map graphics layer. 
      scope.map.infoWindow.setContent(graphic.attributes); 
      scope.map.infoWindow.show(evt.mapPoint, scope.map.getInfoWindowAnchor(evt.screenPoint)); 
      scope.map.graphics.add(graphic); 
     }); 
    }); 
}, 

중요한 점은 queryTask.execute 콜백 insise입니다 :

이 (명확성을 위해 일부 비트를 제거) 지금까지 내 코드입니다. 주석 처리를 제거하고 graphic.setInfoTemplate(infoTemplate);을 사용하면 결과에 색상이 표시되고 두 번째 클릭시 정보창이 나타납니다. 이 방법이 문제가 있습니다

  1. 이 클릭이
  2. 내가 두 번 폴리 라인과 포인트를 클릭 드릴 수 없습니다 필요하다 그래서 정보창 여기에 팝업되지는.

반경이 100m 인 클릭을 얻으려면 원을 추가 한 것입니다. 이제 immediatly infoWindow를 반환하고 싶습니다. 이 시점에서 나는 즉시 표시되는 Info Window를 성공적으로 만들기 위해 고심하고있다.

현재 라인 scope.map.infoWindow.setContent(graphic.attributes);Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.

가 어떻게 정보 창 것을 만들 수있는 오류가 발생합니다?

답변

1

개선 할 여지가있는 적절한 접근 방식을 찾았습니다. 그러나 이것은 다른 반복을위한 것입니다. 우리는 더 이상 QueryTask를 사용하지만, 선택 모드에 새로운 FeatureLayer 객체를 생성, 가시 층의 URL과 ID를 사용하고 있는지

//create a new FeatureLayer object 
var featureLayer = new FeatureLayer(scope.layer.layer.url + "/" + scope.layer.layer.visibleLayers[0], { 
    mode: FeatureLayer.MODE_SELECTION, 
    infoTemplate: new InfoTemplate("Attributes", "${*}"), 
    outFields: ["*"] 
}); 
//we create a new Circle and set its center at the mappoint. The radius will be 20 meters 
//default unit is meters. 
var circle = new Circle({/*...*/}); 

// draw the circle to the map: 
var circleGraphic = new Graphic(circle, /*...*/)); 
scope.map.graphics.add(circleGraphic); 

var lQuery = new Query(); 
lQuery.returnGeometry = true; 
lQuery.geometry = circle.getExtent(); 
featureLayer.queryFeatures(lQuery, function(results) { 
    array.forEach(results.features, function(feature) { 
     var graphic = feature; 
     graphic.setSymbol(/*...*/)); 

     //now that we have the feature, we need to select it 
     var selectionQuery = new Query(); 
     selectionQuery.geometry = feature.geometry; 
     featureLayer.selectFeatures(selectionQuery, FeatureLayer.SELECTION_NEW) 
      .then(function(selectedFeatures) { 
       console.info("selection complete", selectedFeatures); 
       if (!selectedFeatures.length) { 
        return; 
       } 
       scope.map.infoWindow.setFeatures(selectedFeatures); 
       scope.map.infoWindow.show(evt.mapPoint, "upperright"); 
      }); 
    }); 
}); 

여기에 변화는 없다.

주목할만한 두 번째 변화는 더 이상 infoWindow의 내용을 설정하지 않고 대신 infoWindow.setFeatures(selectedFeatures)을 사용하여 선택된 기능을 설정한다는 것입니다. infoWindow의 내용을 설정하고 기능을 선택하지 않으면 정보창의 작업 목록이 숨겨 지므로 객체를 확대하거나 다른 사용자 정의 작업을 수행 할 수 없습니다. 또한이 옵션을 사용하면 infoWindow에서 여러 개의 결과를 볼 수 있습니다.

+0

그게 도움이됩니다. –