Ricerca risultati ner raggio di 'n' km da un punto

  • Creatore Discussione Creatore Discussione rober23
  • Data di inizio Data di inizio

rober23

Utente Attivo
4 Ott 2013
32
0
0
ciao a tutti. ho un db con un elenco di punti geograficicon latitudine e longitudine. ho bisogno di creare uno script che, dato la mia posizione attuale, mi indichi le posizioni presenti attorno a me in un raggio di 5 km. ora io ho fatto questo:

Codice:
<script type="text/javascript">
if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(mostra_mappa);
}else{
  alert('La geo-localizzazione NON è possibile');
}
function mostra_mappa(posizione) {
	var my_lat = posizione.coords.latitude;
	var my_lon = posizione.coords.longitude;
    // Define your locations: HTML content for the info window, latitude, longitude
	var locations = [
	['Tu Sei Qui', posizione.coords.latitude, posizione.coords.longitude],
	
	/*
	SELECT *, TRUNCATE ( 6363 * sqrt( POW( RADIANS(posizione.coords.latitude ) - RADIANS(latit) , 2 ) + POW( RADIANS(posizione.coords.longitude) - RADIANS(long) , 2 ) ) , 3 ) AS distance FROM dd_loc WHERE TRUNCATE ( 6363 * sqrt( POW( RADIANS(posizione.coords.latitude) - RADIANS(latit) , 2 ) + POW( RADIANS(posizione.coords.longitude) - RADIANS(long) , 2 ) ) , 3 ) < 10 ORDER BY distance ASC";
	*/
	/*SELECT *, ( 6371 * acos( cos( radians(38.183333) ) * cos( radians( latit ) ) * cos( radians( long ) - radians(15.5668) ) + sin( radians(38.183333) ) * sin( radians( latit ) ) ) ) AS distance FROM dd_loc HAVING distance < 10 ORDER BY distance */
	<?php 

		include("connectionDB.php");
		
		$sel = "SELECT latit,long,citta, (6371 * acos(cos(rad2deg(38.183333)) * cos(rad2deg(latit)) * cos(rad2deg(long)-rad2deg(15.5668)) + sin(rad2deg(38.183333)) * sin(rad2deg(latit)))) AS distance FROM dd_loc HAVING distance < 5000 ORDER BY distance";
		$res = mysql_query($sel);
		while($dati = mysql_fetch_assoc($res)){
			echo "
				['$dati[citta]', $dati[latit], $dati[long]],
			";	
		}
	?>
      
    ];
    
    // Setup the different icons and shadows
    var iconURLPrefix = 'http://maps.google.com/mapfiles/ms/icons/';
    
    var icons = [
      iconURLPrefix + 'yellow-dot.png',
	  iconURLPrefix + 'red-dot.png',
    ]
    var icons_length = icons.length;
    
    
    var shadow = {
      anchor: new google.maps.Point(posizione.coords.latitude, posizione.coords.longitude),
      url: iconURLPrefix + 'msmarker.shadow.png'
    };

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 50,
      center: new google.maps.LatLng(posizione.coords.latitude, posizione.coords.longitude),
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      mapTypeControl: false,
      streetViewControl: false,
      panControl: false,
      zoomControlOptions: {
         position: google.maps.ControlPosition.LEFT_BOTTOM
      }
    });

    var infowindow = new google.maps.InfoWindow({
      maxWidth: 160
    });

    var marker;
    var markers = new Array();
    
    var iconCounter = 0;
	

    
    // Add the markers and infowindows to the map
    for (var i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map,
        icon : icons[iconCounter],
        shadow: shadow
      });

      markers.push(marker);

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
      
      if(i>0){iconCounter=1;}
      // We only have a limited number of possible icon colors, so we may have to restart the counter
      if(iconCounter >= icons_length){
      	iconCounter = 0;
      }
	  
    }

    function AutoCenter() {
      //  Create a new viewpoint bound
      var bounds = new google.maps.LatLngBounds();
      //  Go through each...
      $.each(markers, function (index, marker) {
        bounds.extend(marker.position);
      });
      //  Fit these bounds to the map
      map.fitBounds(bounds);
    }
    AutoCenter();
	}
  </script>

il problema è che la funzione non produce risultato. nella query non riesco a inserire le coordinate del mio punto, nè quelli presenti nel db. la mia tabella ha i campi latit e long di latitudine e longitudine.

chi può darmi una dritta perchè sono bloccato da un paio di giorni su questo codice.
 
Per cominciare:
PHP:
while($dati = mysql_fetch_assoc($res)){
			echo "
				['$dati[citta]', $dati[latit], $dati[long]],
			";	
		}

Questo ti produrrà un errore di sintassi con javascript perchè stamperà anche per l'ultimo elemento una virgola che non serve.
La puoi risolvere abbastanza semplicemente (inoltre non richiamare mai gli array a quel modo):
HTML:
var locations = [
	['Tu Sei Qui', posizione.coords.latitude, posizione.coords.longitude]

        // codice vario...
PHP:
        while($dati = mysql_fetch_assoc($res)){
			echo "
                               ,['", $dati['citta'], "', ", $dati['latit'], ", ", $dati['long'], "]
			";	
		}

Detto questo mi pare di capire che c'è un difetto logico nella tua applicazione: tu hai dei dati che ottieni tramite javascript, questi dati non puoi passarli ad una query SQL che agisce da php, anche se è scritta nella funzione javascript coinvolta per il semplice motivo che php viene parsato dal server a monte mentre javascript viene eseguito dal client a valle.

La soluzione ideale sarebbe di implementare una richiesta asincrona che passi i dati di latitudine e longitudine di riferimento ad uno script php che poi ti ritorna come risultato l'array di cordinate adiacenti di cui hai bisogno.
 
Ultima modifica:
scusami non sono molto pratico...io ad esempio ho fatto una prova, isolando la sola quety:

Codice:
$sel = "SELECT latit,long,citta, (6371*acos(cos(rad2deg(38.183333))*cos(rad2deg(latit))*cos(rad2deg(long)-rad2deg(15.5668))+sin(rad2deg(38.183333))*sin(rad2deg(latit)))) AS distance FROM dd_loc HAVING distance < 5000 ORDER BY distance";
$res = mysql_query($sel);

while($dati = mysql_fetch_assoc($res)){
	echo $dati["latit"]."-".$dati["long"];	
}

e non funziona nemmeno. nel codice js se la query la metto come "select + from dd_loc", funziona. solo che il problema di selezionare solo i dati le cui coordinate sono a una distanza di 5 km non me lo fa
 
Prova a controllare se ritornano errori da mysql:

PHP:
$sel = "SELECT latit,long,citta, (6371*acos(cos(rad2deg(38.183333))*cos(rad2deg(latit))*cos(rad2deg(long)-rad2deg(15.5668))+sin(rad2deg(38.183333))*sin(rad2deg(latit)))) AS distance FROM dd_loc HAVING distance < 5000 ORDER BY distance";
$res = mysql_query($sel);

#> Controllo Errori
if (!$res)
    echo 'MySql Errors(', mysql_errno(), '): ', mysql_error(), "\n\n";

while($dati = mysql_fetch_assoc($res)){
	echo $dati["latit"]."-".$dati["long"];	
}
 

Discussioni simili