2011-12-04 72 views
3

我想使用Google地圖創建商店定位器。使用PHP,MySQL和Google地圖創建商店定位器

我有一個旅遊目的地(與他們的座標)表和旅館(也與他們的座標)表的數據庫。

我希望用戶在加載倫敦塔的頁面之後有可能,例如,查看10公里範圍內的物體附近有哪些酒店,並使用標記在Google地圖上顯示結果。

到目前爲止,我只設法從與haversin配方數據庫中獲取的10公里範圍內的酒店並將其顯示爲文本:

$result = mysql_query("SELECT nume, poze, descriere, link, (
(
    ACOS(SIN(45.515038 * PI() /180) * SIN(latitudine * PI() /180) + 
      COS(45.515038 * PI() /180) * COS(latitudine * PI() /180) * 
      COS((25.366935 - longitudine) * PI() /180) 
    ) *180/PI() 
) *60 * 1.1515 * 1.609344 
) AS distance 
FROM `unitati` 
HAVING distance <= '10' 
ORDER BY distance ASC 
LIMIT 0 , 30"); 

我怎麼能上顯示它們作爲標記地圖?

我發現這個,我認爲它可以幫助我:http://code.google.com/intl/ro-RO/apis/maps/articles/phpsqlsearch.html,但它有一個不同的邏輯:用戶鍵入地址。

回答

2

這個例子接受你的查詢(你需要爲每個目標編輯45.515038和25.366935的lat/lng),並把它作爲一個JS數組輸出(如果你喜歡,你可以使它更正式的JSON )

然後循環遍歷該數組,爲每個數組製作標記並將它們放置在地圖上。最後,它爲每個添加一個點擊監聽器,以便顯示相關信息。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
<style> 
#map_canvas{width:500px;height:500px;} 
</style> 
</head> 

