Главная > JavaScript, Программирование > Google Map API v3 Marker Manager

Google Map API v3 Marker Manager

1 Март 2010

Что-то я в последние время сильно расслабился. возможно это потому что я играю в линейку, а возможно потому что просто лентяй. В любом случаи у меня закончился проект для Better Place и я хочу выложить остатки моего экспиринса. Не так давно я писал про замечательный проект jMaps который я недавно послал к хуям. В общемто перейти на Google Map API v3 мне мешало только отсутствие нормального Marker Manager'a и вот я его написал. Он конечно не идельный но покрывал все нужды проекта. Самая не идеальная его часть это метод createMarker, который я думаю, стоит писать каждому под себя. Встречайте Marker Manager для Google Map API v3:


var MarkerManager = function(map){
	/*
	 * @author CTAPbIu_MABP
	 * @email CTAPbIuMABP@gmail.com
	 * @link http://mabp.kiev.ua/2010/03/01/google-map-api-v3-marker-manager/
	 * @license GPL
	 */
	this.setMap(map);
}
MarkerManager.prototype = {

	markers : [],
	map : null,

	/**
	 * Set the map
	 * @access private
	 * @param {HTMLElement} map Div with map
	 */
	setMap : function(map){
		this.map = map;
	},

	/**
	 * Add new marker to the map
	 * @access public
	 * @param {google.maps.Marker} marker Marker to add
	 */
	addMarker : function(marker){
		this.markers.push(marker);
	},

	/**
	 * Add new markers to the map
	 * @access public
	 * @param {Array of google.maps.Marker} markers Array of markers to add
	 */
	addMarkers : function(markers){
		this.markers.concat(markers);
	},

	/**
	 * Get markers with latitude & longitude
	 * @access public
	 * @param {google.maps.LatLng} latlng Coordinates
	 * @return {Array of google.maps.Marker} Array of markers
	 */
	getMarkers : function(latlng){
		var array = [];
		for (var i in this.markers)
			if (this.markers[i].getPosition().equals(latlng))
				array.push(this.markers[i]);
		return array;
	},

	/**
	 * Remove marker
	 * @access public
	 * @param {google.maps.Marker} marker Marker to remove
	 * @return {google.maps.Marker} Removed marker
	 */
	removeMarker : function(marker){
		var index = this.inArray(marker, this.markers), current;
		if (index > -1){
			current = this.markers.splice(index,1);
			current[0].setMap(null);
		}
		return marker;
	},

	/**
	 * Remove all marker
	 * @access public
	 */
	clearMarkers : function(){
		// this.map.clearOverlays();
		for (var i in this.markers)
			this.markers[i].setMap(null);
		this.markers = [];
	},

	/**
	 * @access public
	 * @return {int} Count of markers on the map
	 */
	getMarkerCount : function(){
		return this.markers.length;
	},

	/**
	 * @access public
	 * @return {Array of google.maps.Marker} Return Array of visible markers
	 */
	getVisibleMarkers : function(){
		var array = [];
		for (var i in this.markers){
			if (this.isVisible(this.markers[i].getPosition()))
				array.push(this.markers[i]);
		}
		return array;
	},

	/**
	 * For more information about getBounds look at google groups discussion
	 * http://code.google.com/apis/maps/documentation/javascript/events.html#EventListeners
	 * @access public
	 * @param {google.maps.LatLng} latlng Coordinates of point
	 * @return {boolean} is point visible
	 */
	isVisible : function(latlng){
		try {
			return this.map.getBounds().contains(latlng);
		} catch (e){
			this.thowExcwprion('Map is not loaded yet'); 
		}
	},

	/**
	 * Create a new marker and add it to map
	 * Not the best implementation
	 * It seems you should write your own
	 * @access public
	 * @param {google.maps.LatLng} position Coordinates
	 * @param {string} color Marker color [red,black,grey,orange,white,yellow,purple,green]
	 * @param {boolean} draggable Is marker draggable
	 * @return {google.maps.Marker} created marker
	 */
	createMarker : function(position, color, draggable){
		var marker = new google.maps.Marker({
			map: this.map,
			position : position,
			draggable : !!draggable,
			icon : new google.maps.MarkerImage('http://maps.google.com/mapfiles/marker'+(color=="red"||!color?"":"_"+color)+'.png',
				new google.maps.Size(20, 34),
				new google.maps.Point(0,0),
				new google.maps.Point(8, 32)),
			shadow : new google.maps.MarkerImage('http://maps.google.com/mapfiles/shadow50.png',
				new google.maps.Size(37, 34),
				new google.maps.Point(0,0),
				new google.maps.Point(10, 32)),
			shape : {
				coord: [9,0,6,1,4,2,2,4,0,8,0,12,1,14,2,16,5,19,7,23,8,26,9,30,9,34,11,34,11,30,12,26,13,24,14,21,16,18,18,16,20,12,20,8,18,4,16,2,15,1,13,0],
				type: 'poly'
			}
		});
		this.addMarker(marker);
		return marker;
	},
	
	/**
	 * Fires when bounds are ready
	 * @access public
	 * @param {Function} callback function
	 */
	onBoundsReady : function(fn){
		google.maps.event.addListenerOnce(this.map, 'bounds_changed', fn);
	},
	
	/**
	 * Search for item in array
	 * @access public
	 * @param {mixed} elem needle
	 * @param {array} array haystack
	 * @return {int} Index of item
	 */
	inArray : function(elem, array) {
		if (array.indexOf) {
			return array.indexOf(elem);
		}

		for (var i=0, length=array.length; i<length; i++){
			if (array[i]===elem) {
				return i;
			}
		}

		return -1;
	},
	
	/**
	 * Throw an exception
	 * @access private
	 * @param {String} message
	 */
	thowExcwprion : function(e){
		throw e; 
	}
}

