Ciao!
Come promesso... il mio script che fa quanto segue (tra parentesi l'uso della tecnologia applicata):

1 - 3 select dinamiche (regione->provincia->comune) [AJAX+PHP+MYSQL];
2 - scelto il comune la mappa si centra sul comune [JS + Gmap V3];
3 - scelto il comune automaticamente si estrae da un XML - generato da MYSQL con PHP - i markers relativi a quel comune [PHP+MYSQL].

Doverosa premessa: per il core delle liste ajax ho preso spunto da questo articolo:

http://sviluppare-in-rete.blogspot.c...dinamiche.html modificato leggermente con alcune mie necessità.

db mysql regioni-pr-comuni: http://www.sarnari.net/programmazion...atabase-mysql/

Articolo di Gmaps per l'estrazione dei markers (modificato per la V3 delle API): http://code.google.com/intl/it-IT/ap...hpsqlajax.html

In più tutto il supporto di bionicoz al quale ho rubato alcuni suoi script che aveva pubblicato. Da questo collage è nata una cosa che (sembra) funziona(re)

Qui http://www.webtemplum.com/webtemplum.../07/script.zip troverete:

codice:
mappa.php (la pagina da mostrare)
generazione_xml.php (lo script che si occupa di estrarre markers)
request.php (script che in connubio con db_configure.php e js/lists.js si occupa di estrarre i valori che ci servono per le select dinamiche)
js/util.js (serve a Gmap per le estrazioni dei markers)

il Dump SQL di regioni-province-comuni + markers (alcuni sono sballati, ma il test è quello che conta :) )

Non riporterò gli interi listati; anche se non sono commentati pesantemente, sono di non difficile comprensione.

Cominciamo con la mappa

codice:
<script type="text/javascript" src="js/lists.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="js/util.js"></script>
<script type="text/javascript">
  var infowindow;
  var map;
  var markersArray = []; // inserisco tutti i markers creati in un array per poi pulire in caso di nuova richiesta


  function initialize() {
	geocoder = new google.maps.Geocoder();
    var myLatlng = new google.maps.LatLng(41.447948, 12.629052);
    var myOptions = {
      zoom: 13,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    
  }

    function clearOverlays() {
		  if (markersArray) {
			for (i in markersArray) {
			  markersArray[i].setMap(null);
			}
		  }
		}


    function geocode() {
	    clearOverlays(); //richiama la funzione per cancellare eventuali precedenti markers
		var ind1 = document.getElementById("comuni").value;
		var ind2 = " ,IT";
		var address = ind1 + ind2; // se cercassimo solo "Roma" potremmo rischiare di trovare una citta' con nome simile, pertanto aggiungo anche ,IT
		geocoder.geocode({
            'address': address,
            'partialmatch': true
        }, geocodeResult);
			var link = "generazione_xml.php?comune=";
	  downloadUrl(link+ind1, function(data) { // trasmetto a generazione_xml con GET il nome del comune di cui voglio estrarre i markers
      var markers = data.documentElement.getElementsByTagName("marker");
	 
      for (var i = 0; i < markers.length; i++) {
	  	var latlng = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")),
                                    parseFloat(markers[i].getAttribute("lng")));
        var marker = createMarker(markers[i].getAttribute("name"), latlng);
       }
     });
    }

    function geocodeResult(results, status) {
        if (status == 'OK' && results.length > 0) {
            map.fitBounds(results[0].geometry.viewport);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    }

  
	  function createMarker(name, latlng) {
		var marker = new google.maps.Marker({position: latlng, map: map});
		markersArray.push(marker);
		google.maps.event.addListener(marker, "click", function() {
		  if (infowindow) infowindow.close();
		  infowindow = new google.maps.InfoWindow({content: name});
		  infowindow.open(map, marker);
		});
		return marker;
	  }

</script>
Dopo aver inserito tutte le funzioni che ci occorreranno ( notare
codice:
var link = "generazione_xml.php?comune=";
	  downloadUrl(link+ind1, function(data) { // trasmetto a generazione_xml con GET il nome del comune di cui voglio estrarre i markers
che è proprio il link che ci permette di estrarre in formato XML i ns markers ) passiamo ad inserire un semplice form con le nostre select
codice:
<form id="comuneScelto">
            <fieldset>
            <label for="regioni">Regioni</label>

            <select name="regioni" id="regioni" onChange="loadList('province', getSelected(this))" >
            </select>

            <label for="province">Province</label>

            <select name="province" id="province" onChange="loadList('comuni', getSelected(this))">
              <option>-- Seleziona prima una regione --</option>
            </select>

            <label for="comuni">Comuni</label>

            <select onchange="geocode()" name="comuni" id="comuni">
            	<option>-- Seleziona prima una regione --</option>
            </select>

            </fieldset>
            </form>
Notare che su
- regioni e province si invia l'evento onChange per caricare le liste rispettivamente di province e comuni. COmuni invece invierà a geocode() il nome del comune per tirarne fuori lat e lgt e centrarne la mappa.
Lo stesso valore sarà passato a generazione_XML.php via GET per estrarne solo i markers.

QUindi, scelta la nostra regione lo script invia richiesta a js/utils.js (che non riporto perchè già commentato al suo interno) il quale si occuperà di comunicare con request.php per estrarre ID e nomi delle province della regione scelta...

Idem per comuni.

Una volta scelto il nostro comune, GMaps si occuperà di chiamare generazione_xml.php con il nome del comune via get

codice:
$comune = $_GET['comune'];
$query = "SELECT * FROM markers WHERE comune LIKE '$comune'";
il quale creerà un XML ben formato e lo reinvierà alla mappa....

Alla fine, senza ricaricare la nostra pagina (W Ajax!) avremo, scelto il comune, i nostri bei markers....

Enjoy!

TODO:

- mettere in sicurezza
codice:
$comune = $_GET['comune'];
$query = "SELECT * FROM markers WHERE comune LIKE '$comune'";
- si può ipotizzare di riprendere invece sempre l'ID del comune e fare ricerca per ID, sicuramente più accurato --> a monte nel db markers dobbiamo essere sicuri che è stato inserito lo stesso ID
- ampliare tale che basta la selezione della regione per vedere già i markers della regione, cosi anche per la provincia....!