<body> 
<div id="map_canvas"></div> 
<script> 
<?php 
//you'll first need to connect to your db 
//you also have to edit the lat/lng in your SELECT statement to be that of your objective 
$result = mysql_query("SELECT latitudine, longitudine, nume, poze, descriere, link, (
(
    ACOS(SIN(45.515038 * PI() /180) * SIN(latitudine * PI() /180) + 
      COS(45.515038 * PI() /180) * COS(latitudine * PI() /180) * 
      COS((25.366935 - longitudine) * PI() /180) 
    ) *180/PI() 
) *60 * 1.1515 * 1.609344 
) AS distance 
FROM `unitati` 
HAVING distance <= '10' 
ORDER BY distance ASC 
LIMIT 0 , 30"); 
$c=0; 
echo "var data=["; 
while($markers=mysql_fetch_array($result)){ 
    if($c>0){echo ",";} 
    echo "['".$markers[0]."','".$markers[1]."','".$markers[2]."','".$markers[3]."','".$markers[4]."','".$markers[5]."','".$markers[6]."'"."]"; 
    $c++; 
} 
echo "];"; 
?> 
    //var data=[['45','-73','home','poz1','desc1','link1'],['43','-75','work','poz2','desc2','link2']]; 
    var places=new Array(); 
    var map; 
    var MyInfoWindow = new google.maps.InfoWindow({content: 'Loading...'}); 
    var bounds = new google.maps.LatLngBounds(); 
    var myOptions = { 
     zoom: 9, 
     mapTypeControl: false, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    map = new google.maps.Map(document.getElementById('map_canvas'),myOptions); 
    for(i=0;i<data.length;i++){ 
     var point=new google.maps.LatLng(data[i][0],data[i][1]); 
     var a = new google.maps.Marker({position: point,map: map, icon:'someHotelIcon.png'}); 
     a.lat=data[i][0]; 
     a.lng=data[i][1]; 
     a.nume=data[i][2]; 
     a.poze=data[i][3]; 
     a.desc=data[i][4]; 
     a.url=data[i][5]; 
     places.push(a); 
    } 
    for(i=0;i<places.length;i++){ 
     var point2=new google.maps.LatLng(places[i].lat,places[i].lng); 
     bounds.extend(point2); 
    } 
    map.fitBounds(bounds); 
    var objLoc=new google.maps.LatLng(45.515038,26.366935); 
    var objectiveMarker = new google.maps.Marker({position: objLoc,map: map, icon:'objectiveIcon.png'}); //---------------Marker for objective 
    for (var i = 0; i < places.length; i++) { 
     var marker = places[i]; 
     google.maps.event.addListener(marker, 'click', function() { 
     MyInfoWindow.setContent(this.nume+'<br/>'+this.desc+'<br/><a href=\"'+this.url+'\">link</a>'); 
     MyInfoWindow.open(map, this); 
     }); 
    } 
</script> 
</body> 
</html> 
+0

每個目標都有它'自己的PHP頁面,但我沒有「功能搜索locationsnear」像你說的。我只有一個查詢,這是我在問題中寫的一個問題,它告訴數據庫只檢索位於10公里範圍內的酒店。請更具體請 –

+0

只需在您的查詢中將緯度/液化天然氣(45.5和25.3)替換爲目標座標 –

+0

下面是一個示例頁面,幫助您開始 –

1

如果你打算做基於距離/地理定位的搜索使用MySQL的地理空間的東西。它比直接沙丁胺配方有效得多。

這些都只是一些片段,但他們應該幫助把你的道路上,以迷死:

首先你表將需要一個地理空間列,以保存您的緯度/經度,礦山被稱爲協調,是point型:

`coordinate` point NOT NULL, 

下一個你將需要添加一個地理空間索引:

SPATIAL KEY `coordinate` (`coordinate`) 

(這兩者都是我的表創建SQL SYN的一部分稅)。

此位將幫助您插入/緯度數據轉換成座標列:

$data['coordinate'] = ("GeomFromText('POINT({$data['longitude']} {$data['latitude']})')"); 

這一點就會將取代你的距離計算(如較大的SQL查詢的一部分):

$sql = str_replace(
      array('%LATITUDE%','%LONGITUDE%'), 
      array($latitude, $longitude), 
      '(GLength(LineString(coordinate ,Point(%LONGITUDE%, %LATITUDE%)))) AS distance' 
     ); 

上述查詢適用於歐幾里德幾何(即世界是平坦的),但世界並非如此,您應該使用下面的內容幫助縮小結果列表的範圍。要獲得真實的準確性和正確的排序,請使用這兩個SQL查詢所帶回的結果的半歧義或更好的公式。

這個位將作爲一個邊界矩形/盒子(anythng不在盒子內不會被返回 - 用它來代替HAVING distance <= '10',你會發現查詢更快 - 特別是有很多數據)。我的最大/最小/緯度計算只是一個例子,你可以做的更好:-):

 $minLat = $latitude - 0.5; 
     $maxLat = $latitude + 0.5; 
     $minLon = $longitude - 0.5; 
     $maxLon = $longitude + 0.5; 

     $sql = str_replace(
      array('%MINLAT%', '%MAXLAT%','%MINLON%', '%MAXLON%'), 
      array($minLat, $maxLat, $minLon, $maxLon), 
      "MBRCONTAINS(GeomFromText('POLYGON((%MINLON% %MAXLAT%,%MAXLON% %MAXLAT%,%MAXLON% %MINLAT%,%MINLON% %MINLAT%, %MINLON% %MAXLAT%))'), `coordinate`)" 
     ); 
+0

我發現haversin公式是一個更簡單的方法,考慮到我對這一切都是新的事實。我從一開始就不會有很多酒店,因此目前我認爲我會留在沙灘車公式中。我對谷歌地圖上酒店的視覺顯示感興趣,我該怎麼做。我懷疑它可以完成與商店定位器,但我需要一些提示 –

+0

很多都取決於硬件,但我發現簡單haversine是好幾千行,但以上的表現確實下降。如果你認爲你將獲得接近5萬以上的收入,那麼一定要看看GeoSpatial。 (不要擔心,你可以實現它後來沒有太多的痛苦)我從來沒有真正嘗試在谷歌地圖上顯示的東西,所以我不得不讓別人幫你在那 –

+0

我希望我將有50 000家酒店在我的數據庫:)爲開始我會很高興與幾個houndreds :) –

相關問題