从ArcGIS JavaScript API Map对象获取JSON WebMap

时间:2015-12-17 23:39:04

标签: javascript json arcgis arcgis-js-api arcgis-server

我试图从ArcGIS JavaScript API中的JavaScript Map对象获取WebMap对象(作为JSON)。有没有办法在API中执行此操作,而不使用ArcGIS.com?理想情况如下:

webMapAsJSON = map.toWebMap();
REST API中的

From the "Export Web Map Task" documentation,这条线表明它应该存在:

  

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

但是,我没有在Map对象或API的其他地方看到任何可以执行此操作的内容。

3 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:1)

如果您的目标是使用打印服务打印地图,那么@Suttikeat Witchayakul上面的答案应该有效。

但是,如果您尝试将地图导出到web map JSON spec以便将其保存到ArcGIS Online / Portal或re-instantiate a map object from it later,则可能会遇到一些问题。这是因为Web地图规范与 export Web地图规范不同,后者是打印任务生成并发送到打印服务的。

不幸的是,ArcGIS API for JavaScript没有提供将地图对象导出到Web地图JSON的任何方法。这应该是在版本4中出现......在某些时候。在此之前,您可以使用全部但已废弃的cereal库。但是,如果您的地图使用了谷物不完全支持的图层类型,它可能不适合您,您必须扩展它。

答案 2 :(得分:1)

你不能。至少不正式。不建议采用以下步骤。他们使用不属于公共API的ArcGIS JS库的一部分,因此这种行为可能无法在下一版本的API中使用,或者他们可能会修补以前版本的API,这甚至可能会停止工作之前确实有效。

那就是说,有时你需要一些" future"现在的功能,这实际上是一种非常简单的方法,可以使用常见的proxy pattern

获得您想要的内容

使用未记录的"私人" function _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":[]}}
]}

如果您不需要在网络地图json上进行任何操作,只需要输出,那么您甚至不需要使用代理模式。