设计WPF地图控件

时间:2020-03-05 18:59:45  来源:igfitidea点击:

我正在考虑在WPF中制作一个简单的地图控件,并正在考虑基本地图界面的设计,并且想知道是否有人对此提供了一些好的建议。

我在想的是使用ScrollViewer(无滚动条)作为"查看端口",然后将所有内容堆叠在画布上。从Z-Index = 0开始,我在想:

  • 用于纬度/经度计算,控制定位,Z索引堆叠的基础画布。
  • 多个Grid元素以不同的缩放级别表示地图。使用网格使平铺更加容易。
  • 使用位置数据映射对象。
  • 地图控件(缩放滑块,概述等)。
  • 滚动查看器,带有用于平移和缩放的鼠标移动事件。

关于应如何构建此功能的任何意见建议?

解决方案

回答

主要问题是如何存储和访问要放入地图中的项目(假设这不只是图片显示)。查找场景图以获得一些想法。

另外,如果我们希望它不只是玩具图像查看器,那么XY缩放所需的时间可能会变得"有趣"

回答

我们创建WPF映射工具的愿望与我的相似,这使我提出了有关Silverlight中DeepZoom(aka MultiScaleImage)的问题。我想要一个WPF版本。接受的答案提供了一个非常好的起点的链接(类似于我们描述的思维过程)。

回答

如果我们正在寻找一个良好的开端,则可以使用SharpMap项目提供的代码基础,然后从那里开始。如果我记得有一些人已经在为SharpMap制作WPF渲染器,那么我们可能还需要一些代码。

我亲自在C2.0应用程序中使用SharpMap,该应用程序将GIS数据与实时GPS数据结合在一起,并且非常成功。 SharpMap为我提供了处理GIS数据的转换套件,以及为更改GIS信息而工作的数学基础。将非呈现代码与WPF前端一起使用应该相对直接,因为它们已经具有与数据分离的呈现。

(编辑:添加了有关我如何使用SharpMap的更多详细信息)

回答

虚拟地球对WPF有利

回答

这可能是解决问题的一种round回方式,但是我们可能会在SilverlightEarth.com(基于Silverlight 1.0的map-tile-client)的javascript和XAML中找到一些有用的东西。它可以加载VE,Google,Yahoo(有一个DeepZoom版本也可以加载OpenStreetMap,Moon和Mars;但是由于它使用MSI,因此在WPF 3 / 3.5方面确实没有帮助)。

尽管javascript有点凌乱,但我们可以清楚地看到它正在创建Silverlight 1.0 Xaml(动态尺寸)Canvas,并用图块(图像控件)填充它,并处理放大/缩小和平移请求。我们需要弄清所有javascript并将其转换为Cthe XAML应该几乎没有更改就可以放入WPF中。我已经使用Deep Zoom拼贴金字塔(和此处)测试了此Silverlight 1.0,因此可以应用这些概念(即,不仅适用于地图)。

我知道这可行,因为我自己完成了在WPF / c#的Geoquery2008.com(屏幕截图)中构建地图查看器的工作。不幸的是,Geoquery2008程序集被混淆了,但是我们仍然可以通过DASM / Reflector收集一些想法或者有用的代码。它仍然是一个测试版,所以我不会声称它已100%完成。我还没有真正考虑过将地图代码分解为一个单独的控件,但是如果没有其他控件出现,我可以考虑一下...

顺便说一句,我也从ScrollViewer开始,但是打算抛弃它并更紧密地模仿javascript,以便在平移/缩放时重用Image对象(通过获得比ScrollViewer提供的过程更多的控制权)。

Virtual Earth磁贴系统上的这些MSDN页面以及Deep Zoom文件格式和相关链接也可能是有用的参考。

最后,我想我们可能从这篇文章开始就已经看到DeepZoom / MultiScaleImage可能位于.NET 4.0 / Studio 2010中。

回答

不知道我们是否使用ESRI软件,但我听说那里正在为那里的堆栈开发Silverlight API,因此我们可能会推迟。

回答

它根本不属于我的工作领域,但是我们可以看看MapWindow GIS,它具有一个开放源代码ActiveX对象,该对象提供了许多地图和GIS功能。
这是一篇说明如何将其嵌入WPF应用程序的文章:

http://www.mapwindow.org/phorum/read.php?13,13484