【问题标题】:Get JSON WebMap from ArcGIS JavaScript API Map object从 ArcGIS JavaScript API Map 对象获取 JSON WebMap
【发布时间】:2016-03-24 14:42:38
【问题描述】:

我正在尝试从 ArcGIS JavaScript API 中的 JavaScript 地图对象获取 WebMap 对象(作为 JSON)。有没有办法在 API 中做到这一点,而不使用 ArcGIS.com?理想情况下是这样的:

webMapAsJSON = map.toWebMap();

From the "Export Web Map Task" documentation 在 REST API 中,有这行表明它应该存在:

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

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

【问题讨论】:

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


【解决方案1】:

你不能。至少不是正式的。不推荐以下概述的步骤。他们使用不属于公共 API 的 ArcGIS JS 库的一部分,因此此行为可能无法在 API 的下一版本中起作用,或者他们可能会对 API 的先前版本进行回补,即使在某些东西上也可能停止工作以前确实有效。

也就是说,有时您现在需要一些“未来”功能,这实际上是使用常见的proxy pattern 获得所需功能的一种非常简单的方法

使用未记录的“私有”函数_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 或 re-instantiate a map object from it later,则可能会遇到一些问题。这是因为 web 地图规范与 export web 地图规范不同,后者是打印任务生成并发送给打印服务的。

    很遗憾,ArcGIS API for JavaScript 不提供任何将地图对象导出为 Web 地图 JSON 的方法。这应该会在版本 4 中出现......在某个时候。在那之前,您可以使用几乎废弃的cereal 库。但是,如果您的地图使用谷物不完全支持的图层类型,则它可能无法按原样工作,您必须对其进行扩展。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-20
        相关资源
        最近更新 更多