Najprostsze rozwiązanie jakie widzę, to tak, że serwer wyrzuca obszary oraz ich id przy starcie strony.
Przechwytuje jest JavaScript. Najlepiej wszystko zrobić w formacie JSON.
Napisałem prostą klasę, która może wiele sprostować:
cały kod i demo znajduje się na jsfiddle:
http://jsfiddle.net/GDM64/Obsługa zdarzeń znajduje się w kodzie, można tam dopisać co się ma stać dalej po kliknięciu, jeśli chcesz użyć AJAX.
Myślę, że obszar powinien być wyświetlany od razu po kliknięciu, a nie dopiero po otrzymaniu odpowiedzi z serwera, ponieważ zwłoka może zaskoczyć użytkownika.
Kodu po stronie serwera nie pisałem lecz jeśli będziesz go potrzebował, mogę coś napisać.
<!DOCTYPE html>
<title>Google Maps JavaScript API v3 Example: Map Simple
</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> html, body, #map_canvas {
margin: 0;
padding: 0;
height: 100%;
}
<script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
function Obszary () {
// zmienna 'self' trzymająca referencje do instancji - widoczna w całym kodzie klasy
var self = this;
var ukryty = {
strokeOpacity: 0,
fillOpacity: 0
}
var widoczny = {
strokeOpacity: 0.5,
fillOpacity: 0.5
}
//// tablica obszarów, do której będą dodawane instancje google.maps.Polygon
this.obszary = []
// funkcja odpowiadająca za ukrycie obszarow na mapie
this.ukryjObszary = function () {
var iter = 0;
for (iter = 0; iter < this.obszary.length; iter++) {
var obszar = this.obszary[iter];
obszar.setOptions(ukryty)
}
}
// funkcja odpowiadająca za podświetlenie obszaru
this.podswietlObszar = function (obszar) {
obszar.setOptions(widoczny)
}
// funkcja zawierająca kod wykonywany po kliknięciu w obszar, przyjmuje kliknięty
// obszar za argument
this.klikniecie = function (obszar) {
this.ukryjObszary()
this.podswietlObszar(obszar);
var id = obszar.id
console.log(obszar.id)
}
// funkcja odpowiadająca za dodanie obszaru do mapy w stanie ukrytym oraz przypisanie zdarzenia
// wywoływanego podczas kliknięcia w obszar
this.dodajObszar = function (wierzcholki, id) {
var alpha = 0;
var color = "#ffffff";
var nowyObszar = new google.maps.Polygon({
paths: wierzcholki,
strokeColor: color,
fillColor: color,
strokeOpacity: alpha,
fillOpacity: alpha
})
nowyObszar.id = id;
nowyObszar.setMap(map)
google.maps.event.addListener(nowyObszar, 'click', function (event) {
self.klikniecie(nowyObszar);
})
this.obszary.push(nowyObszar)
}
}
var map;
function initialize() {
var mapOptions = {
zoom: 8,
center: new google.maps.LatLng(-32.23052345157306, 153.43452734375),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
obszary = new Obszary();
// Dodanie kwadratowych obszarów do mapy w celach demonstracyjnych
// W rzeczywistości, jeśli dane mają pochodzić z bazy danych to najlepiej
// dodać je przez np w PHP: json_encode() i przechwycić w javascript przez
// JSON.parse() - przy pomocy jakiejś biblioteki lub po prostu biblioteki JSON
// [url="https://github.com/douglascrockford/JSON-js"]https://github.com/douglascrockford/JSON-js[/url]
var iter;
for (iter = 0; iter < 7; iter++) {
var iterIter
for (iterIter = 0; iterIter < 5; iterIter++) {
var x = iter
var y = iterIter
var id = iter * iterIter;
var wierzcholki = [
new google.maps.LatLng(-34 + y, 150 + x),
new google.maps.LatLng(-35 + y, 150 + x),
new google.maps.LatLng(-35 + y, 151 + x),
new google.maps.LatLng(-34 + y, 151 + x),
new google.maps.LatLng(-34 + y, 150 + x),
];
obszary.dodajObszar(wierzcholki, id)
}
}
// Construct the polygon
// Note that we don't specify an array or arrays, but instead just
// a simple array of LatLngs in the paths property
// bermudaTriangle = new google.maps.Polygon({
// paths: triangleCoords,
// strokeColor: "#FF0000",
// strokeOpacity: 0.0,
// strokeWeight: 2,
// fillColor: "#FF0000",
// fillOpacity: 0.1
//
// });
//
// bermudaTriangle.setMap(map);
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>