0

我今天来谈谈地图的瓷砖!

对于个人项目和我公司的项目,我需要自定义很多我的 Xamarin.Forms.Maps。我在 Xamarin.Forms 中找到了本教程Custom Map Tiles,它只讨论了 Android 和 iOS(再讲一次......)但是,我很想知道它对 WinPhone 8.1 和/或 UWP 的工作原理。

另外,因为它使用Mapbox,我想知道这个项目是否真的可以长期使用?(我只要求那些对这个项目有所了解的人,因为我不知道只是通过阅读)。

据我所知,存在一些关于它的 nuget 包,但没有制作我真正想要的(我想在每个平台上定制瓷砖)

如果你有一个关于它的网站,或者你已经做过,你能给我一些指导或任何帮助吗?谢谢 !

编辑 1

我为 UWP 渲染器找到了此代码,但它不会更改地图图块..

[assembly: ExportRenderer(typeof(CustomMap), typeof(CustomMapRenderer))]
namespace MapTileProject.UWP.Renderer
{
    public class CustomMapRenderer : MapRenderer
    {
        CustomMap customMap;
        MapControl mapControl;

        protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                customMap = e.NewElement as CustomMap;
                mapControl = Control as MapControl;

                UpdateTiles();
            }
        }

        private void UpdateTiles()
        {
            Debug.WriteLine("BEGINING !");
            HttpMapTileDataSource dataSource = new HttpMapTileDataSource(customMap.MapTileTemplate);
            MapTileSource tileSource = new MapTileSource(dataSource);
            mapControl.TileSources.Add(tileSource);
            Debug.WriteLine("END !");
        }
    }
}
4

1 回答 1

1

为 UWP 渲染器找到此代码,但它不会更改地图图块

如果您使用 Fiddler 检查 Web 请求,您将看到请求 API URL 不正确: 在此处输入图像描述

参考来自瓦片源的叠加瓦片

UWP 中的标准 HttpMapTileDataSource 应该是这样的:

http://www.web服务名称.com/z={zoomlevel}&x={x}&y={y}

它包括 X 和 Y 坐标和缩放级别的三个可替换参数:{zoomlevel}{x}{y}

所以我们需要先转换你的MapTileTemplate字符串:

[assembly: ExportRenderer(typeof(CustomMap), typeof(CustomMapRenderer))]
namespace MapTileProject.UWP.Renderers
{
    public class CustomMapRenderer : MapRenderer
    {
        CustomMap customMap;
        MapControl mapControl;

        protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                customMap = e.NewElement as CustomMap;
                mapControl = Control as MapControl;

                UpdateTiles();
            }
        }
        /// <summary>
        /// Convert MapTileTemplate string to fit UWP HttpMapTileDataSource
        /// </summary>
        /// <param name="mapTileTemplate"></param>
        /// <returns></returns>
        private string GetTileTemplateForUWP(string mapTileTemplate)
        {
            return mapTileTemplate.Replace("{z}", "{zoomlevel}");
        }

        private void UpdateTiles()
        {
            Debug.WriteLine("BEGINING !");
            HttpMapTileDataSource dataSource = new HttpMapTileDataSource(GetTileTemplateForUWP(customMap.MapTileTemplate));
            MapTileSource tileSource = new MapTileSource(dataSource);
            mapControl.TileSources.Add(tileSource);
            Debug.WriteLine("END !");
        }
    }

}

截屏: 在此处输入图像描述

于 2016-07-18T06:33:03.040 回答