12

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

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

  1. 用于纬度/经度计算、控制定位、Z-Index 堆叠的基础画布。
  2. 多个网格元素来表示不同缩放级别的地图。使用网格使平铺更容易。
  3. 使用位置数据映射对象。
  4. 地图控件(缩放滑块、概览等)。
  5. 带有用于平移和缩放的鼠标移动事件的滚动查看器。

关于我应该如何构建它的任何评论建议?

4

10 回答 10

9

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

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

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

于 2008-09-17T22:11:53.087 回答
5

这可能是一种迂回的方式,但您可能会在 SilverlightEarth.com 的 javascript 和 XAML 中找到一些有用的东西,是一个基于 Silverlight 1.0 的地图瓦片客户端。它可以加载 VE、Google、Yahoo(有一个DeepZoom 版本也可以加载 OpenStreetMap、Moon 和 Mars;但由于它使用 MSI,它在 WPF 3/3.5 前端并没有真正的帮助)。

虽然 javascript 有点杂乱,但您可以清楚地看到它正在创建一个 Silverlight 1.0 Xaml(动态大小)画布,用图块(图像控件)填充它并处理放大/缩小和平移请求。您需要了解所有的 javascript 并将其转换为 C# - XAML 应该主要进入 WPF 不变。我已经用 Deep Zoom 平铺金字塔(和这里)测试了这个 Silverlight 1.0,所以这些概念是适用的(即不仅适用于地图)。

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

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

这些关于Virtual Earth tile 系统Deep Zoom 文件格式和相关链接的 MSDN 页面可能也是一个有用的参考。

最后 - 我猜你在这篇文章之后已经看到 DeepZoom/MultiScaleImage 很可能在.NET 4.0/Studio 2010中。

于 2008-12-02T00:53:20.537 回答
1

不知道你是否使用 ESRI 软件,但我听说那里正在为那里的堆栈开发一个 Silverlight API,所以你可能想要推迟。

于 2008-12-04T17:02:43.247 回答
1

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

于 2008-09-17T22:02:18.540 回答
1

虚拟地球对WPF 有好处

于 2008-09-17T23:14:02.940 回答
1

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

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

于 2010-01-30T13:35:39.710 回答
1

下载 Bing Maps WPF Control 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>

**

于 2019-11-21T10:58:34.580 回答
0

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

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

于 2008-09-17T19:51:09.260 回答
0

Bing Maps Windows Presentation Foundation Control v1是 WPF 中最好的地图控件。

支持瓦片层——您现在可以在地图控件上覆盖自己的瓦片层。
关闭基础图块层——当您不需要/不想使用我们的基础地图图块,而是更喜欢使用您自己的而不将它们覆盖在我们的顶部时,这很有用。控件不会请求减少的图块下载并提高渲染性能。
SSL 支持 – 由于你们中的许多人在安全应用程序中使用 WPF 控件,因此您现在可以通过 SSL 发出磁贴和服务请求而不会出现问题。
隐藏比例尺 - 如果您不想要比例尺(可能您的地图很小并且比例尺使地图混乱),您可以将其关闭。事实上,唯一不能关闭的元素是 Bing 徽标和版权。
新的版权服务——为我们的数据供应商提供准确的版权。额外的惯性 - 现在为鼠标启用惯性,默认情况下为触摸启用。
其他错误修复——感谢对 MSDN 论坛、必应地图博客、电子邮件和 Twitter 的反馈。好找人。

于 2012-03-13T06:30:55.783 回答
0

不要自己构建 - 使用 WPF Bing Maps Control http://www.bing.com/community/site_blogs/b/maps/archive/2012/01/12/announcing-the-bing-maps-windows-presentation -基础控制-v1.aspx

于 2012-01-13T14:24:10.887 回答