ぺたさん
頂いたソースコードを元に、作り替えてみました。
App Engineにデプロイまでしてはいないのですが、たぶん動くでしょう。
Google Maps APIの機能そのものに、マーカーの色を変える機能はありません。
マーカーの画像を自分で用意する必要があります。
各個別のマーカーごとに情報ウィンドウの内容を変更する方法ですが、
createMarker() という関数の中で行なっています。
関数の中でHTMLの文字列を作成することで、マーカーをクリックした時に
それぞれの内容を維持/表示するようになっています。
<script type="text/javascript">
var map;
var zoomLevel = 5;
var infoWindow = null;
var markerDic = {};
var preId = null;
//ズームレベルが変更になったら実行する
function onZoomChanged() {
//最後にクリックされたマーカーの位置を中心位置にする
map.setCenter(markerDic[preId].getPosition());
}
//リストがクリックされたら実行する
function onListItemClicked(id) {
//マーカーを擬似クリックする
google.maps.event.trigger(markerDic[id], "click");
}
function initialize() {
//地図を表示するのに必要なパラメータ
var latlng = new google.maps.LatLng(35.69836, 139.773104);
var myOptions = {
zoom : zoomLevel,
center : latlng,
mapTypeId : google.maps.MapTypeId.ROADMAP
};
//地図を作成する
map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
//情報ウィンドウを1つだけ作成する
infoWindow = new google.maps.InfoWindow();
//ズームレベルが変更になったら、onZoomChanged を実行する
google.maps.event.addListener(map, 'zoom_changed', onZoomChanged);
//カテゴリに応じた画像を自分で用意する必要があります
var categories = {
"red" : "/img/markers/red.png",
"blue" : "/img/markers/blue.png"
};
{% for image in images %}
//マーカーを作成する関数(createMarker)にデータを渡す。
//関数からは、作成されたマーカーが返される
var marker = createMarker({
map : map,
position : new google.maps.LatLng({{image.geo.lat}}, {{image.geo.lon}}),
image_key : "{{image.key}}",
image_author : "{{image.author}}",
image_title : "{{image.title}}",
image_place : "{{image.place}}",
image_createdTime : "{{image.createdTime}} JST",
image_comment : "{{image.comment}}",
//カテゴリの条件によって、画像が変わるようにする
image : categories["blue"]
});
//マーカーの配列に追加する
markerDic["{{image.key}}"] = marker;
if (prefId == null) {
//一番最初に作成したマーカーを擬似クリックすることで、情報ウィンドウを開く
google.maps.event.trigger(marker, "click");
}
{% endfor %}
}
function createMarker(options) {
//HTMLの文字列を作成する
var html = [
'<div>',
'<a href="/img?key=' + options.image_key + '">',
'<img src="/img?key=' + options.image_key + '&width=100" align="left">',
'</a>',
'</div>',
'<div>',
'<div>' + options.image_author + '<br></div><br>',
'<div>' + options.image_title + '</div><br>',
'<div>' + options.image_place + '</div><br>',
'<div>' + options.image_createdTime + '</div><br>',
'<div>' + options.image_comment + '</div><br>',
'<br><br><div>コメント</div><br>',
'</div>'
].join("");
//マーカーを作成する
var marker = new google.maps.Marker({
map : options.map,
image : options.image
});
//クリックされたら、情報ウィンドウを開く
google.maps.event.addListener(marker, "click", function() {
//最後にクリックされたキーを記憶しておく
prefId = options.image_key;
//情報ウィンドウの内容を更新する
infoWindow.setContent(html);
//表示する
infoWindow.open(options.map, marker);x
});
return marker;x
}
</script>