Silverlight Bing Maps 加载三维(假)地图
时间:2011-06-04 来源:fengl
第一步. 在Sketch UP 中创建三维建筑物:
创建三维建筑物可能大多数想到的都是强大的3DMax,但我在这推荐下简练的Sketch UP。下面这个就是创建好的三维模型,看上去有点灰不溜秋的(因为没做渲染处理)。
模型创建好了以后,就可以把模型调到一个合适的角度,然后导出2D Graphic保存为jpg格式。
第二步. 使用MapCruncher进行地图切片
在这我们使用微软提供的地图切片工具MapCruncher,下载地址:http://research.microsoft.com/en-us/um/redmond/projects/mapcruncher/
里面也有具体的教材,在这我就做下简单切片步骤:
1. 导入上一步我们导出的图片
2. 然后我们就可以左视图中看到我们的三维地图了
3. 下一步就开始配准,也就是确定你所建的模型的实际地理位置。一般我们需要有三个点来配准
添加三个配准坐标点(point1、point2、point3)
4. 然后点击render进行切片(切片需要一段时间)。
5. 最后我们就可以在保存的文件夹下看到所切的图了:
第三步. 接下来我们就开始在silverlight中读取这些切片了
首先把上一步保存的切片文件夹放到C:\inetpub\wwwroot下,
编写自定义Custom3DTileSource实现对我们自己部署的地图加载算法:
public class Custom3DTileSource : LocationRectTileSource
{
private const string baseUrl = "http://localhost/3DMapLayer/{0}.png";
public Custom3DTileSource()
: base(baseUrl, new LocationRect(new Location(60, 60), new Location(13, 140)),
new Range<double>(1, 17))
{ }
public override Uri GetUri(int x, int y, int zoomLevel)
{
return new Uri(string.Format(this.UriFormat, TileXYToQuadKey(x, y, zoomLevel)), UriKind.RelativeOrAbsolute);
}
private static string TileXYToQuadKey(int tileX, int tileY, int levelOfDetail)
{
StringBuilder quadKey = new StringBuilder();
for (int i = levelOfDetail; i > 0; i--)
{
char digit = '0';
int mask = 1 << (i - 1);
if ((tileX & mask) != 0)
{
digit++;
}
if ((tileY & mask) != 0)
{
digit++;
digit++;
}
quadKey.Append(digit);
}
return quadKey.ToString();
}
}
然后我们就可以用Custom3DTileSource来加载地图了
public partial class _3DMapViews : UserControl
{
MapTileLayer mapTileLayer = new MapTileLayer();
public _3DMapViews()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(_3DMapViews_Loaded);
}
void _3DMapViews_Loaded(object sender, RoutedEventArgs e)
{
Custom3DTileSource cts = new Custom3DTileSource();
mapTileLayer.TileSources.Add(cts);
my3DMap.Mode = new MercatorMode();
my3DMap.Center = new Location(25.18, 119.50);
my3DMap.Children.Add(mapTileLayer);
}
}
最终效果如下: