2011-12-04 46 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 :) –

相关问题