Home > Software engineering >  Zoom level by distance in Mapbox map for Xamarin.Forms
Zoom level by distance in Mapbox map for Xamarin.Forms

Time:04-21

Does anyone know how to select the correct zoom level so that two dots hit the screen?

I am using Mapbox and Xamarin.Forms.

In fact, there are more points, but the two most extreme are taken. Using them, I can get the center where the camera will look. Also, of course, I can get the distance between them. But here's how to calculate the specific zoom level (from 0 to 22), I have no idea.

Here is the zoom level documentation.

CodePudding user response:

I was helped by an article on Wikipedia, which some user left in the comments, but then for some reason deleted it. Here

The result is a method:

    public const double EARTH_EQUATORIAL_CIRCUMFERENCE_METTERS = 40075016.686; //Equatorial circumference of the Earth
    public const double C = EARTH_EQUATORIAL_CIRCUMFERENCE_METTERS;
    
    public static double CalculateZoomLevel(double lat, double distanceBetweenPoints)
    {
        double logNum = C * Math.Cos(MathHelper.DegreesToRadians(lat)) / distanceBetweenPoints;

        double zoomLvl = Math.Log(logNum, 2);

        return zoomLvl;
    }

It's not perfect, but a very good result. But there is a problem when the path between the points becomes horizontal. In order to avoid this problem, I make some modifications to the distance between the points:

    var distance = Distance.BetweenPositions(new Xamarin.Forms.Maps.Position(minLat, minLon),
                                             new Xamarin.Forms.Maps.Position(maxLat, maxLon)).Meters;

    if (Math.Abs(minLat - maxLat) < Math.Abs(minLon - maxLon))
    {
        distance  = distance * (Math.Abs(minLon - maxLon) / Math.Abs(minLat - maxLat) / 10);
    } 

    map.ZoomLevel = MapboxHelper.CalculateZoomLevel(zoomPos.Latitude, distance);

zoomPos - Center between two points.

Maybe someone will come in handy.

  • Related