安卓智能地图开发与实施二十二:展示三维场景 - ArcGIS Runtime SDK for Android(Version 100.1.0)
2017-11-28 15:07
656 查看
展示三维场景(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)索要。
相关文章推荐
- 安卓智能地图开发与实施二十三:三维场景中的可视化 - ArcGIS Runtime SDK for Android(Version 100.1.0)
- 安卓智能地图开发与实施二十:栅格图层展示 - ArcGIS Runtime SDK for Android(Version 100.1.0)
- 安卓智能地图开发与实施十三:空间查询与展示 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施十八:空间要素绘制 - ArcGIS Runtime SDK for Android(Version 100.1.0)
- 安卓智能地图开发与实施十七:使用天地图 - ArcGIS Runtime SDK for Android(Version 100.1.0)
- 安卓智能地图开发与实施二十四:关于源代码的放送 - ArcGIS Runtime SDK for Android(Version 100.1.0)
- 安卓智能地图开发与实施十六:三维地图 - ArcGIS Runtime SDK for Android(Version 100.1.0)
- 安卓智能地图开发与实施九:地图缩放与旋转 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施十:图层管理 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施一:配置离线SDK - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施五:在线基础底图 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施四:二维地图的MapView与Layers - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施六:离线基础底图 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施十一:业务数据查询 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施七:在线业务图层(浏览查询) - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施十五:离线与同步 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施二:开发环境准备 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施三:创建第一个地图程序 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施十四:业务数据编辑 - ArcGIS Runtime SDK for Android(Version 100.0.0)
- 安卓智能地图开发与实施二十五:Shapefile文件的可视化与编辑 - ArcGIS Runtime SDK for Android(Version 100.2.0)