Получить JSON WebMap из объекта карты ArcGIS JavaScript API Map

Я пытаюсь получить объект WebMap (как JSON) из объекта JavaScript Map в ArcGIS JavaScript API. Есть ли способ сделать это в API без использования ArcGIS.com? В идеале что-то вроде:

webMapAsJSON = map.toWebMap();

Из документации «Экспорт веб-карты». в REST API есть такая строка, которая предполагает, что он должен существовать:

«Веб-API ArcGIS (для JavaScript, Flex, Silverlight и т. Д.) Позволяют разработчикам легко получать эту строку JSON с карты».

Однако я не вижу ничего в объекте Map или где-либо еще в API, что могло бы сделать это.


person pdpc    schedule 17.12.2015    source источник
comment
Перекрестно размещено в GIS.SE: gis.stackexchange.com/questions/174356/   -  person Erica    schedule 18.12.2015


Ответы (3)


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

Тем не менее, иногда вам нужны некоторые «будущие» функции прямо сейчас, и на самом деле это довольно простой способ получить то, что вы хотите, используя обычный шаблон прокси

Используйте недокументированную "частную" функцию _getPrintDefinition

var proxy_getPrintDefinition = printTask._getPrintDefinition;

printTask._getPrintDefinition = function() {
    var getPrintDefResult = proxy_getPrintDefinition.apply(this, arguments);
    //Now you can do what you want with getPrintDefResults
    //which should contain the Web_Map_as_JSON

    console.log(Json.stringify(getPrintDefResult));

    //make sure you return the result or you'll break this print task.
    return getPrintDefResult;
    }

_getPrintDefinition принимает карту в качестве первого аргумента, а объект PrintParameters - в качестве второго.

поэтому вам нужно будет создать PrintTask, переопределить функцию _getPrintDefinition на вновь созданную задачу печати, как описано выше, создайте Параметры печати и затем запустите :

myPrintTask._getPrintDefinition (myMap, myPrintParameters);

Результаты моего небольшого теста:

{"mapOptions":{"showAttribution":false,"extent":{"xmin":-7967955.990468411,"ymin":5162705.099750506,"xmax":-7931266.216891576,"ymax":5184470.54355468,
"spatialReference":{"wkid":102100,"latestWkid":3857}},"spatialReference":{"wkid":102100,"latestWkid":3857}},
"operationalLayers":[
    {"id":"layer0","title":"layer0","opacity":1,"minScale":591657527.591555,"maxScale":70.5310735,"url":"http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"},
    {"id":"XXX-Redacted-XXX","title":"serviceTitle","opacity":1,"minScale":0,"maxScale":0,"token":"XXX-Redacted-XXX","url":"http://XXX-Redacted-XXX/arcgis/rest/services/TestService/MapServer"},
    {"id":"XXX-Redacted-XXX","opacity":1,"minScale":0,"maxScale":0,"featureCollection":{"layers":[]}},
    {"id":"featureGraphics","opacity":1,"minScale":0,"maxScale":0,"featureCollection":{"layers":[]}},
    {"id":"map_graphics","opacity":1,"minScale":0,"maxScale":0,"featureCollection":{"layers":[]}}
]}

Если вам не нужно выполнять какие-либо операции с веб-картой json и вам просто нужен вывод, вам даже не нужно использовать шаблон прокси.

person Ryan    schedule 24.12.2015

Ответ @Suttikeat Witchayakul выше должен работать, если ваша цель - распечатать карту с помощью службы печати.

Однако, если вы пытаетесь экспортировать карту в спецификацию JSON веб-карты, чтобы вы могли сохранить его в ArcGIS Online / Portal, или повторно создать экземпляр сопоставить объект позже, у вас могут возникнуть проблемы. Это связано с тем, что спецификация веб-карты не совпадает со спецификацией export веб-карты, которую задача печати генерирует и отправляет в службы печати.

К сожалению, ArcGIS API for JavaScript не предоставляет никаких методов для экспорта объекта карты в JSON веб-карты. Предполагается, что это появится в версии 4 ... в какой-то момент. А пока вы можете использовать почти заброшенную библиотеку зерновых. Однако, если ваша карта использует типы слоев, которые не полностью поддерживаются зерновыми, она может не работать для вас как есть, и вам придется ее расширить.

person Tom Wayson    schedule 21.12.2015

Если вы хотите использовать esri / tasks / PrintTask для экспорта карты, вы должны использовать esri / tasks / PrintParameters для выполнения printTask. Просто установите для объекта карты значение printParameter.

require([
  "esri/map", "esri/tasks/PrintTemplate", "esri/tasks/PrintParameters", ... 
], function(Map, PrintTemplate, PrintParameters, ... ) {
  var map = new Map( ... );

  var template = new PrintTemplate();
  template.exportOptions = {
    width: 500,
    height: 400,
    dpi: 96
  };
  template.format = "PDF";
  template.layout = "MAP_ONLY";
  template.preserveScale = false;

  var params = new PrintParameters();
  params.map = map;
  params.template = template;
  printTask.execute(params, printResult);
});
person Suttikeat Witchayakul    schedule 18.12.2015