Skip to main content
 首页 » 编程设计

c#之如何居中/设置 map 缩放以覆盖 Xamarin.Forms 上可见的所有标记

2024年01月31日35haluo1

我正在为我的 map 设置多个标记

我可以静态设置缩放级别和中心

但我想要的是将所有标记居中并缩放级别以填充所有可见标记

我可以使用接收 MapSpan 的 Gmaps.MoveToRegion 方法。问题是,我不知道如何计算显示所有标记所需的 MapSpan。

我正在使用 Xamarin.Forms.Maps 和 Xam.Plugin.MapExtend.Abstractions

提前致谢!

请您参考如下方法:

首先你需要在你的android项目中添加自定义 map 渲染,它会继承MapRenderer, GoogleMap.IInfoWindowAdapter

    public class MyMapRenderer : MapRenderer, GoogleMap.IInfoWindowAdapter 

我添加了 2 个私有(private)字段

    private GoogleMap _map; 
    private LatLngBounds.Builder _builder; 

在构造函数中初始化你的_builder:

    public MyMapRenderer(Context context) : base(context) 
    { 
        _builder = new LatLngBounds.Builder(); 
    } 

当覆盖 OnMapReady 方法时,将 GoogleMap 属性设置为:

    protected override void OnMapReady(GoogleMap map) 
    { 
        base.OnMapReady(map); 
 
        NativeMap.InfoWindowClick += OnInfoWindowClick; 
        NativeMap.SetInfoWindowAdapter(this); 
        if (_map == null) 
        { 
            _map = map; 
        } 
    } 

并且您需要覆盖 CreateMarker 方法以便更改缩放级别

    protected override MarkerOptions CreateMarker(Pin pin) 
    { 
        var p = (THHPin)pin; 
 
        var marker = new MarkerOptions(); 
        LatLng position = new LatLng(pin.Position.Latitude, pin.Position.Longitude); 
        marker.SetPosition(position); 
        marker.SetTitle(pin.Label); 
        marker.SetSnippet(pin.Address); 
 
        _builder.Include(position); 
        LatLngBounds bounds = _builder.Build(); 
 
        CameraUpdate cu = CameraUpdateFactory.NewLatLngBounds(bounds, 20); 
 
        _map.MoveCamera(cu); 
        return marker; 
    }