我正在考虑在WPF中进行简单的地图控制,并且正在考虑基本地图界面的设计,并且想知道是否有人对此有一些好的建议。
我在想的是使用ScrollViewer(没有滚动条)作为我的“视口”,然后将所有内容堆叠在画布上。从Z-Index = 0起,我在想:
有关我应该如何构建此建议的任何评论建议?
答案 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.com(screenshot)中构建地图查看器,这是WPF / c#。遗憾的是,Geoquery2008程序集是混淆的,但您仍然可以通过DASM / Reflector收集一些想法或有用的代码。它仍然是测试版,所以我不会声称它是100%完成的。我真的没想过将地图代码分解成一个单独的控件,但是如果没有出现另一个控件,我可能会考虑一下......
顺便说一下,我也开始使用ScrollViewer,但我打算放弃它并更仔细地模仿javascript,以便在平移/缩放时更容易重新使用Image对象(通过获得对ScrollViewer提供的更多控制权)。
Virtual Earth tile system和Deep 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应用程序的帖子:
答案 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)