Я думаю, что этот вопрос был связан с Google Maps v2, так как я не думаю, что есть тип: G_SATELLITE_3D_MAP в v3.
Плагин Google Планета Земля для Google Maps v3 (бета) поддерживается через скрипт из google-maps-utility-library-v3 (googleearth.js)
Подход, использованный автором @ jlivni , заключается в прослушивании Google Maps v3 add/ удалить события и добавить соответствующие объекты Google Earth Api.Я считаю, что аналогичный подход может быть использован с OpenLayers.Я новичок в OpenLayers и только начал изучать это, но я опубликую обновленный здесь.
Единственное, что я могу добавить сейчас, это об инициализации плагина Google Планета Земля, который отличается от v3:
function GoogleEarth( olmap ) {
this.olmap_ = olmap;
this.layer_ = new OpenLayers.Layer.Google(
"Google Earth",
{type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22, visibility: false}
);
this.olmap_.addLayers([ this.layer_ ]);
this.map_ = this.layer_.mapObject;
this.mapDiv_ = this.map_.getDiv();
...
var earthMapType = /** @type {google.maps.MapType} */({
tileSize: new google.maps.Size(256, 256),
maxZoom: 19,
name: this.earthTitle_,
// The alt helps the findMapTypeControlDiv work.
alt: this.earthTitle_,
getTile:
/**
* @param {google.maps.Point} tileCoord the tile coordinate.
* @param {number} zoom the zoom level.
* @param {Node} ownerDocument n/a.
* @return {Node} the overlay.
*/
function(tileCoord, zoom, ownerDocument) {
var div = ownerDocument.createElement('DIV');
return div;
}
});
this.map_.mapTypes.set(GoogleEarth.MAP_TYPE_ID, earthMapType);
this.layer_.type = GoogleEarth.MAP_TYPE_ID;
var that = this;
google.maps.event.addListener(map, 'maptypeid_changed', function() {
that.mapTypeChanged_();
});
}
Запутанная часть заключается в том, что нам нужно определить новый тип карты для Google Earth и добавить этот тип к объекту Google Map.Но объект Google Map не существует, если мы не создадим слой с типом, который я изначально установил как google.maps.MapTypeId.SATELLITE.Не очень чистый, но, по крайней мере, он приводит меня в то же состояние, что и автор этого поста, с Google Maps v3.Наконец, может быть способ сделать элементы управления OpenLayers видимыми, изменив функцию findMapTypeControlDiv _ ():
var mapTypeControlDiv = this.findMapTypeControlDiv_();
if (mapTypeControlDiv) {
this.setZIndexes_(mapTypeControlDiv);
this.addShim_(mapTypeControlDiv);
}
[Update]
Я изменил функцию findMapTypeControlDiv_ (), и теперь я смотрювместо этого для OpenLayers LayerSwitcher:
GoogleEarth.prototype.findLayerSwitcherDiv_ = function() {
// var title = 'title="' + this.earthTitle_ + '"';
var id = 'LayerSwitcher';
var siblings = this.controlDiv_.parentNode.childNodes;
for (var i = 0, sibling; sibling = siblings[i]; i++) {
if (sibling.id.indexOf(id) != -1) {
return sibling;
}
}
};
Правильно установлен индекс z LayerSwitcher, и div отображается сверху, пока не будет вызван google.earth.createInstance (), а затем исчезнет.Я потрачу на это больше времени, это не сложно решить.
[Обновление 2]
Я работал над проблемой панели LayerSwitcher.Хитрость заключалась в том, чтобы прикрепить div плагина Google Earth к соответствующему div (оригинальный код для GMaps прикрепляет его к массиву Map Controls).Другой проблемой была установка zIndex, чтобы убедиться, что LayerSwitcher находится сверху.У меня все еще есть проблема, когда плагин GE работает, и я пытаюсь свести к минимуму LayerSwitcher, вызов OpenLayers.Event.stop () приводит к сбою плагина GE (Chrome) или к исчезновению LayerSwitcher (IE8).Я хотел бы раскошелиться на оригинальный код от Google и создать слой плагинов GE, который работает на OpenLayers.Кто-нибудь может подсказать, как это сделать?спасибо.
В любом случае, вот мои последние изменения:
GoogleEarth.prototype.findLayerSwitcherDiv_ = function() {
var id = 'LayerSwitcher';
var siblings = this.mapDiv_.parentNode.childNodes;
for (var i = 0, sibling; sibling = siblings[i]; i++) {
if (sibling.id.indexOf(id) != -1) {
return sibling;
}
}
};
GoogleEarth.prototype.addEarthControl_ = function() {
...
inner.appendChild(earthDiv);
var parentNode = this.findLayerSwitcherDiv_().parentNode;
parentNode.appendChild( control );
...
GoogleEarth.prototype.setZIndexes_ = function(mapTypeControlDiv) {
var oldIndex = mapTypeControlDiv.style.zIndex;
var siblings = this.controlDiv_.parentNode.childNodes;
for (var i = 0, sibling; sibling = siblings[i]; i++) {
sibling['__gme_ozi'] = sibling.style.zIndex;
// Sets the zIndex of all controls to be behind Earth.
sibling.style.zIndex = 0;
}
mapTypeControlDiv['__gme_ozi'] = oldIndex;
this.controlDiv_.style.zIndex = 2000;
mapTypeControlDiv.style.zIndex = 2001;
};
[обновление 3] Я настроил здесь проект github: https://github.com/ZiglioNZ/GoogleEarth-for-OpenLayers
[обновление4] Для демонстрации перейдите к http://ziglionz.github.com/GoogleEarth-for-OpenLayers/ol.html