安卓智能地图开发与实施二十二:展示三维场景 - ArcGIS Runtime SDK for Android(Version 100.1.0)

0
分享 2018-04-04

展示三维场景(ArcGISScene)

三维通过接近真实世界的角度来可视化数据信息
三维场景的使用类似于MapView和ArcGISMap,二维数据皆可加入三维场景
三维场景不同于二维,其具备高程表面(elevation surface)

无高程表面(elevation surface)



有高程表面(elevation surface)



MainSceneView = (SceneView) findViewById(R.id.sceneView);
MainSceneView.setAttributionTextVisible(false);
MainArcGISScene = new ArcGISScene();
MainArcGISScene.setBasemap(Basemap.createOpenStreetMap());
MainSceneView.setScene(MainArcGISScene);
MainArcGISSceneLayer = new ArcGISSceneLayer(getResources().getString(R.string.brest_buildings));
MainArcGISScene.getOperationalLayers().add(MainArcGISSceneLayer);

服务地址,brest_buildings:
http://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer



使用高程表面(ArcGISTiledElevationSource、RasterElevationSource)

ArcGISTiledElevationSource:将在线服务作为高程表面
RasterElevationSource:将本地DEM文件作为高程表面
ArcGISTiledElevationSource elevationSource = new ArcGISTiledElevationSource(
getResources().getString(R.string.world_elevation));
MainArcGISScene.getBaseSurface().getElevationSources().add(elevationSource);

服务地址,world_elevation:
http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer



设置三维场景视角镜头(camera)

  • 3D location:三维定位 纬度(Latitude)、经度(longitude)和高程(elevation)。
  • Heading:镜头水平朝向 0度表示指北,从0度逐渐增加,镜头顺时针旋转,360度回到0度指北。
  • Pitch:镜头垂直朝向 0度表示垂直俯视地球,从0度逐渐增加,镜头沿其水平朝向,从俯视地球朝天空旋转,360度回到0度俯视地球。

Camera camera = new Camera(53.06, -4.04, 200000, 0, 0, 0);
MainSceneView.setViewpointCamera(camera);


三维场景中的空间要素

  • 展示临时数据,通过空间要素代表真实世界中快速移动的物体
  • 展示不带共同的几何类型,不带任何属性信息的数据
  • 展示几何图形,若包含高程值(Z-values)可在三维场景表面上方展示

跟二维相同,通过GraphicsOverlay实现点、线、面和3D标记符号在三维场景中的添加。

表面置放模式(LayerSceneProperties.SurfacePlacement)

与二维不同的是,通过GraphicsOverlay添加空间要素时,需要设置表面置放模式,默认为DRAPED。
  • DRAPED:空间要素紧贴场景表面(surface layer),不考虑空间要素的高程值(Z-values)
  • ABSOLUTE:空间要素通过其高程值(Z-values)设置距离球体表面(海平面)的高度
  • RELATIVE:空间要素通过其高程值(Z-values)设置距离场景表面(surface layer)的高度

球体表面和场景表面的差异在于是否使用高程表面,若不使用高程表面ABSOLUTE和RELATIVE在三维场景中展示的位置相同。

// create overlays with elevation modes
GraphicsOverlay drapedOverlay = new GraphicsOverlay();
drapedOverlay.getSceneProperties().setSurfacePlacement(LayerSceneProperties.SurfacePlacement.DRAPED);
MainSceneView.getGraphicsOverlays().add(drapedOverlay);
GraphicsOverlay relativeOverlay = new GraphicsOverlay();
relativeOverlay.getSceneProperties().setSurfacePlacement(LayerSceneProperties.SurfacePlacement.RELATIVE);
MainSceneView.getGraphicsOverlays().add(relativeOverlay);
GraphicsOverlay absoluteOverlay = new GraphicsOverlay();
absoluteOverlay.getSceneProperties().setSurfacePlacement(LayerSceneProperties.SurfacePlacement.ABSOLUTE);
MainSceneView.getGraphicsOverlays().add(absoluteOverlay);
// create a text symbol for each elevation mode
TextSymbol drapedText = new TextSymbol(10, "DRAPED", 0xFF000000, TextSymbol.HorizontalAlignment.LEFT,TextSymbol.VerticalAlignment.MIDDLE);
drapedText.setOffsetX(5f);
TextSymbol relativeText = new TextSymbol(10, "RELATIVE", 0xFF000000, TextSymbol.HorizontalAlignment.LEFT,TextSymbol.VerticalAlignment.MIDDLE);
relativeText.setOffsetX(5f);
TextSymbol absoluteText = new TextSymbol(10, "ABSOLUTE", 0xFF000000, TextSymbol.HorizontalAlignment.LEFT,TextSymbol.VerticalAlignment.MIDDLE);
absoluteText.setOffsetX(5f);
// create point for graphic location
Point point = new Point(-4.04, 53.06, 1000, MainSceneView.getSpatialReference());
SimpleMarkerSymbol redSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, 0xFFFF0000, 10);
SimpleMarkerSymbol greenSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, 0xFF00FF00, 10);
SimpleMarkerSymbol blueSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, 0xFF0000FF, 10);
// add the point graphic and text graphic to the corresponding graphics
// overlay
drapedOverlay.getGraphics().add(new Graphic(point, redSymbol));
drapedOverlay.getGraphics().add(new Graphic(point, drapedText));
relativeOverlay.getGraphics().add(new Graphic(point, greenSymbol));
relativeOverlay.getGraphics().add(new Graphic(point, relativeText));
absoluteOverlay.getGraphics().add(new Graphic(point, blueSymbol));
absoluteOverlay.getGraphics().add(new Graphic(point, absoluteText));


结尾

源程序请自行下载:
链接:https://pan.baidu.com/s/1kUFNdPl 密码:0if3
若失效,可发邮件给韩源萌(polyline@126.com)索要。

文章来源:http://blog.csdn.net/allenlu2008/article/details/78655298

0 个评论

要回复文章请先登录注册