介绍

在ArcGIS Runtim SDK for .NET 10.2.6中,新添加了三维地图功能。在ArcGIS中,我们将三维地图称为Scene(场景),所以在Runtime SDK SDK for .NET中提供SceneView和Scene控件来显示三维数据,类似于在二维地图中的MapView和Map控件。而且在三维场景中能实现大多数二维地图下的功能。

显示场景

场景的显示由位置和观察者(observer)的属性决定,同过Canera这个类实现。下面的camera(相机)的特征用于显示三维的场景。 
–Location,表示相机在表面上的位置(x,y坐标) 
–Heading表示相机水平的朝向角度 
–Pitch表示相机镜头与垂直线的角度 
–Evevation表示高程(z) 

ps:实际在camera.Location中可以设置z。

加载地图

在三维场景中可以加载二维的地图,三维的模型以及高程数据。 
 
 
在xaml中添加加载地图代码:

  1. <esri:Scene x:Name="scene1">
  2. <esri:Scene.Surface>
  3. <esri:ServiceElevationSource ServiceUri="http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" IsEnabled="True" ID="elevationLayer" />
  4. </esri:Scene.Surface>
  5. <esri:ArcGISTiledMapServiceLayer x:Name="TiledMap1" ServiceUri="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"/>
  6. <esri:SceneLayer ServiceUri="http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Philadephia/SceneServer/layers/0"/>
  7. </esri:Scene>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在场景中显示图形

添加图形

