Здесь / Маркеры Nokia Map не всегда отображаются

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

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

Вот сценарий (с примерами маркеров, чтобы показать проблему): http://jsfiddle.net/amnesia7/9YUVe/embedded/result/, используя следующие местоположения маркеров:

// Add markers to the map for each location
addMarker(1, "Hello 1", [-18,178.333]);
addMarker(2, "Hello 2", [-18.5,180]);
addMarker(3, "Hello 3", [-18.5,-178.333]);

Автоматическое масштабирование пошло совсем не так, и кажется, что где-то море увеличено.

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


ОБНОВЛЕНИЕ

Я создал, надеюсь, более простую версию, используя демонстрацию ЗДЕСЬ для разработчиков для «Приблизить к набору маркеров».

http://jsfiddle.net/amnesia7/uhZVz/

Вам необходимо уменьшить масштаб карты, чтобы увидеть маркеры, которые должны быть видны по умолчанию.

Спасибо


person user1116573    schedule 28.11.2012    source источник


Ответы (1)


Мне это тоже кажется ошибкой, и возникает только тогда, когда маркеры группируются вокруг 180-й линии долготы. Похоже, что расчет zoomTo () в этом случае неверен, учитывается только последний маркер, поскольку он находится на «неправильной» стороне международной линии даты.

В любом случае, getWidth () в области просмотра, похоже, работает, поэтому вы можете взломать свою собственную функцию zoomTo (), как показано в kludge ниже.

Также обратите внимание на использование kml = auto & map = js-p2d-dom при загрузке библиотеки - здесь используется реализация DOM, а не реализация холста, это правильно показывает маркеры с обеих сторон 180-й линии долготы.

<!DOCTYPE HTML SYSTEM>
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=7; IE=EmulateIE9" />

        <style type="text/css">

            html {
                overflow:hidden;
            }

            body {
                margin: 0;
                padding: 0;
                overflow: hidden;
                width: 100%;
                height: 100%;
                position: absolute;
            }

            #mapContainer {
                width:100%;
                height: 100%;
                left: 0;
                top: 0;
                position: absolute;
            }

 </style>
   <script type="text/javascript" charset="UTF-8" src="http://api.maps.nokia.com/2.2.3/jsl.js?kml=auto&map=js-p2d-dom"></script>
    </head>
    <body>
        <div id="mapContainer"></div>

    <script type="text/javascript">
 /*    Set authentication token and appid
*    WARNING: this is a demo-only key
*    please register on http://api.developer.nokia.com/
*    and obtain your own developer's API key
*/
nokia.Settings.set("appId", "APP_ID");
nokia.Settings.set("authenticationToken", "TOKEN");


// Get the DOM node to which we will append the map
var mapContainer = document.getElementById("mapContainer");
// Create a map inside the map container DOM node
var map = new nokia.maps.map.Display(mapContainer, {
    // initial center and zoom level of the map
    center: [52.51, 13.4],
    zoomLevel: 13,
    components: [
        // We add the behavior component to allow panning / zooming of the map
        new nokia.maps.map.component.Behavior()
    ]
});


// We create an instance of Container to store markers per city
var myContainer = new nokia.maps.map.Container();

/* We add all of the city containers to map's object collection so that
 * when we add markers to them they will be rendered onto the map
 */
map.objects.add(myContainer);

// We create several of marker for a variety of famous landmarks
var firstMarker = new nokia.maps.map.StandardMarker(
        [-18, 178.333],
        { text: 1 }
    ),
    secondMarker = new nokia.maps.map.StandardMarker(
        [-18.5, 180],
        { text: 2 }
    ),
    thirdMarker = new nokia.maps.map.StandardMarker(
        [-18.5, -178.333],
        { text: 3 }
    );

// Add the newly created landmakers per city to its container
myContainer.objects.addAll([firstMarker, secondMarker, thirdMarker]);

/* Now we calculate the bounding boxes for every container.
 * A bounding box represents a rectangular area in the geographic coordinate system.
 */
var myBoundingBox = myContainer.getBoundingBox();


zoom = 1;
map.setCenter(myBoundingBox.getCenter());
map.setZoomLevel(zoom);


while (map.getViewBounds().getWidth() >  myBoundingBox.getWidth())   {
    zoom++;
    map.setZoomLevel(zoom); 
}
zoom--
map.setZoomLevel(zoom--);

</script>

    </body>
</html>
person Jason Fox    schedule 18.12.2012
comment
Спасибо, Джейсон, я попробую, хотя использование dom, а не canvas отрицательно повлияет на мобильное использование, поэтому я мог бы разобраться с этим, как я уверен, Nokia сделала бы. Вы знаете, где сообщить об ошибке, потому что на developer.here.net/faqs написано, что я думаю, что я обнаружили ошибку. Как мне сообщить об этом? но на самом деле нет ссылки на доску обсуждений, чтобы опубликовать отчет об ошибке. - person user1116573; 18.12.2012
comment
Привет, Джейсон Фокс, ваше предложение сработало, но я действительно не хочу принимать ваш ответ, пока не узнаю о проблеме (холст, не отображающий правильные маркеры при перемещении карты влево и вправо, и неправильная функция zoomTo) добавляется в отчет об ошибке где-то. - person user1116573; 21.12.2012
comment
@ user1116573 Первоначальная ошибка (JSLA-3074) возникла внутри компании много месяцев назад. Чего не хватает на данный момент, так это механизма публикации этих отчетов об ошибках. Я поднял вторую внутреннюю ошибку (DEVPRES-10) специально, чтобы попытаться устранить этот пробел. - person Jason Fox; 21.12.2012
comment
Джейсон Фокс, я принял ваш ответ, но удивлен, что исправление ошибок занимает так много времени. Есть ли где-нибудь, где я могу подписаться на получение уведомлений о выпусках новых версий API, чтобы я мог поддерживать свое приложение в актуальном состоянии по мере исправления ошибок (например, в блоге), не беспокоясь о повторных проверках на веб-сайте разработчика? - person user1116573; 22.12.2012
comment
Джейсон Фокс, ему также нужно if (zoom > 17) { break; } в while loop перед zoom++;, чтобы он не пытался слишком сильно увеличивать масштаб, что приводит к его поломке. (Я только что сам выбрал 17, думаю, вы можете увеличить масштаб немного дальше, не нарушая его. - person user1116573; 19.01.2013
comment
Эта ошибка наконец-то исправлена ​​в выпуске Enterprise 2.5.0. Исправление также будет включено в эквивалентную версию Public 2.5.0, когда она выйдет в эфир. - person Jason Fox; 02.05.2013
comment
Спасибо, Джейсон Фокс, приятно слышать. Поскольку у нас только версия 2.2.4, я предполагаю, что пройдет некоторое время, прежде чем 2.5.0 выйдет в широкий мир, но с нетерпением жду этого. - person user1116573; 02.05.2013