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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/allenlu2008/article/details/78667060

三维场景中的可视化

这里写图片描述

三维场景(SceneView 、ArcGISScene)中具备更多的符号化方式来传递信息,包括SimpleMarkerSceneSymbol、ModelMarkerSymbol、DistanceCompositeSceneSymbol以及空间要素拉伸。

这里写图片描述

SimpleMarkerSceneSymbol

可绘制样式:

  • 立方体( Cube )
  • 圆锥体( Cone )
  • 圆柱体( Cylinder )
  • 菱形体( Diamond )
  • 球体( Sphere )
  • 四面体( Tetrahedron )

宽高深设置: Width、 Height、 Depth
符号位置:anchorPosition
SceneSymbol.AnchorPosition:

  • BOTTOM:几何模型在定位位置的上方
  • CENTER :几何模型在定位位置的中心
  • TOP :几何模型在定位位置的下方

这里写图片描述

SimpleMarkerSceneSymbol tetrahedron = new SimpleMarkerSceneSymbol(SimpleMarkerSceneSymbol.Style.TETRAHEDRON, 0xFFFF0000, 3000,
        3000, 3000, SceneSymbol.AnchorPosition.BOTTOM);
Point spherePoint = new Point(-4.04, 53.06, 5000);
Graphic sphereGraphic = new Graphic(spherePoint, tetrahedron);
MainGraphicsOverlay.getGraphics().add(sphereGraphic);

ModelMarkerSymbol

将三维模型(文件)直接作为符号加载
支持的格式: http://assimp.sourceforge.net/main_features_formats.html
uri:模型地址(在线或终端文件)
scale:缩放因子

这里写图片描述

ModelSceneSymbol modelSceneSymbol = new ModelSceneSymbol(
        getResources().getString(R.string.models_bristol),800);
modelSceneSymbol.loadAsync();
Point modelPoint = new Point(-4.04, 53.16, 5000);
Graphic modelGraphic = new Graphic(modelPoint, modelSceneSymbol);
MainGraphicsOverlay.getGraphics().add(modelGraphic);

DistanceCompositeSceneSymbol

根据三维场景视角镜头(camera)到空间要素的距离不同使用不同的符号(Symbol)进行可视化。

这里写图片描述

SimpleMarkerSymbol circleSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, 0xFFFF0000, 10);
DistanceCompositeSceneSymbol compositeSymbol = new DistanceCompositeSceneSymbol();
compositeSymbol.getRangeCollection().add(new DistanceCompositeSceneSymbol.Range(modelSceneSymbol, 0, 100000));
compositeSymbol.getRangeCollection().add(new DistanceCompositeSceneSymbol.Range(tetrahedron, 100000, 200000));
compositeSymbol.getRangeCollection().add(new DistanceCompositeSceneSymbol.Range(circleSymbol, 200000, 0));
Point distancePoint = new Point(-4.04, 53.16, 5000);
Graphic distanceGraphic = new Graphic(distancePoint, compositeSymbol);
MainGraphicsOverlay.getGraphics().add(distanceGraphic);

通过属性拉伸空间要素

二维图层(如FeatureLayer)添加入三维场景只能贴在场景表面,通过GraphicsOverlay添加的内容可以进行拉伸处理。

这里写图片描述

MainChinaGraphicsOverlay = new GraphicsOverlay();
MainChinaGraphicsOverlay.getSceneProperties().setSurfacePlacement(LayerSceneProperties.SurfacePlacement.RELATIVE);
MainSceneView.getGraphicsOverlays().add(MainChinaGraphicsOverlay);
SimpleFillSymbol sfs = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID,0xff00ff00,null);
SimpleRenderer renderer = new SimpleRenderer(sfs);
Renderer.SceneProperties renderProperties = renderer.getSceneProperties();
renderProperties.setExtrusionMode(Renderer.SceneProperties.ExtrusionMode.BASE_HEIGHT);
renderProperties.setExtrusionExpression("[Pop_2009] * 200");
MainChinaGraphicsOverlay.setRenderer(renderer);
final OpenLayerClass openLayerClass = new OpenLayerClass();
openLayerClass.OpenLayer(
        getResources().getString(R.string.china_polygon),
        LayerType.FILE_GEODATABASE,
        new ILayerResult() {
            @Override
            public void getLayer(ArrayList<Layer> arrayList) {
                ChinaFeatureLayer =(FeatureLayer) arrayList.get(0);
                ChinaFeatureLayer.addDoneLoadingListener(new Runnable() {
                    @Override
                    public void run() {
                        List<Field> fields = ChinaFeatureLayer.getFeatureTable().getFields();
                        for (Field field:fields
                             ) {
                            String name = field.getName();
                            String alias = field.getAlias();
                        }
                        final MapQueryClass mapQueryClass = new MapQueryClass();
                        mapQueryClass.Query(ChinaFeatureLayer, "OBJECTID > -1",
                                new IQueryResult() {
                                    @Override
                                    public void getQuery() {
                                        MapQueryClass.MapQueryResult MainMapQueryResult=
                                        mapQueryClass.getMapQueryResult().get(0);
                                        for (Feature feature:MainMapQueryResult.features
                                             ) {
                                            MainChinaGraphicsOverlay.getGraphics().add(
                                                    new Graphic(feature.getGeometry(),feature.getAttributes())
                                            );
                                        }
                                        MainSceneView.setViewpoint(
                                                new Viewpoint(ChinaFeatureLayer.getFullExtent())
                                        );
                                    }
                                });
                    }
                });
                ChinaFeatureLayer.loadAsync();

            }
        }
);

