解析Esri WebScene

34 篇文章 3 订阅
27 篇文章 0 订阅

前言

WebScene是符号化的3D地理空间内容,可以用于在直观的交互式3D环境中显示并分析地理信息。相对于传统的Geodatabase或者其他栅格,模型数据而言,更加利于分享和多平台显示。

示例如下:(新版CSDN好像嵌入不了网页了,大家可以自己嵌入在前端展示,或者浏览代码中的链接。)

https://arcg.is/0bbK45

<iframe width="500" height="400" frameborder="0" scrolling="no" allowfullscreen src="<https://arcg.is/0bbK45>"></iframe>

那么它究竟包括哪些内容呢?

img

从界面来看,大体上包括,Layer,Basemap,Ground,Slides(Presentation)

其实如果想知道更具体的内容,需要看WebScene的spec了。

WebScene spec

链接:https://developers.arcgis.com/web-scene-specification/

里面主要列举了WebScene可以包含的图层格式,底图的定义方法等,如果需要解析WebScene的JSON的话,有一定的参考意义。

operationalLayers

Basemap

关于Basemap的JSON例子:

{
  "baseMap": {
    "baseMapLayers": [
      {
        "id": "World_Imagery_5014",
        "title": "World Imagery",
        "layerType": "ArcGISTiledMapServiceLayer",
        "opacity": 1,
        "visibility": true,
        "url": "http://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
      },
      {
        "id": "World_Boundaries_and_Places_9730",
        "title": "World Boundaries and Places",
        "layerType": "ArcGISTiledMapServiceLayer",
        "isReference": true,
        "visibility": true,
        "url": "http://services.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer"
      }
    ],
    "title": "Imagery with Labels"
  }
}

使用ground.layers来表示elevationLayers

Presentation

就是幻灯片和幻灯片的表现了。

举个例子:

{
  "presentation": {
    "slides": [
      {
        "id": "slide_1",
        "title": {
          "text": "Slide 1"
        },
        "thumbnail": {
          "url": "data:image/jpeg;base64,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"
        },
        "description": {
          "text": "Slide description"
        },
        "baseMap": {
          "id": "basemap_3",
          "title": "Light Gray Canvas",
          "baseMapLayers": [
            {
              "url": "http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer",
              "layerType": "ArcGISTiledMapServiceLayer",
              "isReference": false,
              "title": "World Light Gray Canvas Base",
              "id": "World_Light_Gray_Base_1486"
            },
            {
              "url": "http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer",
              "layerType": "ArcGISTiledMapServiceLayer",
              "isReference": true,
              "title": "World Light Gray Reference",
              "id": "World_Light_Gray_Reference_1486"
            }
          ]
        },
        "viewpoint": {
          "scale": 294288.68889219884,
          "targetGeometry": {
            "xmin": -6699655.673599025,
            "ymin": 2095589.1288518738,
            "xmax": -6233038.83376736,
            "ymax": 2562322.7919495814,
            "spatialReference": {
              "wkid": 102100
            }
          },
          "camera": {
            "position": {
              "x": -6409183.940944876,
              "y": 1696072.3376810949,
              "z": 140179.151083461,
              "spatialReference": {
                "wkid": 102100
              }
            },
            "heading": -11.142703441074717,
            "tilt": 74.27611784201275
          }
        },
        "visibleLayers": [
          {
            "id": "layerSphere"
          }
        ],
        "environment": {
          "lighting": {
            "datetime": 1426420800000,
            "directShadows": true
          }
        }
      }
    ]
  }
}

ArcGIS API for Python中的WebScene

我在这篇文章中介绍了ArcGIS API for Python: 我的Python学习笔记(5): ArcGIS API for Python。以下为截图:

img

在ArcGIS API for Python中,Online和Portal中大部分的对象都属于Item,所以使用通用的content.get(itemId)的方式就可以获取到这个WebScene的对象,然后就可以查询其中的属性和调用API提供的各种方法。
Item本身从dict继承,是从POST请求返回的JSON格式WebScene而构建的:

self.con.post('content/items/' + itemid, self._postdata())

