我试图从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的其他地方看到任何可以执行此操作的内容。
答案 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)
但是,如果您尝试将地图导出到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上进行任何操作,只需要输出,那么您甚至不需要使用代理模式。