Учитывая набор местоположений, как я могу определить соответствующий уровень масштабирования и центр карты для карт 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/