Как я центрирую и показываю infobox в картах резкого звука?

Ответ Mark's является способом пойти, в конце концов, вот почему,/proc файловая система там. Для чего-то немного больше copy/pasteable:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
5
задан Csharp 25 April 2013 в 19:41
поделиться

1 ответ

После безумного поиска в Google я нашел решение и поделюсь им здесь, чтобы другие, надеюсь, не пережили того горя, через которое я прошел.

Я создал и включил в свой bing map с использованием чистого javascript, без решений sdk или iframe. В моем коде я генерирую javascript, чтобы добавить все контакты, которые хочу на карту, и вставляю его с помощью метки asp.net.

Если вы вызываете метод setCenter () на своей карте Bing, он должен мгновенно установите карту, сюрприз-сюрприз, на указанные вами координаты. И так ... в большинстве случаев. Однако иногда он решает перемещаться между точками. Если вы сделаете SetCenter, а затем ShowInfoBox, он будет отлично работать, если только он не решит панорамировать.

Решение? Будучи хорошими программистами, мы углубляемся в sdk, и он показывает, что есть события, к которым мы можем подключиться, чтобы с ними справиться. Существует событие onendpan, которое запускается после завершения панорамирования. Существует также событие onchangeview, которое срабатывает при скачке карты.

Итак, мы подключаемся к этим событиям и пытаемся отобразить информационное окно для нашей формы кнопки ... но ничего не происходит. Почему бы и нет?

Вы должны дать ему несколько миллисекунд, чтобы отдышаться, по неизвестным причинам, когда вызывается событие. Кажется, нормально использовать setTimeout с 10 миллисекундами. После этого ваше окно будет выглядеть великолепно.

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

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

Мое решение этой проблемы состоит в том, чтобы определить, перемещалась карта или нет, путем записи ее длинных / lat и с помощью другого метода setTimeout, определяющего, изменились ли они через 100 мс. Если они этого не сделали, отобразите информационное окно.

Есть и другие вещи, которые вам нужно отслеживать, поскольку я не могу видеть, как передавать параметры обработчикам событий, поэтому я использую для этого глобальные переменные javascript - вы должны знать какую форму кнопки вы показываете, а также отслеживайте предыдущие координаты карты, прежде чем проверять, изменились ли они.

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

// An array of our pins to allow panning to them
var myPushPins = [];

// Used by the eventhandler
var eventPinIndex;
var oldMapCenter;

// Zoom in and center on a pin, then show its information box
function ShowPushPin(pinIndex) {
    eventPinIndex = pinIndex;
    oldMapCenter = map.GetCenter();
    map.AttachEvent("onendpan", EndPanHandler);
    map.AttachEvent("onchangeview", ChangeViewHandler);
    setTimeout("DetectNoMapChange();", 200);

    map.SetZoomLevel(9);
    map.SetCenter(myPushPins[pinIndex].GetPoints()[0]);

}


function EndPanHandler(e) {
    map.DetachEvent("onendpan", EndPanHandler);

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10);

}

function ChangeViewHandler(e) {
    map.DetachEvent("onchangeview", ChangeViewHandler);

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10);

}

function DetectNoMapChange(centerofmap) {

    if (map.GetCenter().Latitude == oldMapCenter.Latitude && map.GetCenter().Longitude == oldMapCenter.Longitude) {
        map.ShowInfoBox(myPushPins[eventPinIndex]);
    }
}
4
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: