bing maps: как установить уровень масштабирования, чтобы пользователи могли точно видеть текущее местоположение - PullRequest
2 голосов
/ 20 марта 2012

Я использую карты bing ajax v7, и для простоты скажем, у меня есть 10 PinPoints, размещенных по всему миру. Я пытаюсь увеличить масштаб карты до самого низкого уровня, чтобы ближайший PinPoint все еще был виден текущему местоположению пользователя. Если бы кто-то мог указать мне правильное направление, я был бы очень признателен.

$(document).ready(function () {
        var windowHeight = $(window).height();
        var windowWidth = $(window).width();

        map = new Microsoft.Maps.Map(document.getElementById("mapDiv"), {
            credentials: "myCredentials",
            backgroundColor: "#A4C4ED",
            zoom: 3,
            height: windowHeight,
            width: windowWidth
        });
        Microsoft.Maps.Events.addHandler(map, 'viewchange', hideInfoBox);
        Microsoft.Maps.Events.addHandler(map, 'click', hideInfoBox);

        //get users location and set view bound
        var geoLocationProvider = new Microsoft.Maps.GeoLocationProvider(map);
        var viewRectangle = Microsoft.Maps.LocationRect(geoLocationProvider.getCurrentPosition());
        map.setView({ bounds: viewRectangle });

        dataLayer = new Microsoft.Maps.EntityCollection();
        map.entities.push(dataLayer);

        var infoboxLayer = new Microsoft.Maps.EntityCollection();
        map.entities.push(infoboxLayer);

        //create initial infobox
        infobox = new Microsoft.Maps.Infobox(new Microsoft.Maps.Location(0, 0), {
            visible: false,
            offset: new Microsoft.Maps.Point(0, 20)
        });
        infoboxLayer.push(infobox);

        Microsoft.Maps.loadModule('Microsoft.Maps.Search', { callback: searchModuleLoaded });
    });

1 Ответ

3 голосов
/ 05 июня 2013

Я предполагаю, что вы - одна точка, и у вас есть еще 10 точек, которые находятся где-то на карте.

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

oLocation1 = {latitude:0,longitude:0};
oLocation2 = {latitude:19,longitude:23};


 function calcDistHaversine  (oLocation1, oLocation2) {
        var dLat = (oLocation2.latitude * Math.PI / 180 - oLocation1.latitude  * Math.PI / 180);//*Math.PI*180;
        var dLon = (oLocation2.longitude * Math.PI / 180 - oLocation1.longitude  * Math.PI / 180);//*Math.PI*180;
        var lat1 = oLocation1.latitude * Math.PI / 180;//*Math.PI*180;
        var lat2 = oLocation2.latitude  * Math.PI / 180;//*Math.PI*180;

        var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        var distance = 6371 * c;
        return distance;
    };

В результате вы получите расстояние между этими двумя точками относительно вашей кривизны земли.

Теперь у вас есть ваше местоположение и ближайшее местоположение.

Давайте назовем их своими.

Далее необходимо создать массив, содержащий эти два местоположения, преобразованные в объекты местоположения Microsoft.

  var yourLocation= new Microsoft.Maps.Location(your.latitude, your.longitude);
  var theirLocation= new Microsoft.Maps.Location(their.latitude, their.longitude);

  var arr = [];
  arr.push(yourLocation);
  arr.push(theirLocation);

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

var bestView = Microsoft.Maps.LocationRect.fromLocations(arrLocations);

Затем вы устанавливаете вид карты в соответствии с наилучшим видом, который мы нашли.

 setTimeout((function () {
        map.setView({ bounds: bestView });
    }).bind(this), 1000);
...