是否有适用于 Winforms(或其类似物)的 Geopoint class?

Is there a Geopoint class available for Winforms (or an Analogue thereof)?

在我的 UWP 应用中,我使用 Geopoint class:

using Windows.Devices.Geolocation;

. . .

List<Geopoint> locations;

在 Winforms 应用程序中,这不可用 - 无法识别 Geopoint。是否有类似的 class 可用于 Winforms 应用程序?

BasicGeoposition 对象也是如此 - 无法识别。

更新

我想要 GeoPoint 和 BasicGeoposition classes,所以我可以这样做:

BasicGeoposition location = new BasicGeoposition();
location.Latitude = 36.59894360222391; // Monterey == 36.6002° N
location.Longitude = -121.8616426604813; // Monterey == 121.8947° W (West is negative)
Geopoint geop = new Geopoint(location);
await map.TrySetSceneAsync(MapScene.CreateFromLocation(geop));
cmbxZoomLevels.SelectedIndex = Convert.ToInt32(map.ZoomLevel - 1);
map.Style = MapStyle.Aerial3DWithRoads;

更新 2

我尝试了答案中提供的代码:

this.UserControl1.myMap.AnimationLevel = AnimationLevel.Full;
this.userControl11.myMap.Loaded += MyMap_Loaded;

...但它无法编译。我没有 UserControl11(这是答案的代码),但我有 UserControl1,但无法识别:

这是有问题的 XAML(Bing 地图键混淆):

<UserControl x:Class="MyMaps.UserControl1"
             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">
    <Grid>
        <m:Map CredentialsProvider="Gr8GooglyMoogly" x:Name="myMap" />
    </Grid>
</UserControl>

对于那些想要使用 Windows Community Toolkit Map Control which is different from Bing Maps WPF Control 的人,您可以按照这些步骤使用 Windows Community Toolkit Map Control for Windows Forms.

注:Windows10(引入v10.0.17709.0)是先决条件

  1. 创建一个 Windows 表单应用程序(.NET Framework >=4.6.2 - 我自己尝试使用 4.7.2)

  2. 安装 Microsoft.Toolkit.Forms.UI.Controls NuGet 包。

  3. 添加一个app.manifest文件:右击项目→添加新项→选择应用程序清单文件(仅限Windows),位于常规节点下。

  4. 打开app.manifest文件,取消注释<!-- Windows 10 -->下的supportedOS:

    <!-- Windows 10 -->
    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
    
  5. 处理表单的 Load 事件并添加以下代码:

    private void Form1_Load(object sender, EventArgs e)
    {
        var map = new MapControl();
        map.Dock = DockStyle.Fill;
        map.MapServiceToken = "YOUR KEY";
        map.LoadingStatusChanged += async (obj, args) =>
        {
            if (map.LoadingStatus == MapLoadingStatus.Loaded)
            {
                var cityPosition = new BasicGeoposition() { 
                    Latitude = 47.604, Longitude = -122.329 };
                var cityCenter = new Geopoint(cityPosition);
                await map.TrySetViewAsync(cityCenter, 12);
            }
        };
        this.Controls.Add(map);
    }
    

    还要确保包括所需的用法:

    using Microsoft.Toolkit.Forms.UI.Controls;
    using Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT;
    

    注1:我无法在设计器中添加控件,因为当我试图在表单上删除控件时出现设计时异常,所以我决定使用在 运行 时间添加它。

    注2:需要Get a Key才能使用地图;但是出于测试目的,您可以忽略获取密钥。

  6. 运行你的申请,看看结果:

更多信息

要设置 Bing Maps WPF control, you can use SetView method. The method have different overloads, for example you can pass a Location 的视图(您根据所需位置的纬度和经度创建)和缩放级别,方法如下:

var location = new Location(47.604, -122.329);
this.userControl11.myMap.SetView(location, 12);

同样可以通过设置Center and ZoomLevel.

来实现

下载或克隆示例

您可以从这里下载或关闭工作示例:

分步示例 - 放大西雅图作为初始视图

  1. 按照 中的说明创建使用 WPF Bing Maps Control 的 Windows Forms 项目。

  2. 处理Form的Load事件,使用以下代码:

     private void Form1_Load(object sender, EventArgs e)
     {
         this.userControl11.myMap.AnimationLevel = AnimationLevel.Full;
         this.userControl11.myMap.Loaded += MyMap_Loaded;
     }
     private void MyMap_Loaded(object sender, System.Windows.RoutedEventArgs e)
     {
         var location = new Location(47.604, -122.329);
         this.userControl11.myMap.SetView(location, 12);
     }
    

    确保使用 using Microsoft.Maps.MapControl.WPF;.

因此,地图以西雅图为中心位置放大:

更多信息:

您可能想查看以下链接以获取更多信息: