我正在考虑在WPF中进行简单的地图控制,并且正在考虑基本地图界面的设计,并且想知道是否有人对此有一些好的建议.
我在想的是使用ScrollViewer(没有滚动条)作为我的"视图端口",然后将所有内容堆叠在画布上.从Z-Index = 0起,我在想:
用于纬度/长度计算,控制定位,Z-Index堆叠的基础画布.
多个网格元素表示不同缩放级别的地图.使用网格使拼贴更容易.
使用位置数据映射对象.
地图控件(缩放滑块,概述等).
使用鼠标移动事件滚动查看器以进行平移和缩放.
关于我应该如何建立这个的任何意见建议?
如果您正在寻找一个良好的开端,您可以使用SharpMap项目提供的代码基础并从那里进行构建.如果我记得有一些人已经在使用SharpMap的WPF渲染器,那么你可能还会有一些代码开始.
我个人在将GIS数据与实时GPS数据相结合的C#2.0应用程序中使用了SharpMap,并且非常成功.SharpMap为我提供了处理GIS数据的转换套件,以及处理改变GIS信息的数学基础.将非呈现代码与WPF前端一起使用应该相对简单,因为它们已经具有与数据分离的呈现.
(编辑:添加了有关我如何使用SharpMap的更多细节)
它可能是一种迂回的方式,但您可能会在SilverlightEarth.com的javascript和XAML中找到一些有用的东西,它们是基于Silverlight 1.0的map-tile-client.它可以加载VE,谷歌,雅虎(有一个DeepZoom版本也可以加载OpenStreetMap,Moon和Mars;但由于它使用MSI,它在WPF 3/3.5前端并没有真正的帮助).
虽然javascript有点不整洁,但你可以清楚地看到它正在创建一个Silverlight 1.0 Xaml(动态大小)Canvas,用tile(图像控件)填充它并处理放大/缩小和平移请求.你需要理解所有的javascript并将其转换为C# - XAML应该主要进入WPF.我已经使用深度缩放平铺金字塔(以及此处)测试了这个Silverlight 1.0,因此这些概念是适用的(即不仅适用于地图).
我知道这是有效的,因为我自己完成了在Geoquery2008.com(截图)中构建地图查看器,这是WPF/c#.遗憾的是,Geoquery2008程序集是混淆的,但您仍然可以通过DASM/Reflector收集一些想法或有用的代码.它仍然是测试版,所以我不会声称它是100%完成的.我并没有真正想过将地图代码分解为一个单独的控件,但如果另一个没出现,我可能会调查一下...
顺便说一下,我也开始使用ScrollViewer,但我打算放弃它并更仔细地模仿javascript,以便在平移/缩放时更容易重新使用Image对象(通过获得对ScrollViewer提供的更多控制).
Virtual Earth磁贴系统上的这些MSDN页面以及Deep Zoom文件格式和相关链接可能也是一个有用的参考.
最后 - 我猜你自从这篇文章以来就看到DeepZoom/MultiScaleImage很可能出现在.NET 4.0/Studio 2010中.