UWP MapControl突出显示国家/地区

时间:2018-03-19 23:04:11

标签: c# xaml uwp maps

我正在写一个小应用程序,它将收到一个国家代码(2个ISO字母)和一个州代码(也是2个字母ISO代码)。

我想强调(和颜色)这两个信息指定的区域(所以我们说“CA,QC”,将突出加拿大魁北克省)

我不需要任何其他东西(好吧,也许是FadeIn,FadeOut动画,但我稍后会想到这个)

所有缩放/点按/点击/其他操作都被阻止。

MapControl声明非常简单:

<maps:MapControl Grid.Row="1" x:Name="myMap" ZoomLevel="0"/>

提前致谢

编辑:经过大量研究,从以下答案的帮助,我很惊讶BASIC行动不是微软平台的一部分。那太疯狂了。所有后端都在不到30分钟内编码(包括身份验证,列出属性,检查访问级别,设置SignalR回调),但在可视化方面,我们没有来自UWP平台。那太伤心了。 /再见UWP,我试过了。多次。

编辑2:使其适用于一些调整:

 if (feature != null && (feature.Geometry.Type == GeoJSONObjectType.Polygon) || (feature.Geometry.Type == GeoJSONObjectType.MultiPolygon))
                {
                    myMap.MapElements.Clear();
                    MapPolygon polygon = null;
                    if (feature.Geometry.Type == GeoJSONObjectType.Polygon)
                    {
                        var polygonGeometry = feature.Geometry as Polygon;
                        polygon = new MapPolygon
                        {
                            Path = new Geopath(polygonGeometry.Coordinates[0].Coordinates.Select(coord => new BasicGeoposition() { Latitude = coord.Latitude, Longitude = coord.Longitude })),
                            FillColor = Colors.DarkRed
                        };
                        myMap.MapElements.Add(polygon);
                    }
                    else
                    {
                        var ploy = (feature.Geometry as MultiPolygon);
                        foreach (var item in ploy.Coordinates)
                        {
                            var polygon1 = new MapPolygon
                            {
                                Path = new Geopath(item.Coordinates[0].Coordinates.Select(coord => new BasicGeoposition() { Latitude = coord.Latitude, Longitude = coord.Longitude })),
                                FillColor = Colors.DarkRed
                            };
                            myMap.MapElements.Add(polygon1);
                        }
                    }


                }

1 个答案:

答案 0 :(得分:1)

没有内置的方法可以实现这一点,因此您必须执行一些额外的步骤才能实现此目的。

首先,您需要下载基于geojson的数据集,其中包含所有国家/地区的多边形定义。可以找到一个轻量级且功能齐全的here on GitHub

现在您需要将NuGet中的GeoJSON.NET软件包安装到项目中,并将已下载的.geojson文件包含在项目中,例如Assets文件夹中。确保构建操作设置为内容

现在,您可以使用此类代码通过创建MapPolygon并将其放置在地图上来突出显示某个国家/地区:

private FeatureCollection _countryPolygons = null;

private async void HighlightClick(string country)
{
    if (_countryPolygons == null)
    {
        _countryPolygons = JsonConvert.DeserializeObject<FeatureCollection>(
            await FileIO.ReadTextAsync(
                await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/countries.geojson",
                    UriKind.Absolute))));
    }

    var feature = _countryPolygons.Features.FirstOrDefault(f =>
        f.Id.Equals(country, StringComparison.CurrentCultureIgnoreCase));

    if (feature != null && feature.Geometry.Type == GeoJSONObjectType.Polygon)
    {
        var polygonGeometry = feature.Geometry as Polygon;
        MapPolygon polygon = new MapPolygon();
        polygon.Path = new Geopath(polygonGeometry.Coordinates[0].Coordinates.Select(coord => new BasicGeoposition() { Latitude = coord.Latitude, Longitude = coord.Longitude }));
        polygon.FillColor = Colors.DeepSkyBlue;
        Map.MapElements.Clear();
        Map.MapElements.Add(polygon);
    }
}