Создание локатора магазина с PHP, MySQL и Google Maps немного отличается - PullRequest
3 голосов
/ 04 декабря 2011

Я хочу создать магазин с помощью Google Maps.

У меня есть база данных с таблицей ТУРИСТИЧЕСКИХ ОБЪЕКТОВ (с их координатами) и таблицей ОТЕЛЕЙ (также с их координатами).

Я хочу, чтобы у пользователя была возможность после загрузки страницы Лондонского Тауэра, скажем, увидеть, какие отели находятся рядом с объектом в радиусе 10 километров, и отобразить результаты на Картах Google с маркерами.

До сих пор мне удалось только найти отели в 10-километровом диапазоне из базы данных с формулой haversin и отобразить их в виде текста:

$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 ]

2 голосов
/ 04 декабря 2011

Этот пример берет ваш запрос (и вам нужно отредактировать 45.515038 и 25.366935 с широтой / долготой для каждой цели) и вывести его в виде массива 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>
1 голос
/ 05 декабря 2011

Если вы собираетесь выполнять поиск на основе расстояния / геолокации, используйте геопространственные данные MySQL.Это гораздо эффективнее, чем прямая формула haversine.

Это всего лишь некоторые фрагменты, но они должны помочь вам встать на путь удивительности:

Прежде всего вашему столу понадобится геопространственный столбец для хранения широты / долготы, мой называется координатой инаходится на типе point:

`coordinate` point NOT NULL,

далее вам нужно будет добавить геопространственный индекс:

SPATIAL KEY `coordinate` (`coordinate`)

(оба они являются частью моей таблицы, создают синтаксис sql).

Этот бит поможет вставить данные широты / долготы в столбец координат:

$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'
        );

Приведенный выше запрос хорош для евклидовой геометрии (т. Е. Мир плоский), но мир не так, поэтому вам следует использовать приведенное ниже, чтобы помочь сузить список результатов.Для реальной точности и правильного упорядочения используйте формулу haversine или лучше для результатов, которые возвращаются из этих двух SQL-запросов.

Этот бит будет действовать как ограничивающий прямоугольник / прямоугольник (что-либо, находящееся вне поля, не будетвозвращенный - используйте его для замены HAVING distance <= '10', вы найдете запрос быстрее - особенно с большим количеством данных).Мои расчеты для max / min lat / lon являются лишь примерами, вы можете сделать лучше :-):

        $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`)"
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...