设计WPF地图控件

时间:2008-09-17 19:16:30

标签: wpf gis

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

我在想的是使用ScrollViewer(没有滚动条)作为我的“视口”,然后将所有内容堆叠在画布上。从Z-Index = 0起,我在想:

  1. 用于纬度/经度计算,控制定位,Z-Index堆叠的基础画布。
  2. 多个网格元素,用于表示不同缩放级别的地图。使用网格使拼贴更容易。
  3. 使用位置数据映射对象。
  4. 地图控件(缩放滑块,概述等)。
  5. 使用鼠标移动事件滚动查看器以进行平移和缩放。
  6. 有关我应该如何构建此建议的任何评论建议?

9 个答案:

答案 0 :(得分:9)

如果您正在寻找一个良好的开端,您可以使用SharpMap项目提供的代码基础并从那里开始构建。如果我记得有一些人已经在使用SharpMap的WPF渲染器,那么你可能也会开始使用一些代码。

我个人在将GIS数据与实时GPS数据相结合的C#2.0应用程序中使用了SharpMap,并且非常成功。 SharpMap为我提供了处理GIS数据的转换套件,以及处理改变GIS信息的数学基础。使用带有WPF前端的非呈现代码应该相对简单,因为它们已经将数据与数据分开。

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

答案 1 :(得分:5)

这可能是一种迂回的方式,但您可能会在SilverlightEarth.com的javascript和XAML中找到一些有用的东西,它们是基于Silverlight 1.0的map-tile-client。它可以加载VE,谷歌,雅虎(还有一个DeepZoom version可以加载OpenStreetMap,Moon和Mars;但由于它使用MSI,它对WPF 3 / 3.5前端没有任何帮助。)

虽然javascript有些不整洁,但你可以清楚地看到它正在创建一个Silverlight 1.0 Xaml(动态大小)Canvas,用tile(图像控件)填充它并处理放大/缩小和平移请求。你需要理解所有的javascript并将其转换为C# - XAML应该主要进入WPF。我有tested this Silverlight 1.0 with a Deep Zoom tile pyramid(和here)所以这些概念是适用的(即不仅适用于地图)。

我知道这是有效的,因为我自己完成了在Geoquery2008.comscreenshot)中构建地图查看器,这是WPF / c#。遗憾的是,Geoquery2008程序集是混淆的,但您仍然可以通过DASM / Reflector收集一些想法或有用的代码。它仍然是测试版,所以我不会声称它是100%完成的。我真的没想过将地图代码分解成一个单独的控件,但是如果没有出现另一个控件,我可能会考虑一下......

顺便说一下,我也开始使用ScrollViewer,但我打算放弃它并更仔细地模仿javascript,以便在平移/缩放时更容易重新使用Image对象(通过获得对ScrollViewer提供的更多控制权)。

Virtual Earth tile systemDeep Zoom file format以及相关链接上的这些MSDN页面可能也是一个有用的参考。

最后 - 我猜你自从这篇文章以来就看到DeepZoom / MultiScaleImage可能在.NET 4.0/Studio 2010

答案 2 :(得分:1)

您创建WPF映射工具的愿望与我的类似,这让我向Silverlight询问有关DeepZoom(又名MultiScaleImage)的this question。我想要一个WPF版本。接受的答案提供了一个非常好的起点的链接(类似于您描述的思考过程)。

答案 3 :(得分:1)

虚拟地球有利于WPF

答案 4 :(得分:1)

不知道您是否使用ESRI软件,但我听说在那里开发了一个Silverlight API,因此您可能想要推迟。

答案 5 :(得分:1)

它根本不属于我的工作领域,但您可以查看MapWindow GIS,它有一个开源ActiveX对象,提供了大量的映射和GIS功能。 这是一篇解释如何将其嵌入WPF应用程序的帖子:

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

答案 6 :(得分:1)

下载Bing Maps WPF控件sdk(Microsoft.Maps.MapControl.WPF.dll)。添加为dll作为参考,然后按如下所示更改XAML

**

<Window x:Class="WPFTestApplication.InsertPushpin"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF"
    Width="1024" Height="768">
    <Grid x:Name="LayoutRoot" Background="White">
        <m:Map CredentialsProvider="INSERT_YOUR_BING_MAPS_KEY" 
               Center="47.620574,-122.34942" ZoomLevel="12">
            <m:Pushpin Location="47.620574,-122.34942"/>
        </m:Map>
    </Grid>
</Window>

**

答案 7 :(得分:0)

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

此外,如果您希望它不仅仅是一个玩具图像查看器,拉长到XY的缩放可以变得“有趣”

答案 8 :(得分:0)