Отображение авторских прав на карты в API GMaps V3

В настоящее время я переношу приложение из GMaps V2 в V3. Поскольку я использую OSM и другие слои, отличные от Google, я хочу сохранить уведомление об авторских правах в правом нижнем углу. Но справочная документация не дает никаких намеков на это. В V2 авторское право даже имело свой собственный класс GCopyrightCollection и было передано GTileLayer. Игровая площадка Google Code также не является примером для V3.

Кто-нибудь знает, как это сделать в новом API?

Ответ 1

Список рассылки помог мне в этом вопросе (см. thread). Существует образец кода в Google Code для коллекций авторских коллекций и как отобразить их в правом нижнем углу карты DIV.

Как есть проблема с компоновкой пользовательского DIV в нижнем правом углу (только при перетаскивании карты только в правильное положение, проблема самого API GMaps), теперь я показываю его в левом нижнем углу. ( ОБНОВЛЕНИЕ: Проблема кажется исправленной в API!)

Следующий код работает как ожидалось (конечно, я не использую глобальные переменные, удаленный this. для ясности):

copyrightDiv = document.createElement("div")
copyrightDiv.id = "map-copyright"
copyrightDiv.style.fontSize = "11px"
copyrightDiv.style.fontFamily = "Arial, sans-serif"
copyrightDiv.style.margin = "0 2px 2px 0"
copyrightDiv.style.whiteSpace = "nowrap"
map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(copyrightDiv)

copyrights = {}
copyrights["OSM"] = "<a target=\"_blank\" href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>"
copyrights["Osmarender"] = copyrights["OSM"]
copyrights["Cloudmade"] = "<a target=\"_blank\" href=\"http://cloudmade.com/\">CloudMade</a> - Map data <a target=\"_blank\" href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CCBYSA</a>"
copyrights["Cloudmade-Fine"] = copyrights["Cloudmade"]

function onMapTypeIdChanged()
{
    newMapType = map.getMapTypeId()

    copyrightDiv = document.getElementById("map-copyright")
    if(newMapType in copyrights)
        copyrightDiv.innerHTML = copyrights[newMapType]
    else
        copyrightDiv.innerHTML = ""
}

google.maps.event.addListener(map, "maptypeid_changed", onMapTypeIdChanged)

// Call once so that the correct copyright notice is set for
// the initially selected map type
setTimeout(onMapTypeIdChanged, 50)

Ответ 2

Решение AndiDog сильно вдохновило меня. Но есть некоторые недостатки - авторское право, построенное таким образом, не имеет такой приятной полупрозрачности стандартного авторского права google. Было бы очень сложно сконструировать его для поддержки всех браузеров и т.д., Поэтому я использую другую стратегию - найдите текст "Условия использования" в DOM и поместите свой текст авторского права перед ним в div, созданный Google. Кроме того, я улучшил функцию до для пользовательских логотипов, как в мой вопрос здесь:

function gmaps3_copyright(map, copyrights, logos)
{
        var copyrightDiv, logoDiv;
        var google_div__span_created = 0;

        logoDiv = document.createElement("div");
        logoDiv.index = 0; // used for ordering 
        map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(logoDiv);

        function onMapTypeIdChanged()
        {
                newMapType = map.getMapTypeId()

                if (!google_div__span_created) { // hack into google div - prefered solution
                        copyrightDiv = document.createElement("span");
                        $(copyrightDiv).insertBefore(
                                $('#mainMap :contains("Terms of Use")')
                                .filter(function() { return $(this).children().length < 1 })
                        );
                        google_div__span_created = 1;
                }

                if (newMapType in copyrights)
                        copyrightDiv.innerHTML = copyrights[newMapType] + ' - '
                else
                        copyrightDiv.innerHTML = ""

                if (newMapType in logos)
                        logoDiv.innerHTML = logos[newMapType]
                else
                        logoDiv.innerHTML = ""

        }

        google.maps.event.addListener(map, "maptypeid_changed", onMapTypeIdChanged);

        // Call once so that the correct copyright notice is set for
        // the initially selected map type
        // but wait until the complete html markup is loaded
        google.maps.event.addListener(map, 'tilesloaded', function () {
                setTimeout(onMapTypeIdChanged, 50);
                // still add some timeout to be 100% sure
        })
}

просто назовите его следующим образом:

gmaps3_copyright(map,
    {
        'OSM': '&copy; <a href="#" onclick="location.href='http://www.openstreetmap.org/'; return false;" target="_blank">OpenStreetMap</a> contributors, <a href="#" onclick="location.href='http://creativecommons.org/licenses/by-sa/2.0/'; return false;" target="_blank">CC-BY-SA</a>',
         'Cloudmade' : "<a target=\"_blank\" href=\"http://cloudmade.com/\">CloudMade</a> - Map data <a target=\"_blank\" href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CCBYSA</a>"
    },
    {
         'OSM': // logo html code here
    }
)

Вам может потребоваться изменить строку "Условия использования" для вашей локализации.