所以可以直接使用字典的方式查询id,extent等各种属性。
下面来进行简单的代码分析:
安装了包之后,可以从这个目录找到代码,我使用的是anaconda,env的名字是py35,所以路径如下,大家可以自行更改查找,或者使用pycharm和F12功能(设置为VS快捷键模式)
C:\Anaconda3\envs\py35\Lib\site-packages\arcgis-1.3.0-py3.5.egg\arcgis\gis\_init__.py

def get(self, itemid):
    """ Returns the item object for the specified itemid.


    =======================    =============================================================
    **Argument**               **Description**
    -----------------------    -------------------------------------------------------------
    itemid                     Required string. The item identifier.
    =======================    =============================================================

    :return:
        The item object if the item is found, None if the item is not found.
    """
    try:
        item = self._portal.get_item(itemid)
    except RuntimeError as re:
        if re.args[0].__contains__("Item does not exist or is inaccessible"):
            return None
        else:
            raise re

    if item is not None:
        return Item(self._gis, itemid, item)
    return None

大致画一个相关类图:
img

ArcGIS API for JavaScript中的Webscene

具体可以参考:https://developers.arcgis.com/javascript/latest/api-reference/esri-WebScene.html
由于WebScene很多内容都来自于Zurich R&D Center,所以JS API里面对WebScene的描述应该是最全面的了。

使用起来也很简单:

var scene = new WebScene({
  // autocasts as esri/portal/PortalItem
  portalItem: {
    id: "affa021c51944b5694132b2d61fe1057"  // ID of the WebScene on arcgis.com
  }
});

var view = new SceneView({
  map: scene,  // The WebScene instance created above
  container: "viewDiv"
});

scene.when(function() {
  // All layers and the basemap have been created
});
view.when(function() {
  // All layer and basemap resources have been loaded and are ready to be displayed
});

更多细节大家还是慢慢啃官方API-Reference吧。

照例还是画一个简图,就是做参考用,不要在意细节。
img

WebScene的RESTful服务endpoint

WebScene

POST如下URL来获取json:

https://www.arcgis.com/sharing/rest/content/items/91b46c2b162c48dba264b2190e1dbcff/data?f=json

可以看到数据主要分为,operationalLayers, baseMap, ground三类,展示效果有presentation,里面会引用上面各种图层的id。

SceneService

说到这里,就顺便说下SceneService的内容吧,毕竟是WebScene中最炫的数据格式。

首先,还是要看i3s-spec
https://github.com/Esri/i3s-spec

以这个WebScene为例(新版CSDN好像嵌入不了网页了,大家可以自己嵌入在前端展示,或者浏览代码中的链接。)

sf_small

<iframe width="500" height="400" frameborder="0" scrolling="no" allowfullscreen src="<http://www.arcgis.com/home/webscene/viewer.html?webscene=40b3391c9cad4beca75155e79d42366d&viewpoint=cam:-122.38172925,37.78671683,344.267;286.649,63.16&ui=min>"></iframe>

它的sceneLayerURL是
https://tiles.arcgis.com/tiles/lVkj5PBOw7tRmIPU/arcgis/rest/services/sf_small/SceneServer

从layers属性可以看出,这个service中只包含一个图层,id为0,然后我们就可以在后面加上layers/0来访问该图层。

https://tiles.arcgis.com/tiles/lVkj5PBOw7tRmIPU/arcgis/rest/services/sf_small/SceneServer/layers/0
中我们大致可以知道数据的范围,高程参数,纹理,属性等信息,也可以从rootNode字段找到根节点是root。
然后就可以使用
https://tiles.arcgis.com/tiles/lVkj5PBOw7tRmIPU/arcgis/rest/services/sf_small/SceneServer/layers/0/nodes/root
来看service中根节点的信息了。
然后可以遍历各个字段,找找这个节点是否有feature,geometry,texture等信息。
如果需要找feature信息,就可以在后面加features/0,
geometry的二进制信息,在后面加geometries/0,
纹理信息:
https://tiles.arcgis.com/tiles/lVkj5PBOw7tRmIPU/arcgis/rest/services/sf_small/SceneServer/layers/0/nodes/1/textures/0_0

中间细节很多,如果感兴趣的话,可以在博客下面留言,我会看大家的反馈,对各个部分进行更新。

总结

本博客,从数据标准,Python,Javascript API中使用,RESTful服务endpoint等方面介绍了WebScene,时间关系,不能做一个详尽的讲解。

与本博客相关博客:

相关网站:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值