2011-12-04 7 views
3

私はGoogleマップで店舗ロケータを作成したいと思います。PHP、MySQL、Google Mapsで店舗ロケータを作成する少し異なる

私は、TOURISTIC OBJECTSのテーブル(座標付き)とHOTELSテーブル(座標も含む)を持つデータベースを持っています。

ロンドン塔のページを読み込んだ後、半径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配列として出力する必要があります。 )

次に、その配列をループして、それぞれのマーカーを作成し、マップ上に配置します。最後に、それぞれにクリックリスナーを追加し、関連情報を表示します。

<!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

各目的はそれ 's独自のPHPページを持っている、しかし、私はuが言うように、「機能検索locationsnear」を持っていけない:最大/最小/緯度経度のための私の計算では、あなたがより良い:-)を行うことができ、一例であり。私は質問に書いたものだけを持っています。質問に書いたのは、10キロメートルの範囲にあるホテルだけを検索するデータベースです。 –

+0

各ページのクエリのlat/LNG(45.5と25.3)を目的の座標で置き換えてください –

+0

ここでは、始めるためのサンプルページ –

1

距離/地理情報ベースの検索を行う場合は、MySQLの地理空間的なものを使用します。それははるかに効率的なストレートhaversineの式です。

これらはほんの一部の抜粋ですが、彼らは素晴らしへのパスにあなたを置く助ける必要があります。

は、まず最初に、あなたのテーブル鉱山を座標と呼ばれ、タイプpoint上でされ、あなたの緯度/経度を保持するために地理空間列が必要になります:

SPATIAL KEY `coordinate` (`coordinate`) 

(これらの両方がSQLシンを作成し、私のテーブルの一部である:

`coordinate` point NOT NULL, 

はあなたの隣には、地理空間のインデックスを追加する必要があります税金)。

座標欄にあなたの緯度/経度データを挿入するのに役立ちます。このビット:

$sql = str_replace(
      array('%LATITUDE%','%LONGITUDE%'), 
      array($latitude, $longitude), 
      '(GLength(LineString(coordinate ,Point(%LONGITUDE%, %LATITUDE%)))) AS distance' 
     ); 
:この少しは(大きなSQLクエリの一部として)あなたの距離の計算値代わるだろう

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

上記のクエリーはユークリッドジオメトリに適しています(つまり、世界はフラットです)。世界はそうではありませんので、結果リストを絞り込むために以下を使用する必要があります。正確な順序と正しい順序付けを行うには、これらの2つのSQLクエリから返された結果についてhaversineまたはより良い式を使用します。

このビットは境界矩形/ボックスとして機能します(ボックス内にないものは返されません。これを使用して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式がはるかに簡単な方法であることを発見しました。私はこのすべてに新しいことを考えています。私は論理的に、当初は多くのホテルを持っていないので、現時点では私はhaversinの式にとどまると思う。私はGoogleマップ上のホテルの視覚的な表示に興味があった。私はそれが店のロケータで行うことができると思うが、私はいくつかのヒントが必要 –

+0

多くはハードウェアに依存しているが、私は平野haversineが数千の行のために大丈夫だったが、あなたが50,000+近くのどこかに行くと思うなら、間違いなくGeoSpatialを見てください。 (心配しないで、あまりにも多くの苦痛なしにそれを後で実装することができます)私は実際にGoogleマップ上のものを表示しようとしたことがないので、他の人にあなたを助けてもらわなければならないでしょう –

+0

私は50 000のホテル私のデータベース:)最初に私はいくつかのhoundredsに満足しているでしょう:) –

関連する問題