2010-11-09 2 views
9

Я хочу отобразить перекрестие/сетку, установленную в центре карты Google, так же, как Wikimapia.org. К сожалению, они используют v2 API, и я использую v3.Отображение перекрестий в центре JavaScript Google Map

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

Нет опции CENTER для перечисления ControlPosition, поэтому я предполагаю, что любое решение будет немного хакерским.

Я попытался наложить его как div вне карты, но мне не удалось заставить его отображать поверх карты - кажется, он превзойден в разборке z-порядка.

ответ

9

Данное решение не сработало для меня, потому что вышележащий div создает мертвую точку на карте. Лучшим решением для моего проекта с использованием API Google Maps V3 для Google Maps было создание сетки на карте в качестве маркера с 1 пиксельной формой прямоугольника. Затем используйте событие bounds_changed для переноса маркера.

Изображение с сеткой 63 x 63 png. (Изображения/reticle.png)

Определить изображение маркера и формы ...

var reticleImage = new google.maps.MarkerImage(
    'images/reticle.png',   // marker image 
    new google.maps.Size(63, 63), // marker size 
    new google.maps.Point(0,0),  // marker origin 
    new google.maps.Point(32, 32)); // marker anchor point 
    var reticleShape = { 
    coords: [32,32,32,32],   // 1px 
    type: 'rect'      // rectangle 
    }; 

После создания нашей карты (main_map) мы добавим маркер ...

reticleMarker = new google.maps.Marker({ 
    position: latlng, 
    map: main_map, 
    icon: reticleImage, 
    shape: reticleShape, 
    optimized: false, 
    zIndex: 5 
    }); 

Здесь var latlng - это тот же объект LatLng, который используется для создания main_map. ZIndex должен быть больше, чем любой другой маркер zIndex's, чтобы сохранить сетку сверху.

Затем мы добавляем обработчик события, который вызывается при запуске карты bounds_changed.

google.maps.event.addListener(main_map, 'bounds_changed', centerReticle); 

и, наконец, у нас есть функция centerReticle().

function centerReticle(){ 
    reticleMarker.setPosition(main_map.getCenter()); 
    } 

Поскольку мы что-нибудь еще с «bounds_changed» событие мы можем привести в порядок код, передавая анонимную функцию на вызов AddListener не делает ... Это удерживает нас от того, чтобы определить centerReticle() функция.

google.maps.event.addListener(main_map, 'bounds_changed', 
     function(){reticleMarker.setPosition(main_map.getCenter());}); 

Это действительно работает довольно пятно. Надеюсь, это поможет другим.

Спасибо.

Пропустить

+1

Фантастично, да, мое решение создало мертвое место, которое довольно раздражает, хотя и мало. Дайте мне немного белого цвета, чтобы проверить это ... –

+0

Привет, Дрю, я рад, что вы заметили мой ответ, потому что это, кажется, трюк. Как обычно, я нашел ваш вопрос, ища ответ, но никогда не получал вышележащего div от верхнего левого угла карты, прежде чем понял, что я не буду доволен этим. В настоящее время я работаю над PythyTwits, веб-приложением Twitter. Я уклоняюсь от термина геокодирования, потому что люди хотят сделать все это научно. Я не занимаюсь геокодированием, я просто собираю LatLng и кладу их на карту. Вот пара твитов со скриншотами. - http://bit.ly/iuo9Ia http://bit.ly/iTOjeb – BentFX

+1

Я только что попробовал это, и он отлично работает - не больше мертвой точки! Большое спасибо. Желание, чтобы я мог проголосовать за это дважды :) –

8

Хорошо, я дурак и делаю это сложнее, чем это должно быть.

Вместо удалить вопрос, вот решение в случае, если это помогает кто-то еще:

<div id="container"> 
    <div id="map"></div> 
    <div id="reticule"><img src="reticule.gif" /></div> 
</div> 

И некоторые стили:

#container { position:relative; } 
#map { height:100%; width:100%; } 
#reticule { 
    position:absolute; 
    width:13px; 
    height:13px; 
    left:50%; 
    top:50%; 
    margin-top:-8px; 
    margin-left:-8px; 
    pointer-events: none; 
} 

Это не точный центр карты

+0

Вы должны отметить это как свой ответ – Galen

+0

@gGalen, вы не можете принять свой собственный ответ до тех пор, пока два вопроса не пройдут с момента запроса. –

6

Я использую решение, которое я нашел в DaftLogic.com.Это похоже на то же решение, что и BentFX, но гораздо более кратким.

var marker = new google.maps.Marker({ 
    map: map, 
    icon: '/images/reticle.png' 
}); 
marker.bindTo('position', map, 'center'); 

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

+0

marker.bindTo(); функция велика. Обратите внимание, что в решении DaftLogic.com, когда вы наводите курсор на сетку, курсор меняется, и когда вы перетаскиваете его, у него мертвое место. Обе эти проблемы преодолеваются путем определения пустой (1px прямоугольник) формы для маркера. – BentFX

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