您的位置:首页 > 编程语言 > C#

C# arcgis globecontrol 三维地图 基础操作 加载地图 缩放 漫游

2015-11-03 16:31 507 查看
最近由于开发需要,接触了下argis,虽然很牛逼,但是很多东西都不太清楚,这里就简单的写下arcgis的一些基本操作,备用。

ArcGlobe与ArcScene功能比较与简单说明 

ArcGIS Desktop中,可用于三维场景展示的程序为ArcGlobe和ArcScene,由于两者的差别,在三维场景展示中适用的情况有所不同。由于Engine与Desktop底层技术都是基于AO的,因此该比较结果在功能性和整体效率方面同样适用与GlobeControl和SceneControl。 

ArcGlobe 

ArcGlobe是ArcGIS9.0之后出现的新产品,设计用于展示大数据量的场景,支持对栅格和矢量数据无缝的显示。ArcGlobe基于全球视野,所有数据均投影到全球立方投影(World Cube Projection)下,并对数据进行分级分块显示。为提高显示效率,ArcGlobe按需将数据缓存到本地,矢量数据可以进行栅格化。 

 ArcScene 

ArcScene是一个适合于展示三维透视场景的平台,可以在三维场景中漫游并与三维矢量与栅格数据进行交互。ArcScene是基于OpenGL的,支持TIN数据显示。显示场景时,ArcScene会将所有数据加载到场景中,矢量数据以矢量形式显示,栅格数据默认会降低分辨率来显示以提高效率。 
 ArcGlobe和ArcScene的主要区别: 

ArcGlobe将所有数据投影到球体表面上,使场景显示更接近现实世界。适合于全市,全省,全国甚至全球大范围内的数据展示。 

ArcScene将所有数据投影到当前场景所定义的空间参考中,默认情况下,场景的空间参考由所加入的第一个图层空间参考决定。ArcScene中场景表现为平面投影,适合于小范围内精细场景刻画。 
 缓存与内存管理机制 

ArcGlobe和ArcScene最重要的区别在于此。ArcGlobe设计用于海量数据展示,所以为提高显示效率而进行数据缓存是很必要的。ArcGlobe将数据分块并按级别建立缓存和索引,才使得即使在ArcGlobe中显示海量数据仍可以高速的展示与漫游。 

在我理解看来,arcgloble类似于谷歌地球的感觉,有大量的数据来进行展示,适合于大的场景;ArcScene更像是封装好的地理沙盘,适合于小的场景。



下面是ArcGlobe的基本操作:

由于没有地图数据,先要搞数据,但是数据哪里有呢,当然是万能的淘宝!但是毕竟都是调研项目,自己学习的,花钱不划算。网上一个非常靠谱的方法,就是使用arcgis自己的数据,需要联网,具体实现原理不清楚,应该是arcgis自己做的处理,方法如下:

step1:打开arcgis自带的arcglobe软件

step2:File-new 新建一个新的场景,然后浏览到你想要的地方然后直接File-Save As就行了,保存为3dd就可以了。(其实这里就是直接加载的arcgis的网络地球)

完事后你就有了arcglobe的地图文件了。

开始正题:

引入命名空间

using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Analyst3D;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.GlobeCore;

全局变量(地图视图,相机)
private ISceneViewer m_ActiveView;
private ICamera m_Camera;

加载地图
if (axGlobeControl1.Check3dFile(filePath))
{
axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass;
axGlobeControl1.Load3dFile(filePath);
axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
}
else
{
MessageBox.Show(filePath + "不是有效的地图文件");
}

鼠标滚轮方法缩小事件

private void axGlobeControl1_OnMouseWheel(object sender, MouseEventArgs e)
{
//将axGlobeControl1相对于软件的坐标,变换成屏幕坐标
System.Drawing.Point pSceLoc = axGlobeControl1.PointToScreen(axGlobeControl1.Location);

//将鼠标所在位置坐标变换成屏幕坐标
System.Drawing.Point Pt = this.PointToScreen(e.Location);

//判断鼠标是否在屏幕外,如果是返回,无操作
if (Pt.X < pSceLoc.X || Pt.X > pSceLoc.X + axGlobeControl1.Width || Pt.Y < pSceLoc.Y || Pt.Y > pSceLoc.Y + axGlobeControl1.Height)
{
return;
}

double scale = 0.2;
if (e.Delta > 0) scale = -scale;

IGlobeCamera pGlobeCamera = axGlobeControl1.GlobeCamera;
ICamera pCamera = pGlobeCamera as ICamera;
IGlobeDisplay pGlobeDisplay = axGlobeControl1.GlobeDisplay;
if (pGlobeCamera.OrientationMode == esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal)
{
double xo, yo, zo;
pGlobeCamera.GetObserverLatLonAlt(out xo, out yo, out zo);
zo = zo * (1 + scale);
pGlobeCamera.SetObserverLatLonAlt(xo, yo, zo);
}
else
{
pCamera.ViewingDistance += pCamera.ViewingDistance * scale;
}
axGlobeControl1.GlobeDisplay.RefreshViewers();
}

漫游
这里主要是设置axGlobeControl1.Navigate为true,地球就可以动起来了。

switch (item.Text)
{
case "漫游" :
axGlobeControl1.Navigate = true;
//axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerPan;
break;
case "放大":
double vfa = m_Camera.ViewFieldAngle;
m_Camera.ViewFieldAngle = vfa * 0.9;
m_ActiveView.Redraw(false);
break;
case "缩小":
double vfa1 = m_Camera.ViewFieldAngle;
m_Camera.ViewFieldAngle = vfa1 * 1.1;
m_ActiveView.Redraw(false);
break;
case "3D":
axGlobeControl1.Navigate = true;
//axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerPan;
break;
}

实现效果:

最简单,最基本的操作,希望给新学习的童鞋一点启示,请大神指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# 地图 arcgis 三维 开发