Карты Virtual Earth / Bing - как рассчитать лучший уровень масштабирования - PullRequest
1 голос
/ 07 ноября 2010

Я работаю над некоторыми картами и застрял с чем-то, что кажется довольно простым.

Суть того, что я делаю, это добавление 10 флагов на карту, и мне нужно динамически устанавливать уровень масштабирования и центр карты в зависимости от положения штифтов (карту нужно увеличивать до возможно пока показываю все контакты).

Это работает точно так же, как и ожидалось с MultiMap без какого-либо вмешательства (как и ожидалось), но карта Virtual Earth не играет хорошо. Если я не укажу ему центр широты / долготы, по умолчанию будут показаны все США.

Кто-нибудь может указать мне правильное направление, чтобы заставить это работать?

EDIT:

Хорошо, я смог рассчитать правильный центр, используя следующее в моем контроллере MVC

''# we're going to rock the AVERAGE LAT/LON here
Dim eventCount As Integer = 0
Dim totalLat As Double = 0
Dim totalLon As Double = 0
For Each mel In MapEventList
    totalLat += mel.lat
    totalLon += mel.lon
    eventCount += 1
Next
ViewData("centerLat") = totalLat / eventCount
ViewData("centerLon") = totalLon / eventCount

Теперь я застрял, пытаясь вычислить Лучший уровень масштабирования

РЕДАКТИРОВАТЬ 2:

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

$(document).ready(function () {
    // Load the Bing Map and populate it
    var increment = 0; // used to increment event locations
    var sumLat = 0; // used to find the average LAT location
    var sumLon = 0; // used to find the average LON location

    // Load the initial map
    LoadMap();

    // loop through all events and place a point on the map
    // also add to the sumLat and sumLon variable
    $.each(json_object, function () {
        increment = ++increment;
        sumLat = sumLat + this.lat;
        sumLon = sumLon + this.lon;
        LoadPoint(this.lat, this.lon, this.title, this.desc, increment);
    });

    // find the averate Lat and Lon for map centering
    var centerLat = sumLat / increment;
    var centerLon = sumLon / increment;
    LatLon = new VELatLong(centerLat, centerLon);

    // Set the new map Center based on the average of all points.
    map.SetCenter(LatLon)
});

function LoadMap() {
    map = new VEMap('bingMap');
    mapOptions = new VEMapOptions

    // sets map options for asthetics
    mapOptions.DashboardColor = "black";
    mapOptions.EnableDashboardLabels = false;
    mapOptions.EnableBirdseye = false;
    mapOptions.EnableDashboardLabels = false;

    // Load the initial map
    // note: the LatLon is "null" at this point because we are going to 
    // center the map later based on the average of all points.
    map.LoadMap(null, zoomLevel, null, null, null, false, null, mapOptions);

};

function LoadPoint(lat, lon, title, desc, pinId) {
    var point = new VELatLong(lat, lon);
    var pin = new VEShape(VEShapeType.Pushpin, point);
    pin.SetTitle(title);
    pin.SetDescription(desc + "<br /><br />lat: " + lat + " lon: " + lon);
    pin.SetCustomIcon("<div class='pinStyle'><div class='pinText'>" + pinId + "</div></div>");
    map.AddShape(pin);
};

Однако я все еще пытаюсь рассчитать лучший уровень масштабирования

Ответы [ 3 ]

3 голосов
/ 10 ноября 2010

Если вы используете версию javascript, то вам не нужно рассчитывать ее, вы можете напрямую присвоить массив объектов VELatLong VEMap.SetMapView , и он будет центрироваться + масштабироваться так, чтобы все контакты видны.

1 голос
/ 07 ноября 2010

, когда у меня была похожая проблема, я решил ее с помощью расчета (грубого) центра масс для штифтов.Я говорю «грубо», потому что я просто усреднил широту / долготу для каждой точки, и это неправильно, поскольку Земля - ​​это сфера.

0 голосов
/ 10 ноября 2010

Большое спасибо @ wildpeaks за ответ. Я разместил свои результаты здесь для тех, кому нужно подтолкнуть в правильном направлении.

$(document).ready(function () {
    // Load the Bing Map and populate it
    var increment = 0; // used to increment event locations
    var sumLat = 0; // used to find the average LAT location
    var sumLon = 0; // used to find the average LON location
    var latlonArray = new Array();  // used to create an Array of lat and lon in order to "SetMapView"

    // Load the initial map
    LoadMap();

    // loop through all events and place a point on the map
    // also add to the sumLat and sumLon variable
    $.each(json_object, function () {
        latlonArray[increment] = new VELatLong(this.lat, this.lon); // Add to the array before the increment
        increment = ++increment;
        sumLat = sumLat + this.lat;
        sumLon = sumLon + this.lon;
        LoadPoint(this.lat, this.lon, this.title, this.desc, increment);
    });

    // find the averate Lat and Lon for map centering
    var latlonCenter = new VELatLong(sumLat / increment, sumLon / increment);

    // Set the new map Center based on the average of all points.
    map.SetCenter(latlonCenter);
    map.SetMapView(latlonArray); // pass the latlonArray object to the SetMapView in order to display all map pins appropriately.

});
...