安卓智能地图开发与实施二十三:三维场景中的可视化

来源:互联网 发布:js 字段包含某些值 编辑:程序博客网 时间:2024/05/22 02:01

三维场景中的可视化

这里写图片描述

三维场景(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
若失效,可发邮件给韩源萌(polyline@126.com)索要。

阅读全文
0 0