ESRI JS API — Буферный FeatureLayer

У меня есть векторный слой, который я хотел бы буферизовать, используя пользовательский ввод и сервис геометрии.

FeatureLayer:

    var texasPipeline = new FeatureLayer(pipeURL, {
        mode: FeatureLayer.MODE_ONDEMAND,
        outFields: ["*"],
        definitionExpression:texasPipeQuery
    });

Параметры буфера:

        var params = new BufferParameters();
        params.distances = [distance];
        params.unit = units;
        params.outSpatialReference = map.spatialReference;
        params.geometries = texasPipeline;
        map.graphics.clear();
        geomSvc.buffer(params, showBuffer);

Сервер возвращает ошибку о том, что необходимо предоставить геометрию. Я предполагаю, что мне нужно передать геометрию FeatureLayer, а не сам FeatureLayer. Как получить геометрию FeatureLayer и правильно передать ее в BufferParameters??

РЕДАКТИРОВАТЬ: Кроме того, я попытался выполнить цикл, как вы можете видеть в приведенном ниже коде. передача массива геометрий в BufferParameters по-прежнему не завершается успешно.

        var texasPipelineGeom = [];
        var graphics = texasPipeline.graphics;
        for (var G in graphics) {
            var g = graphics[G]["geometry"];
            console.log(g);
            texasPipelineGeom.push(g);
        }

person LCaraway    schedule 20.07.2016    source источник


Ответы (2)


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

Вы можете использовать что-то вроде этого (не проверено, просто возьмите псевдокод):

params.geometries = texasPipeline.graphics.map(function (graphic) {
  return graphic.geometry;
});

При использовании полигонов служба геометрии иногда будет жаловаться на то, что полигоны не упрощены. Полный рабочий пример с полигонами можно найти здесь: https://developers.arcgis.com/javascript/3/jssamples/util_buffergraphic.html, вам просто нужно правильно получить геометрию из векторного слоя и добавить ее в params.geometries.

var buffer = function buffer (point, radius) {
  var promise = new Deferred();
  var gsvc = new GeometryService(CONFIG.GEOMETRY_SERVICE_URL);
  var params = new BufferParameters();
  params.geometries = [point];
  params.distances = [radius];
  params.unit = GeometryService.UNIT_KILOMETER;
  params.outSpatialReference = new SpatialReference(54010);

  gsvc.buffer(params, promise.resolve, console.error);

  return promise;
};
person Robert-W    schedule 20.07.2016
comment
Должен любить полезные сообщения об ошибках Esri :(. Я добавил пример, который работает для меня, постарайтесь сопоставить его как можно лучше, если вы все равно видите ошибку 400, возможно, есть проблема с геометрией в вашем векторный слой, попробуйте вместо этого отправить его с простой точкой или сначала упростить его с помощью метода упрощения геометрических сервисов.В этой функции я передаю точку ArcGIS и 50 в качестве радиуса. - person Robert-W; 20.07.2016

Какую версию js API вы используете? Начиная с версии 3.13 есть модуль esri/geometry/geometryEngine . С помощью этого модуля вы можете выполнять операции с геометрией на стороне клиента без службы геометрии. Вот хороший пример его использования.


Также взгляните на модуль esri/graphicsUtils, чтобы получить геометрия из графики.

person mchepurnoy    schedule 04.08.2016