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

0
分享 2018-04-04

三维场景中的可视化


三维场景(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)索要。

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

0 个评论

要回复文章请先登录注册