用三维来可视化特征属性

1、获取空间要素图层(FeatureLayer)
2、查询获取空间要素集
3、取得特征属性并结合SimpleMarkerSceneSymbol展示
这里写图片描述

MainChinaGraphicsOverlay = new GraphicsOverlay();
MainChinaGraphicsOverlay.getSceneProperties().setSurfacePlacement(LayerSceneProperties.SurfacePlacement.RELATIVE);
MainSceneView.getGraphicsOverlays().add(MainChinaGraphicsOverlay);
MainLabelGraphicsOverlay = new GraphicsOverlay();
MainLabelGraphicsOverlay.getSceneProperties().setSurfacePlacement(LayerSceneProperties.SurfacePlacement.RELATIVE);
MainSceneView.getGraphicsOverlays().add(MainLabelGraphicsOverlay);
MainLabelGraphicsOverlay.setMinScale(30000000d);
//renderProperties.setExtrusionExpression("[Pop_2009] * 200");
final OpenLayerClass openLayerClass = new OpenLayerClass();
openLayerClass.OpenLayer(
        getResources().getString(R.string.china_polygon),
        LayerType.FILE_GEODATABASE,
        new ILayerResult() {
            @Override
            public void getLayer(ArrayList<Layer> arrayList) {
                ChinaFeatureLayer = (FeatureLayer) arrayList.get(0);
                ChinaFeatureLayer.addDoneLoadingListener(new Runnable() {
                    @Override
                    public void run() {
                        MainSceneView.setViewpoint(
                                new Viewpoint(ChinaFeatureLayer.getFullExtent())
                        );
                        List<Field> fields = ChinaFeatureLayer.getFeatureTable().getFields();
                        for (Field field : fields
                                ) {
                            String name = field.getName();
                            String alias = field.getAlias();
                        }
                        final MapQueryClass mapQueryClass = new MapQueryClass();
                        mapQueryClass.Query(ChinaFeatureLayer, "OBJECTID > -1",
                                new IQueryResult() {
                                    @Override
                                    public void getQuery() {
                                        MapQueryClass.MapQueryResult MainMapQueryResult =
                                                mapQueryClass.getMapQueryResult().get(0);
                                        for (Feature feature : MainMapQueryResult.features
                                                ) {
                                            Point center = GeometryEngine.labelPoint((Polygon) feature.getGeometry());
                                            String field = feature.getAttributes().get("Pop_2009").toString();
                                            double count = Double.valueOf(field);
                                            if (count < 0) {
                                                count = 1;
                                            }
                                            count *= 30;
                                            SimpleMarkerSceneSymbol sphere = new SimpleMarkerSceneSymbol(
                                                    SimpleMarkerSceneSymbol.Style.SPHERE,
                                                    0xFFFBB217,
                                                    count,
                                                    count,
                                                    count, SceneSymbol.AnchorPosition.BOTTOM);
                                            MainChinaGraphicsOverlay.getGraphics().add(
                                                    new Graphic(center, sphere)
                                            );
                                            String labelStr = feature.getAttributes().get("NAME").toString() +
                                                    ": " + feature.getAttributes().get("Pop_2009").toString() + "万人";
                                            TextSymbol label = new TextSymbol(10, labelStr, 0xffEDDE8B,
                                                    TextSymbol.HorizontalAlignment.CENTER,
                                                    TextSymbol.VerticalAlignment.TOP);
                                            Point labelPoint = new Point(center.getX(), center.getY(), count, center.getSpatialReference());
                                            MainLabelGraphicsOverlay.getGraphics().add(
                                                    new Graphic(labelPoint, label)
                                            );
                                        }
                                    }
                                });

                    }
                });
                SimpleLineSymbol sls = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, 0xff014D67, 1.0f);
                SimpleFillSymbol sfs = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, 0xff608F9F, sls);
                SimpleRenderer renderer = new SimpleRenderer(sfs);
                ChinaFeatureLayer.setRenderer(renderer);
                ChinaFeatureLayer.loadAsync();
                MainSceneView.getScene().getOperationalLayers().add(ChinaFeatureLayer);
            }
        }
);

结尾

源程序(包含飞机模型和数据)请自行下载:
链接:https://pan.baidu.com/s/1i4HTfil 密码:nwjc
若失效,可发邮件给韩源萌([email protected])索要。

猜你喜欢

转载自blog.csdn.net/allenlu2008/article/details/78667060