我正在尝试从ArcGIS JavaScript API中的JavaScriptMap对象获取WebMap对象(作为JSON)。在API中有没有任何方法可以做到这一点,而不使用ArcGIS.com?理想情况下类似于:
webMapAsJSON = map.toWebMap();
从REST API中的"导出Web地图任务"文档中,有一行建议它应该存在:
"ArcGIS web API(用于JavaScript、Flex、Silverlight等)允许开发人员轻松地从地图中获取此JSON字符串。"
然而,我在Map对象中或API中的其他地方看不到任何可以做到这一点的东西。
你不能。至少不是正式的。不建议采用以下步骤。他们使用的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函数,创建一个PrinteParameters,然后运行:
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":[]}}
]}
如果您不需要对webmapjson进行任何操作,只需要输出,那么您甚至不需要使用代理模式。
@Suttiheat Witchayakul上面的答案应该有效。
但是,如果您试图将地图导出到web地图JSON规范,以便将其保存到ArcGIS Online/Portal,或者稍后从中重新实例化地图对象,则可能会遇到一些问题。这是因为web地图规范与导出web地图规范不同,打印任务生成并发送给打印服务。
遗憾的是,用于JavaScript的ArcGIS API没有提供任何将地图对象导出到web地图JSON的方法。这应该会在第4版中出现……在某个时候。在那之前,你可以使用几乎废弃的谷物库。然而,如果你的地图使用的图层类型没有得到grain的完全支持,它可能不适合你,你必须扩展它。
如果要使用"esri/tasks/PrintTask"导出地图,则必须使用"esri/tasks/PrinteParameters"执行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);
});