如何在xamarin表单地图中动态设置缩放级别



我想在加载Xamarin Form Map时动态设置地图的缩放级别。我正在尝试使用"使用地图"。缩放级别在滑块值更改时在代码中起作用。

slider.ValueChanged += (sender, e) => {
var zoomLevel = e.NewValue; // between 1 and 18
var latlongdegrees = 360 / (Math.Pow(2, zoomLevel));
// // Debug.WriteLine(zoomLevel + " -> " + latlongdegrees);
if (map.VisibleRegion != null)
map.MoveToRegion(new MapSpan(map.VisibleRegion.Center, latlongdegrees, latlongdegrees));
};

但当地图加载到设备上时,我想删除滑块并设置缩放级别16.71,不想使用滑块。我该怎么做这个

我使用的完整代码

map = new Map
{
//IsShowingUser = true,
HeightRequest = 100,
WidthRequest = 960,
VerticalOptions = LayoutOptions.FillAndExpand,
MapType=MapType.Street,
};
// map.MoveToRegion(new MapSpan(new Position(28.6587067, 77.14514),360,360));
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(28.6587067, 77.14514), Distance.FromMiles(3)));
var position = new Position(28.6587067, 77.14514);
var pin = new Pin
{
Type = PinType.Place,
Position = position,
Label = "xx"
//,
//Address = "We are here"
};
map.Pins.Add(pin);
// var latlongdegrees = 360 / (Math.Pow(2, 17.51));
//if (map.VisibleRegion != null)
//   map.MoveToRegion(new MapSpan(map.VisibleRegion.Center, latlongdegrees, latlongdegrees));
// add the slider
var slider = new Slider(16, 18, 1);
slider.ValueChanged += (sender, e) => {
var zoomLevel = e.NewValue; // between 1 and 18
var latlongdegrees = 360 / (Math.Pow(2, zoomLevel));
// // Debug.WriteLine(zoomLevel + " -> " + latlongdegrees);
if (map.VisibleRegion != null)
map.MoveToRegion(new MapSpan(map.VisibleRegion.Center, latlongdegrees, latlongdegrees));
};

// create map style buttons
var street = new Button { Text = "Street" };
var hybrid = new Button { Text = "Hybrid" };
var satellite = new Button { Text = "Satellite" };
street.Clicked += HandleClicked;
hybrid.Clicked += HandleClicked;
satellite.Clicked += HandleClicked;
var segments = new StackLayout
{
Spacing = 30,
HorizontalOptions = LayoutOptions.CenterAndExpand,
Orientation = StackOrientation.Horizontal,
Children = { street, hybrid, satellite }
};

// put the page together
var stack = new StackLayout { Spacing = 0 };
stack.Children.Add(map);
stack.Children.Add(slider);
stack.Children.Add(segments);
Content = stack;

// for debugging output only
map.PropertyChanged += (sender, e) => {
Debug.WriteLine(e.PropertyName + " just changed!");
if (e.PropertyName == "VisibleRegion" && map.VisibleRegion != null)
CalculateBoundingCoordinates(map.VisibleRegion);
};

实际上它很简单:

  • 假设MyMap是地图的对象参考,则可以使用MoveToRegion方法设置缩放级别:

    MyMap.MoveToRegion(MapSpan.FromCenterAndRadius(
    new Position(39,-132), Distance.FromMiles(2))); // accepts position, distance
    
  • 上面的这个例子将地图移动到一个位置,并尝试在视口中放置大约两英里,或者你可以通过指定"纬度"one_answers"经度"来创建一个"跨度",如下所示:

    new MapSpan(new Position(30.235, -97.733), 0.05, 0.05)
    
  • 当指定"纬度度数"one_answers"经度度数"时,您可以将其转换为更简单的值(例如,介于1和18之间的范围(

    var zoomLevel = 5; // pick a value between 1 and 18
    var latlongdeg = 360 / (Math.Pow(2, zoomLevel));
    map.MoveToRegion(new MapSpan (map.VisibleRegion.Center, latlongdeg, latlongdeg));
    
  • 注意使用VisibleRegion.Center属性意味着在缩放级别更改时,地图将保持在当前位置的中心。

更新:

在你定义了新的地图对象之后,你需要这样做:

map = new Map
{
//IsShowingUser = true,
HeightRequest = 100,
WidthRequest = 960,
VerticalOptions = LayoutOptions.FillAndExpand,
MapType=MapType.Street,
};
var zoomLevel = 16.71; // pick a value between 1 and 18
var latlongdeg = 360 / (Math.Pow(2, zoomLevel));
map.MoveToRegion(new MapSpan (map.VisibleRegion.Center, latlongdeg, latlongdeg));

最新更新