图形可以添加到Scene的GraphicsLayer,或者SceneView的GraphicsOverlay。每个图形有一个几何,一系列属性和渲染需要的符号。下面的例子展示创建一个点图形,并设置几何和符号,最后添加到SceneView的GraphicsOverlay。 

  1. public MainWindow()
  2. {
  3. InitializeComponent();
  4. // create a new point (MapPoint); pass x, y, and z coordinates in the constructor
  5. var newPoint = new MapPoint(-117.334, 34.55, 6000);
  6. // create a red "X" marker symbol
  7. var xMarkerSym = new SimpleMarkerSymbol();
  8. xMarkerSym.Color = Colors.Red;
  9. xMarkerSym.Size = 34;
  10. xMarkerSym.Style = SimpleMarkerStyle.X;
  11. // create a new graphic; assign the point and the symbol in the constructor
  12. var graphic = new Graphic(newPoint, xMarkerSym);
  13. // get a graphics overlay in the scene view and add the graphic
  14. var overlay = MySceneView.GraphicsOverlays["MyGraphicsOverlay"];
  15. overlay.Graphics.Add(graphic);
  16. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

渲染

渲染决定了图层上图形的样式。渲染器可以使用单一的符号来渲染所有的要素,或者使用含有逻辑的方式来定义不同属性的要素。 

  1. <esri:GraphicsLayer ID="GraphicsLayer" >
  2. <esri:GraphicsLayer.Renderer>
  3. <esri:SimpleRenderer>
  4. <esri:SimpleRenderer.Symbol>
  5. <esri:SphereMarkerSymbol Color="#FFFF99" Radius="1000" AnchorPosition="Top" />
  6. </esri:SimpleRenderer.Symbol>
  7. </esri:SimpleRenderer>
  8. </esri:GraphicsLayer.Renderer>
  9. </esri:GraphicsLayer>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查询功能

在Runtime SDK for .NET中虽然不直接支持对三维模型的查询,但是我们可以通过将二维要素符号化后实现对三维属性的查询和三维建筑的高亮显示。 
 
查询代码

  1. Esri.ArcGISRuntime.Layers.GraphicsLayer myGraphicsLayer = (Esri.ArcGISRuntime.Layers.GraphicsLayer)scene1.Layers["myGraphicsLayer"];
  2. if(myGraphicsLayer!=null)
  3. myGraphicsLayer.Graphics.Clear();
  4. Uri myUri = new Uri("http://localhost:6080/arcgis/rest/services/Feature_Philadelphia/MapServer");
  5. FindParameters myFinfParameters = new FindParameters();
  6. myFinfParameters.SearchText = "philly_"+TextBox1.Text+".flt";
  7. List<int> myLayerIds = new List<int>();
  8. myLayerIds.Add(0);
  9. myFinfParameters.LayerIDs = myLayerIds;
  10. if (CheckBox1.IsChecked == true)
  11. {
  12. myFinfParameters.Contains = false;
  13. }
  14. else
  15. {
  16. myFinfParameters.Contains = true;
  17. }
  18. List<string> mySearchFields = new List<string>();
  19. mySearchFields.Add("Name");
  20. myFinfParameters.SearchFields = mySearchFields;
  21. FindTask myFindTask = new FindTask(myUri);
  22. FindResult myFindResult = await myFindTask.ExecuteAsync(myFinfParameters);
  23. IReadOnlyList<FindItem> myFindItems = myFindResult.Results;
  24. TextBox2.Text = myFindItems.Count.ToString();
  25. myGraphicsLayer = (GraphicsLayer)scene1.Layers["myGraphicsLayer"];
  26. var states = new GraphicCollection();
  27. foreach(FindItem oneFindItem in myFindItems)
  28. {
  29. states.Add(new Graphic(oneFindItem.Feature.Geometry, oneFindItem.Feature.Attributes));
  30. MapPoint mylocation = new MapPoint(oneFindItem.Feature.Geometry.Extent.GetCenter().X, oneFindItem.Feature.Geometry.Extent.GetCenter().Y-2000,370, oneFindItem.Feature.Geometry.Extent.GetCenter().SpatialReference);
  31. var viewpoint1 = new Camera( mylocation,0,73.16171159612496);
  32. await MySceneView.SetViewAsync(viewpoint1, 4, true);
  33. }
  34. await MySceneView.LayersLoadedAsync();
  35. var statesOverlay = MySceneView.GraphicsOverlays["statesOverLayer"];
  36. statesOverlay.GraphicsSource = states;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

二三维联动

在ArcGIS Runtime SDK for .NET中,在一个窗体中可以添加两个视图,这里我添加了一个SceneView和 一个MapView实现二三维的联动。 
 
我们可以通过地图控件的SpatialReferenceChanged来监控地图的变化。

  1. private async void MySceneView1_CameraChanged(object sender, EventArgs e)
  2. {
  3. var currentViewpoint = MySceneView1.GetCurrentViewpoint(ViewpointType.BoundingGeometry);
  4. MyMapView1.SetViewAsync(currentViewpoint);
  5. }
  6. private async void MyMapView1_ExtentChanged(object sender, System.EventArgs e)
  7. {
  8. var viewpoint1 = MyMapView1.GetCurrentViewpoint(ViewpointType.BoundingGeometry);
  9. await MySceneView1.SetViewAsync(viewpoint1);
  10. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

三维符号的属性查询

同二维的符号一样三维的符号的属性也可以进行查询。下面是获取的美国各州不同年龄段人口的数量。我们可以用三维的符号将人口数直观的表现出来。还可以点击符号,显示出这是哪个州,这个年龄段的人口的数量。例如:图中显示是阿拉斯加州,5-17岁的人口是143126。 
 
属性查询代码

  1. GraphicsOverlay myGraphicsOverlay = MySceneView.GraphicsOverlays["statesOverlay"];
  2. myGraphicsOverlay.ClearSelection();
  3. Graphic myGraphic = await myGraphicsOverlay.HitTestAsync(MySceneView, e.Position);
  4. if (myGraphic != null)
  5. {
  6. myGraphic.IsSelected = true;
  7. IDictionary<string, object> myAttributes = myGraphic.Attributes;
  8. StringBuilder myStringBuilder = new System.Text.StringBuilder();
  9. foreach (var oneAttribute in myAttributes)
  10. {
  11. if (statisticsComboBox.Text.ToString() == oneAttribute.Key.ToString() || oneAttribute.Key.ToString() == "STATE_NAME")
  12. myStringBuilder.AppendLine(oneAttribute.Key.ToString() + ": " + oneAttribute.Value.ToString());
  13. }
  14. MessageBox.Show(myStringBuilder.ToString());
  15. }

《ArcGIS Runtime SDK for .NET开发笔记》--三维功能的更多相关文章

  1. 《ArcGIS Runtime SDK for Android开发笔记》

    开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).And ...

  2. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述

    1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...

  3. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

    1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...

  4. 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用

    1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...

  5. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析

    1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

    1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...

  8. 《ArcGIS Runtime SDK for Android开发笔记》——(8)、关于ArcGIS Android开发的未来(“Quartz”版Beta)

    1.前言 今天再一次在官网看到了ArcGIS Runtime SDK for Android下一个版本“Quartz”版的更新资料,它将是一个非常重要的更新,包括API接口的重构和开发思路的调整.具体 ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境

    1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...

随机推荐

  1. python生成接口自动化测试报告模版

    1:准备html模版 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  2. python函数的参数-可变参数,关键字参数

    # -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Persona ...

  3. Linux用户空间与内核地址空间

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

  4. xstart使用方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/YABIGNSHI/article/det ...

  5. std::sort的详细用法

    #include <algorithm> #include <functional> #include <array> #include <iostream& ...

  6. 用select实现多客户端连接

    server.c 把accept也看成是一个read类型的函数, 于是我们可以把sockfd也放入到select中 maxi标记当前客户端连接数组的最大下标 select返回值为当前已经准备就绪的fd ...

  7. 定制xfce4桌面==排除appfinder的綑绑

    如下等同于安装 xfce4-meta,除了不安装 app-finder emerge -avq xfwm4 xfdesktop xfce4-session xfce4-settings xfce4-t ...

  8. 在虚拟机的Linux系统下安装wineqq

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 本文参考教程:http://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread& ...

  9. SSOJ 317 Fast Ride

    317. Fast Ride Time limit per test: 0.25  second(s) Memory limit: 65536 kilobytes input: standard ou ...

  10. Python之计算当前月份的日期范围(calendar、datetime)

    在当前月份中循环每一天大致的思路就是先计算出当月的第一天和下个月的第一天日期,还有当月总共有多少天,然后把第一天日期按照月总天数累加到下个月的第一天,就ok 啦 from datetime impor ...