Я думаю что он очень прост в использовании, поэтому покажу только один пример


var map = new google.maps.Map(document.getElementById("map"), {
    zoom: 1,
    center: new google.maps.LatLng(0, 0),
    mapTypeId: google.maps.MapTypeId.HYBRID
});
var myMarkerManager = new MarkerManager(map);
var kiev = myMarkerManager.createMarker(new google.maps.LatLng(50.440951, 30.527181)); // добавлю маркер Киева
myMarkerManager.addMarkers([kiev,kiev]); // всего уже три маркера в одной точке
var markers = myMarkerManager.getMarkers(new google.maps.LatLng(50.440951, 30.527181)); // нашел все три
myMarkerManager.removeMarker(markers[0]); // удяляю первый
myMarkerManager.clearMarkers(); // удаляю все

Скачать можно тут DOWNLOAD LINK

  1. ShadowX
    1 Март 2010 в 21:00 | #1
    Спасибо, хорошая наработка :) Попробую както заюзать :)
  2. 2 Март 2010 в 11:10 | #2
    пожалусто ;) будут какието замечания - пиши
  3. Alex
    15 Март 2010 в 13:22 | #3
    Спасибо за код! как я понял из обсуждения getBounds эту функцию нельзя использовать сразу во время инициализации карты есть идеи как создавать только те маркеры которые будут видны на начальном этапе,
  4. 17 Март 2010 в 10:04 | #4
    @Alex нет, прости, идей нет
  5. 22 Апрель 2010 в 12:58 | #5
    А как можно убрать логотип Google и ссылку с текстом "Условие предоставления услуг Google" ? Заранее спасибо!
  6. Валерий
    23 Июль 2010 в 08:31 | #6
    Alex : А как можно убрать логотип Google и ссылку с текстом "Условие предоставления услуг Google" ? Заранее спасибо!
    Нарисовать поверх их полигон или спрайт. Можно даже подгружать нужный статичный кусочек карты и его подставлять как текстурку. Расчётов не так уж и много. Однако лично сообщил бы в Гугл, если бы наткнулся.
  7. Вячеслав
    11 Октябрь 2010 в 13:24 | #7
    @Alex На выбор два события объекта Map: "idle" или "tilesloaded". А выполнять их можно однократно (event.addListenerOnce)
  8. 3 Ноябрь 2010 в 16:20 | #8
    Хороший труд. Гугл выпустил свой маркер менеджер для третей версии АПИ. Через несоклько месяцев после твоего поста. ДУмаю тебе будет интерестно http://googlegeodevelopers.blogspot.com/2010/04/markermanager-10-manage-your-markers-in.html
  9. 3 Ноябрь 2010 в 18:40 | #9
    @yarroha большое спасибо :)
Комментирование отключено.