Учитывая набор местоположений, как я могу определить соответствующий уровень масштабирования и центр карты для карт Bing?

Я работаю над приложением Магазина Windows (C#), используя Bing Maps.

Я хочу иметь возможность, учитывая набор Locations (пары широты и долготы), определить, каким должен быть уровень масштабирования для карты и какой должна быть ее центральная точка (Location).

Из коллекции значений Location я извлекаю четыре "крайних" кардинальных точки, которые необходимо отобразить (самый дальний север, юг, восток и запад).

Итак, если я хочу отображать кнопки в Сан-Франциско, я хочу, чтобы уровень масштабирования отображал только этот город и ничего более. Если я хочу показать кнопки, разбросанные по всей территории США,... вы получите картину.

Это то, что у меня есть (только черновик / псевдокод, как вы можете видеть):

Определите крайние кардинальные значения набора Локаций (код не показан; должен быть тривиальным). Создайте экземпляр моего пользовательского класса:

public class GeoSpatialBoundaries
{
    public double furthestNorth { get; set; }
    public double furthestSouth { get; set; }
    public double furthestWest { get; set; }
    public double furthestEast { get; set; }
}

... затем вызовите эти методы, передав этот экземпляр:

// This seems easy enough, but perhaps my solution is over-simplistic
public static Location GetMapCenter(GeoSpatialBoundaries gsb)
{
    double lat = (gsb.furthestNorth + gsb.furthestSouth) / 2;
    double lon = (gsb.furthestWest + gsb.furthestEast) / 2;
    return new Location(lat, lon);
}

// This math may be off; just showing my general approach
public static int GetZoomLevel(GeoSpatialBoundaries gsb)
{
    double latitudeRange = gsb.furthestNorth - gsb.furthestSouth;
    double longitudeRange = gsb.furthestEast - gsb.furthestWest;
    int latZoom = GetZoomForLat(latitudeRange);
    int longZoom = GetZoomForLong(longitudeRange);
    return Math.Max(latZoom, longZoom);
}

Здесь я действительно теряюсь. Как определить уровень масштабирования для возврата (между 1..20) на основе этих значений? Вот очень грубая идея (GetZoomForLat() в основном то же самое):

// Bing Zoom levels range from 1 (the whole earth) to 20 (the tippy-top of the cat's whiskers)
private static int GetZoomForLong(double longitudeRange)
{
    // TODO: What Zoom level ranges should I set up as the cutoff points? IOW, should it be something like:
    if (longitudeRange > 340) return 1;
    else if (longitudeRange > 300) return 2;
    // etc.? What should the cutoff points be?
    else return 1;
}

Есть ли у кого-нибудь предложения или ссылки, которые могут указать мне, как реализовать эти функции?

2 ответа

Решение

Вы можете использовать LocationRect класс для установки ограничительной рамки, см. MSDN:

http://msdn.microsoft.com/en-us/library/hh846491.aspx

Затем вы используете Map класс и его SetView() метод, см. MSDN:

http://msdn.microsoft.com/en-us/library/hh846504.aspx

Вот код, который будет работать (где map ваш экземпляр управления картой):

var collection = new LocationCollection();
collection.Add(new Location(47.5, 2.75));
collection.Add(new Location(48.5, 2.75));
collection.Add(new Location(43.5, 5.75));
map.SetView(new LocationRect(collection));

Таким образом, вы можете использовать все координаты элементов, которые вы хотите отобразить на вашей карте в коллекции, чтобы создать ограничивающий прямоугольник и соответственно настроить вид.

Я написал пост в блоге о том, как это сделать, здесь: http://rbrundritt.wordpress.com/2009/07/21/determining-best-map-view-for-an-array-of-locations/

Другие вопросы по тегам