2013-07-02 2 views
2

Как бы вы поместили белую рамку за динамически загруженный значок маркера, теперь, что новый «Визуальный риф» Google Maps больше не позволяет тени? 1Как создать рамку вокруг пользовательских значков маркеров без использования теней

Открыть http://jsfiddle.net/FSffv/3/ с google.maps.visualRefresh = false;, чтобы увидеть белую рамку вокруг значка маркера и google.maps.visualRefresh = true;, чтобы он исчез.

var map; 
var m_NormalImageSize = 15; 
var m_NormalShadowSize = m_NormalImageSize+5; 
var elevator; 
var myOptions = { 
    zoom: 6, 
    center: new google.maps.LatLng(47, 8), 
    mapTypeId: 'terrain' 
}; 

// turn VisualRefresh on/off 
google.maps.visualRefresh = false; 

map = new google.maps.Map($('#map')[0], myOptions); 
var img = new Image(); 
img.src = "http://t2.gstatic.com/images?q=tbn:ANd9GcQUnmYVY5sWfZtBlw_IELax3W8E7-jZcCXLd2HUZYtpk_AeuK4CRnJmMHj0"; 
var img_ratio = img.height/img.width; 
if (isNaN(img_ratio)) 
    img_ratio = 1; 
var icon_size = new google.maps.Size(m_NormalImageSize, m_NormalImageSize * img_ratio); 
var shadow_size = new google.maps.Size(m_NormalShadowSize, m_NormalShadowSize * img_ratio); 
var image = new google.maps.MarkerImage(
    "http://t2.gstatic.com/images?q=tbn:ANd9GcQUnmYVY5sWfZtBlw_IELax3W8E7-jZcCXLd2HUZYtpk_AeuK4CRnJmMHj0", 
    icon_size, 
    new google.maps.Point(0, 0), 
    new google.maps.Point(-3, m_NormalImageSize * img_ratio + 3 * img_ratio), 
    icon_size 
); 

// the frame around the marker icon as a shadow 
var shadow = new google.maps.MarkerImage(
    "http://alsotoday.com/jpg/placemarkbackground_white.png", 
    shadow_size, 
    new google.maps.Point(0, 0), 
    new google.maps.Point(0, m_NormalShadowSize * img_ratio), 
    shadow_size 
); 

var marker = new google.maps.Marker({ 
    position: new google.maps.LatLng(47, 8), 
    map: map, 
    icon: image, 
    shadow: shadow, 
    title: "hallo" 
}); 
+0

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

+0

Итак, откуда взялся арторук для иконки? –

+0

Спасибо за подсказку о слиянии изображения с фреймом PHP. Но рамка вокруг изображения - это просто стилизация страницы и не должна изменять содержимое (изображения) страницы. Например, когда я хочу отображать живые твиты на карте, значки (рисунки-профили) динамически загружаются из Twitter, а твиты меняются каждую секунду или около того. –

ответ

2

Одним из способов сделать это было бы использование пользовательского наложения HTML. Тогда вы можете начертить его так, как вам нравится.

Вот working example, используя этот код:

function ImageMarker(options) { 
    this.setValues(options); 

    this.$inner = $('<div>').css({ 
     position: 'relative', 
     left: '-50%', top: '-50%', 
     fontSize: '1px', 
     lineHeight: '1px', 
     border: '2px solid red', 
     padding: '2px', 
     backgroundColor: 'white', 
     cursor: 'default' 
    }); 

    this.$div = $('<div>') 
     .append(this.$inner) 
     .css({ 
      position: 'absolute', 
      display: 'none' 
     }); 
}; 

ImageMarker.prototype = new google.maps.OverlayView; 

ImageMarker.prototype.onAdd = function() { 
    $(this.getPanes().overlayMouseTarget).append(this.$div); 
}; 

ImageMarker.prototype.onRemove = function() { 
    this.$div.remove(); 
}; 

ImageMarker.prototype.draw = function() { 
    var marker = this; 
    var projection = this.getProjection(); 
    var position = projection.fromLatLngToDivPixel(this.get('position')); 

    this.$div.css({ 
     left: position.x, 
     top: position.y, 
     display: 'block' 
    }) 

    this.$inner 
     .html('<img src="' + this.get('image') + '"/>') 
     .click(function(event) { 
      var events = marker.get('events'); 
      events && events.click(event); 
     }); 
}; 

function initialize() { 
    var latLng = new google.maps.LatLng(40.708762, -74.006731); 

    var map = new google.maps.Map($('#map_canvas')[0], { 
     zoom: 15, 
     center: latLng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }); 

    var marker = new ImageMarker({ 
     map: map, 
     position: latLng, 
     image: 'http://cdn.sstatic.net/stackoverflow/img/favicon.ico', 
     events: { 
      click: function(event) { 
       alert('Clicked marker'); 
      } 
     } 
    }); 
}; 

$(initialize); 
+0

Это классный расширенный файл google.maps.OverlayView(), но могу ли я разместить несколько маркеров по Lat/Long с этим? –

+0

Да, где у него есть «var marker = new ImageMarker ({...})», вы можете создать любое количество маркеров таким же образом, переходя в разные 'position' и' image' для каждого. –

+0

Увлекательный. Попробуй это на моем сайте. Благодаря! –

1

Как о наличии еще одно изображение с границами и сделать заявление, как показано ниже:

if (google.maps.visualRefresh) { 
    image = new google.maps.MarkerImage(
     "http://s24.postimg.org/lfamj2ktd/image.png", 
    icon_size, 
    new google.maps.Point(0, 0), 
    new google.maps.Point(-3, m_NormalImageSize * img_ratio + 3 * img_ratio), 
    icon_size); 
} 

Проверьте это JSFiddle.

+0

(См. Мой комментарий по вопросу) –

+0

@AlexanderRoehnisch Я знаю, что у вас есть ответ. Но я ослабел, чтобы показать, что я пробовал для вас. Понял. На самом деле я пытался использовать blend.js для объединения изображений. Но я был неудачен и поэтому показал вам эту идею. – Praveen

+0

Спасибо, я ценю это. –

Смежные вопросы