地形建模可能算是三维gis的一个难点。之前在学校时做过一个简单的学校三维模型,本来是想做加上地形的,不过后来发现并不是那么容易所以就放弃了。最后做出来的学校模型除了建筑就只有几棵树,效果不是那么好。
今天来介绍一下超图三维的地形建模的相关知识。地形建模会分为三部分介绍
1.TIN地形的生成
2.TIN拉伸成模型
3.地形贴纹理
由于时间和其他方面的一些限制,文章可能会更新得有点慢。
一、地形效果图展示
先来看下超图三维地形的效果图:
从地理空间数据云(http://www.gscloud.cn)下载免费的30m分辨率的dem以栅格的方式导入到超图平台,直接将dem添加到场景中。效果如下:
加载在线的天地图隐藏影像再看下效果:
可以看下河流道路一些地物的匹配情况:
总体来说,整体效果还行。不过这种地形其实是栅格(Grid)地形,相比TIN地形精度是远远不够的。
再来看一下的TIN地形与栅格(Grid)地形对比图
(由于天地图加载到一定精度就不给显示,所以我加了osm对比,左边TIN地形,右边栅格地形):
对比效果还是比较明显的,左边在表现地形方面更精细,更能准确地表达地形。
二、TIN地形的生成
其实TIN地形的生成也很简单,只需要简单的几行代码就行。
主要的接口如下:
int BeginLevel { get; set; } 起始层;一般默认
string CacheName { get; set; } 缓存名称;需要自己定义
GeoRegion ClipRegion { get; set; } 裁剪面;可默认,可自定义裁剪面
DatasetGrid Dataset { get; set; } 栅格数据集;生成TIN地形的dem数据
int EndLevel { get; set; } 结束层;一般默认
bool IsBuildNormalMap { get; set; } 是否生成法线;如果没有法线加载到场景中看不到明 暗效果
int NormalSize { get; set; } 法线块大小;默认64(x64)一般32(x32)、 64(x64)、 128(x128),值越大,生成的文件越大
string OutputFolder { get; set; } 输出路径
bool BuildTIN(); 执行生成TIN; 成功返回true;否则,发挥false;
主要代码:
class Program
{
private static Datasource m_datasource;
private static CacheBuilderTIN m_CacheBuilderTin;
static void Main(string[] args)
{
m_datasource = new Datasource(EngineType.UDB);
DatasourceConnectionInfo info = new DatasourceConnectionInfo();
//本地udb文件型数据源
info.Server = @"D:\BaiduYunDownload\dem\dem.udb";
info.Alias = Path.GetFileNameWithoutExtension(info.Server);
if (m_datasource.Open(info))
{
Console.WriteLine("成功打开数据源{0}", m_datasource.Alias);
//务必确认dem.udb的第0个数据集为栅格数据集
m_CacheBuilderTin = new CacheBuilderTIN();
m_CacheBuilderTin.Dataset = m_datasource.Datasets[0] as DatasetGrid;
m_CacheBuilderTin.IsBuildNormalMap = true;
m_CacheBuilderTin.OutputFolder = @"E:\tin";
//进度条
m_CacheBuilderTin.Stepped += m_CacheBuilderTin_Stepped;
m_CacheBuilderTin.BuildTIN();
m_CacheBuilderTin.Stepped -= m_CacheBuilderTin_Stepped;
}
Console.ReadKey();
}
private static void m_CacheBuilderTin_Stepped(object sender, SteppedEventArgs e)
{
//每百分之10输出一次
if (e.Percent % 10 == 0)
{
Console.WriteLine("已完成{0}%,剩余时间:{1}", e.Percent, e.RemainTime);
}
}
}
生成过程:
生成后TIN缓存目录结构:
加载到场景后的效果图:
好了,今天的介绍就到这里了。