安卓智能地图开发与实施二十三:三维场景中的可视化
来源:互联网 发布: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
- 安卓智能地图开发与实施二十三:三维场景中的可视化
- 安卓智能地图开发与实施二十二:展示三维场景
- 安卓智能地图开发与实施十六:三维地图
- 安卓智能地图开发与实施二十五:Shapefile文件的可视化与编辑
- 安卓智能地图开发与实施十三:空间查询与展示
- 安卓智能地图开发与实施二:开发环境准备
- 安卓智能地图开发与实施二十:栅格图层展示
- 安卓智能地图开发与实施二十一:栅格渲染器
- 安卓智能地图开发与实施二十四:关于源代码的放送
- 安卓智能地图开发与实施四:二维地图的MapView与Layers
- 安卓智能地图开发与实施九:地图缩放与旋转
- 安卓智能地图开发与实施三:创建第一个地图程序
- 安卓智能地图开发与实施十二:空间查询与模糊搜索
- 安卓智能地图开发与实施十五:离线与同步
- 安卓智能地图开发与实施十九:符号与渲染器
- 安卓智能地图开发与实施一:配置离线SDK
- 安卓智能地图开发与实施五:在线基础底图
- 安卓智能地图开发与实施六:离线基础底图
- 自主研发全套微信云控源码
- Idea 自动生成变量set方法插件
- 导出Excel(.NET 代码)
- jvm 学习
- iOS 11.0之后,UIScrollView顶部空20像素
- 安卓智能地图开发与实施二十三:三维场景中的可视化
- 获取在接口或者类上定义的泛型类型
- 截取两个String字符串中间的字符串
- crypto++RSA数字签名
- 数据流_小记
- AES加密方式整理
- Markdown编辑之图片去水印
- DB2中的空值和NULL处理
- 升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案