Как использовать API карт Google с несколькими маркерами на одной карте
Итак, у меня есть следующий script, чтобы использовать API карт google, все это прекрасно, но мне нужно создать карту с более чем одним маркером (значок в форме шара, указывающий на что-то), и мне нужно, чтобы каждый из них эти маркеры указывают на другую область карты (т.е. разные координаты), как я могу это сделать?
<script type="text/javascript">
function load() {
var map = new GMap2(document.getElementById("map"));
var marker = new GMarker(new GLatLng(<%=coordinates%>));
var html="<img src='simplemap_logo.jpg' width='20' height='20'/> " +
"<%=maptitle%><br/>" +
"<%=text%>";
map.setCenter(new GLatLng(<%=coordinates%>), <%=zoom%>)
map.setMapType(G_HYBRID_MAP);
map.addOverlay(marker);
map.addControl(new GLargeMapControl());
map.addControl(new GScaleControl());
map.addControl(new GMapTypeControl());
marker.openInfoWindowHtml(html);
}
//]]>
</script>
Еще один вопрос: если я передаю текст script как переменную, скажем что-то вроде:
<script type="text/javascript">
<%=ScriptText%>
</script>
и my <% = ScriptText% > будет строкой, которую я буду строить и назначить ее значение переменной Friend или Public, называемой ScriptText, будет ли она выполняться и работать правильно? (я делаю это, чтобы сделать мой script динамический и другой в зависимости от того, как я его создаю как STRING, из-за моей неграмотности в javascripting; P)
Ответы
Ответ 1
obeattie и gregers оба правильны. В общем, вам нужно сохранить параметры маркера в каком-то массиве, который вы позже будете использовать по меньшей мере дважды:
- при добавлении наложения к карте
- при добавлении его в объект GLatLngBounds для вычисления центральной точки и уровня масштабирования
Массив или маркеры будут выглядеть как массив объектов, например:
var latlng1 = [
new GLatLng( 48.1234, -120.1234 ),
new GLatLng( 48.5678, -120.5678 ),
new GLatLng( 48.9101, -120.9112 ),
new GLatLng( 48.1121, -120.1314 ),
new GLatLng( 48.3145, -120.1516 ),
new GLatLng( 48.1617, -120.1718 ),
new GLatLng( 48.1819, -120.1920 ),
new GLatLng( 48.2021, -120.2122 )
];
Код добавления маркеров будет выглядеть примерно так:
// assume that map1 is an instance of a GMap2 object
// #0 -- google maps api requires us to call setCenter first before calling any other operation on the map
map1.setCenter( new GLatLng( 0, 0 ), 0 );
// #1 -- add markers
for ( var i = 0; i < latlng1.length; i++ )
{
var marker = new GMarker( latlng1[ i ] );
map1.addOverlay( marker );
}
// #2a -- calculate center
var latlngbounds = new GLatLngBounds( );
for ( var i = 0; i < latlng1.length; i++ )
{
latlngbounds.extend( latlng1[ i ] );
}
// #2b -- set center using the calculated values
map1.setCenter( latlngbounds.getCenter( ), map1.getBoundsZoomLevel( latlngbounds ) );
Что касается вашего вопроса об использовании серверной стороны script внутри javascript на стороне клиента, да, вы можете смешать их вместе. Судя по вашему описанию, я думаю, что это то, что вам нужно сделать:
<script type="text/javascript">
var latlng1 = new Array( );
</script>
<script type="text/javascript">
<%
do until rs.eof
%>
latlng1.push( new GLatLng( parseFloat( '<%= rs( "Lat" ) %>' ), parseFloat( '<%= rs( "Lng" ) %>' ) ) );
<%
rs.movenext
loop
%>
</script>
Я опубликовал статью по адресу: http://salman-w.blogspot.com/2009/03/zoom-to-fit-all-markers-polylines-or.html
Ответ 2
Вам нужно будет создать новый GMarker
для каждого места, которое вы хотите отметить на карте. Имеется неплохая документация здесь для GMarker
s.
Чтобы создать GMarker
, вы увидите из документации, в которой вам сначала нужно создать GLatLng
, представляющий местоположение, в которое вы хотите пометить маркер. Вы не упомянули о том, что хотите получить какой-либо контент на воздушном шаре, поэтому я предполагаю, что это только маркер. В вашем случае код, вероятно, будет выглядеть примерно так:
var markerCoords = [
new GLatLng(<latitude>, <longitude>),
new GLatLng(<latitude>, <longitude>),
[...]
];
for (coord in markerCoords){
map.addOverlay(new GMarker(coord));
};
Я уверен, что вы, вероятно, можете точно сказать, что происходит здесь, но на всякий случай я создаю массив объектов GLatLng
(это может быть любой длины [в пределах haha]), а затем перебрать его, добавляя маркеры к карте для каждого GLatLng
, определенного в массиве.
Если вы планируете создавать множество маркеров, вам, вероятно, будет полезно использовать Marker Manager, который ускорит рендеринг большого количества маркеров одновременно (не рендеринг маркеров вне экрана и сжатие на экране, если в одной области экрана много).
Ответ 3
obeattie ответил на ваш вопрос довольно хорошо. Но из вашего примера кода кажется, что вы также хотите, чтобы карта увеличивалась до области, содержащей маркеры. Чтобы сделать это с помощью нескольких маркеров, вы можете создать GLatLngBounds, который вы распространяете для каждого маркера. Затем вы можете получить центр и масштабирование, которые будут соответствовать вашей коллекции маркеров из объекта bounds.
var markersBounds = GLatLngBounds();
var coord = null;
for (coord in markerCoords){
coord = new GMarker(coord);
map.addOverlay();
markersBounds.extend(coord);
};
var markersCenter = markersBounds.getCenter();
var markersZoom = G_HYBRID_MAP.getBoundsZoomLevel(markersBounds);
map.setCenter(markersCenter, markersZoom);
код >
Я не уверен на 100% о G_HYBRID_MAP. getBoundsZoomLevel, но если я правильно помню, G_HYBRID_MAP является экземпляром GMapType.
Ответ 4
У меня есть что-то вроде этого, но события не работают. Можно ли добавить слушателей внутри конструктора объекта?
//Localization object onstructor
function Localization(width, height, description, img_source){
this.point = new GLatLng(width, height);
this.marker = new GMarker(this.point);
this.description = description;
this.img_source = img_source;
GEvent.addListener(this.marker, "click", function(){marker.openInfoWindowHtml(this.description);});
}
//map localizations to show on map
var localizations = [
new Localization( 52.9015797, 15.2602200, 'Poznań1', 'eye1' ),
new Localization( 52.9025797, 15.1602200, 'Poznań2', 'eye2' ),
new Localization( 52.9035797, 15.2702200, 'Poznań3', 'eye3' ),
new Localization( 52.9045797, 15.2102200, 'Poznań4', 'eye4' ),
]
var map = new GMap2(document.getElementById("mapa"));
map.setCenter(localizations[3].point, 13);
map.setUIToDefault();
for(i=0; i < localizations.length; i++){
localization=localizations[i];
map.addOverlay(localization.marker);
localization.marker.openInfoWindowHtml(localization.description);
}
Ответ 5
Я не могу редактировать свой пост (см. выше), поэтому я опубликую некоторые исправления. Это не совсем то, что вы хотите, его просто грубая схема:
var map;
var markers = new Array( );
markers.push(
{
latlng: new GLatLng( parseFloat( '47.59' ), parseFloat( '-120.65' ) ),
name: 'Some html here'
}
);
markers.push(
{
latlng: new GLatLng( parseFloat( '48.84' ), parseFloat( '-122.59' ) ),
name: 'Some html here as well'
}
);
markers.push(
{
latlng: new GLatLng( parseFloat( '47.83' ), parseFloat( '-120.01' ) ),
name: 'And some more html...'
}
);
function create_gmarker( marker )
{
var gmarker = new GMarker( marker.latlng );
GEvent.addListener( gmarker, 'click', function( ) {
gmarker.openInfoWindowHtml( marker.name );
}
);
return gmarker;
}
function initialize_gmap( )
{
if ( GBrowserIsCompatible( ) )
{
// initialize map etc here and other yada yada
for ( var i in markers )
{
map.addOverlay( create_gmarker( markers[ i ] ) );
}
}
}
В приведенном выше примере также показано наивное использование javascript [массивов] и {объектов}. Вы должны использовать некоторые:)