从ArcGIS JavaScript API地图对象获取JSON WebMap

3

我正在尝试从ArcGIS JavaScript API中的JavaScript Map对象获取WebMap对象(以JSON格式)。是否有在API内部完成此操作的方法,而不使用ArcGIS.com?理想情况下,像下面这样:

webMapAsJSON = map.toWebMap();

从"导出Web地图任务"文档中可以看到,REST API中有这样一行提示应该存在:

"ArcGIS Web API(JavaScript、Flex、Silverlight等)允许开发人员轻松地从地图中获取此JSON字符串。"

然而,在地图对象或API的其他位置中,我没有看到任何可以实现这个功能的内容。


已在GIS.SE上发布:http://gis.stackexchange.com/questions/174356/get-json-webmap-from-arcgis-javascript-api-map-object - Erica
3个回答

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函数,创建PrintParameters,然后运行:

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":[]}}
]}

如果您不需要对Web地图JSON执行任何操作,只需要输出结果,则甚至不需要使用代理模式。

2

@Suttikeat Witchayakul的上面回答应该可以满足您使用打印服务打印地图的需求。

然而,如果您尝试将地图导出到web map JSON spec中,以便保存到ArcGIS Online/Portal,或者以后重新实例化一个地图对象,则可能会遇到一些问题。这是因为Web Map规范与导出Web Map规范不同,即打印任务生成并发送给打印服务的规范。

不幸的是,ArcGIS API for JavaScript没有提供任何将地图对象导出到Web map JSON的方法。这应该在版本4中出现...在某个时候。在此之前,您可以使用已经被放弃的cereal库。但是,如果您的地图使用的层类型不完全受cereal支持,则可能无法正常工作,您需要扩展它。


1
如果您想使用“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);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接