2013-03-08 42 views
1

在我的頁面上,當它加載它時,獲取您的位置並在您的位置設置一個標記,然後我希望它從我的數據庫加載所有標記並將它們放置在地圖上,但我只想加載1公里內的標記的位置。我試圖設置它,但我遇到了一些麻煩。我想只顯示特定半徑的地理位置內的標記?

所以標記從數據庫加載像這樣:

<?php while($stmt -> fetch()) { ?> 
var longi = "<?php echo $gLongitude; ?>"; 
var lati = "<?php echo $gLatitude; ?>"; 
var title = "<?php echo $gTitle; ?>"; 
setMarker(lati, longi, title); 
<?php } $stmt -> close(); $mysqli -> close();?> 

然後setMarker函數調用是這樣的:

function setMarker(lati, longi, title) { 
    var latLongMarker = new google.maps.LatLng(lati,longi); 
    marker = new google.maps.Marker({ 
     position: latLongMarker, 
     map: map, 
     draggable: false, 
     title: title 
    }); 
    arrMarkers.push(marker); 
} 

這一切都工作正常,花花公子,並加載所有標記從數據庫到地圖上,但我怎樣才能加載距離我1km的數據?我讀了about computeDistanceBetween(),但我找不到一個拯救我生命的例子。預先感謝大家。

我結束了工作,就一定能做到這一點的是結束了更容易和更快地在這裏處理你去爲任何人在未來尋找這樣的:

 <?php while($stmt -> fetch()) { ?> 
     var longi = "<?php echo $gLongitude; ?>"; 
     var lati = "<?php echo $gLatitude; ?>"; 
     var title = "<?php echo $gTitle; ?>"; 
     var content = 'Bus arrives at: ' + "<?php echo $gWeekdayDay; ?>"; 
     database.push({latitude: lati, longitude: longi, markerTitle: title, content: content}); 
     <?php } $stmt -> close(); $mysqli -> close();?> 

for (var i = 0; i < database.length; i++) { 
        createMarker(database[i].latitude, database[i].longitude, database[i].markerTitle, initialLocation, 
         database[i].content); 
       } 

function createMarker(lati, longi, title, myPosition, content) { 
    var latLongMarker = new google.maps.LatLng(lati, longi); 
    distanceCompare.push({position: latLongMarker, markerTitle: title}); 
    setMarker(myPosition, latLongMarker, title, content); 
} 

function setMarker(myPosition, latLongMarker, title, content) { 

     distance = google.maps.geometry.spherical.computeDistanceBetween(latLongMarker, myPosition); 
     console.log('Distance of '+latLongMarker+ 'and original position' + myPosition + 'Is equal to '+distance); 
      updateResults(); 
     if (distance < setDistance) { 
      addMarker(latLongMarker, title, content); 
      stopsfound++; 
      updateResults(); 
      console.log(content); 
     } 
} 

function addMarker(position, title, content) { 
    console.log('Adding Marker ' + content); 
    marker = new google.maps.Marker({ 
     position: position, 
     map: map, 
     title: title 
    }); 
    bindInfoWindow(marker, content); 
    markersArray.push(marker); 
} 
+0

使用,你會不得不看看地方圖書館?特別是componentRestrictions?可能對你有幫助https://developers.google.com/maps/documentation/javascript/places – lukeocom 2013-03-08 02:59:16

回答

0

首先,你需要創建一個表,例如,調用場所,並且這需要具有緯度和長度的字段。 然後,你需要創建一個獲得半徑(公里或MILLES)的地方查詢 這裏查詢

public function getRecents($nro_places, $lat='-33.45287', $lng='-70.58598') { 
    $query = Doctrine_Query::create(); 
    $query->select('p.*, (6371 * acos(cos(radians('.$lat.')) * cos(radians(m.lat)) * cos(radians(m.lng) - radians('.$lng.')) + sin(radians('.$lat.')) * sin(radians(m.lat)))) AS distance'); //this is all you need 
    $query->from('Places p, p.Maps m'); 
    $query->having('distance < 3'); //3kms 
    $query->where('status = 1'); //places enabled 
    $query->orderBy('p.created_at DESC, distance ASC'); 
    $query->limit($nro_places); 
    $result = $query->execute(array(), Doctrine_Core::HYDRATE_ARRAY); 

    return $result; 
} 

這裏有您需要的查詢查詢的一個例子的一個例子。 http://wiki.linuxservertech.com/faq/index.php?action=artikel&cat=4&id=7&artlang=en

希望這有助於

2

您將需要使用Haversine formaula。下面的代碼使用此公式使用PDO。您需要將其更改爲$mysqli

$stmt = $dbh->prepare("SELECT name, lat, lng, (6372.8 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) AS distance FROM mytable HAVING distance < 1 ORDER BY distance ASC LIMIT 0 , 20"); 
    // Assign parameters 
    $stmt->bindParam(1,$center_lat);//Coordinates of location 
    $stmt->bindParam(2,$center_lng);//Coordinates of location 
    $stmt->bindParam(3,$center_lat); 

該查詢在此DEMO

+0

我最終找到了一個更簡單的方法來做到這一點,它涉及到把它們放入一個數組,然後比較距離循環像我張貼在我原來的帖子,謝謝你 – Datsik 2013-03-08 22:39:42