Клуб API Карт

Помогите с написанием поиска ближайшего объекта на Яндекс.Карте

anna-vanna2012
18 декабря 2012, 13:06

Пытаюсь сделать поиск ближайших меток из базы api 2.0

использовала статью 

http://webmap-blog.ru/yandex-maps/poisk-blizhajshego-obekta-na-yandeks-karte

но там через api 1.1

пытаюсь переделать это все, но на моменте вывода результатов поиска адресов из базы застряла, т.к. сам запрос верный вроди(т.е. в базе выдает строки по запросу)  а на сайте не выводит список адресов (нет вывода данных в html никаких ни положительных, ни сообщения о том что ничего не найдено)

Не понимаю где проблемма ( Помогите кто чем может. Заранее огромное спасибо...

 

<script type="text/javascript">

var myMap, route, geoResult; 

 

jQuery.noConflict(); 

 

ymaps.ready(init);

 

function init () {

myMap = new ymaps.Map("myMap", {

center: [30.534660619140578, 50.43971804350223], 

zoom: 12, 

type: "yandex#map"

});

var button = new ymaps.control.Button({

         data: {

            

             image: '/images/set_dot_icon.png',

    

             title: 'Нажмите для определения Вашего местоположения'

         }

    }, {

        

        selectOnClick: false

    });

 

myMap.controls

.add("zoomControl")

.add("mapTools")

.add(button, {top: 5, left: 100})

.add(new ymaps.control.TypeSelector(["yandex#map", "yandex#satellite", "yandex#hybrid", "yandex#publicMap"]));

 

};

function showAddress (value) {

 

            var geocoder = ymaps.geocode(value);

geocoder.then(

function (res) {

myMap.geoObjects.add(res.geoObjects);

var firstGeoObject = res.geoObjects.get(0),

 bounds = firstGeoObject.properties.get('boundedBy');

 myMap.setBounds(bounds);

 radius = 200;

 searchLocationsNear(res.geoObjects.get(0).geometry.getCoordinates(), radius);

},

function (err) {

 

}

);

function searchLocationsNear(center,radius) {

 

clearLocations(); 

 

jQuery.getJSON("poisk.php", {center:center, radius: radius}, function(data){

 

if (data.status == 'OK') { 

var geoBounds = new ymaps.GeoObjectCollection();

 

var src_res="<p><strong>результаты поиска: </strong></p>";

src_res=src_res+'<p><strong>Найдено объектов: '+data.markers.length+'</strong></p>';

for (i = 0; i < data.markers.length; i++) {

 

var myPlacemark = new ymaps.Placemark(

 

[data.markers[i].lng, data.markers[i].lat], {

 

iconContent: '<div style="color:#ff0303;font-weight:bold">'+data.markers[i].name+'</div>',

 

balloonContent: '<strong>Адрес:</strong> '+data.markers[i].address

}, {

 

draggable: true,

 

hideIconOnBalloonOpen: false

}

);

myMap.geoObjects.add(placemark);

geoBounds.add(new YMaps.GeoPoint(data.markers[i].lat,data.markers[i].lng));

src_res=src_res+'<p><a href="#" onClick="return go_to('+data.markers[i].lat+', '+data.markers[i].lng+",'"+data.markers[i].name+"','"+data.markers[i].address+"','"+data.markers[i].id+"');"+'\">'+data.markers[i].name+'</a><br>'+data.markers[i].address+'</p>';

}

myMap.setBounds(geoBounds);

 

}

else

{

var src_res = '<p><strong>результаты поиска</strong></p><font color="red">По Вашему запросу объектов на карте не найдено</font>';

}

 

jQuery('#result').html(src_res);

 

});

 

}

 

function go_to(lat,lng,name,address,id){

myMap.setCenter(new YMaps.GeoPoint(lat,lng),17);

myMap.removeAllOverlays();

var placemark=new YMaps.Placemark(new YMaps.GeoPoint(lat,lng));

placemark.name='<div style="color:#ff0303;font-weight:bold">'+name+'</div>';

placemark.description = '<strong>Адрес:</strong> '+address+'</div></div>';

myMap.addOverlay(placemark);

placemark.openBalloon();

return false;

}

 

function clearLocations() {

 

 

myMap.removeAll();

 

firstGeoObject = 0;

 

jQuery('#result').html('');

 

}

 

    }

 

</script>

 

poisk.php

<?php

 

$sdb_name = "localhost";

$user_name = "****";

$user_password = "***";

$db_name = "*****";

 

// соединение с сервером базы данных

if(!$link = mysql_connect($sdb_name, $user_name, $user_password))

{

  echo "<br>Не могу соединиться с сервером базы данных<br>";

  exit();

}

 

// выбираем базу данных

if(!mysql_select_db($db_name, $link))

{

  echo "<br>Не могу выбрать базу данных<br>";

  exit();

}

 

mysql_query('SET NAMES utf8');

 

header('Content-Type: application/json; charset=utf-8');

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {

 

$center = $_GET["center"];

 

$exp_str1 = explode(",", $center);

 

$center_lat = $exp_str1[0];

$center_lng = $exp_str1[1];

$radius = 50;

 

$json = '{markers:['."\n";

 $query = sprintf(" SELECT id, address, name, lat, lng, ( 6371 * acos( cos( radians(30.51759) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(50.43306) ) + sin( radians(30.51759) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20",

 mysql_real_escape_string($center_lat),

  mysql_real_escape_string($center_lng),

  mysql_real_escape_string($center_lat),

  mysql_real_escape_string($radius));

$result = mysql_query($query);

 

if (!$result) {

  die("Invalid query: " . mysql_error());

}

if(mysql_num_rows($result)>0)

{

while ($row = mysql_fetch_array($result)){

 

$json.= "\n".'{'.'"id": "'.$row['id'].'",';

 

$json.= '"name": "'.$row['name'].'",';

 

$json.= '"address": "'.htmlspecialchars($row['address']).'",';

 

$json.= '"distance": "'.$row['distance'].'",';

 

$json.= '"lat": "'.$row['lat'].'",';

 

$json.=  '"lng": "'.$row['lng'].'"';

 

$json.= '},';

 

}

 

$json = substr($json, 0,-1);

 

echo  $json;

 

echo '], ', "\n",  '"status": "OK"', "\n", '}';

 

}

else

{

echo '{"status": "false"}';

}

 

}

 

?>

 

9 комментариев
Подписаться на комментарии к посту

разобралась результаты выводит по на карту не наносит( не работает фукнция удаления предыдущих результатов поиска myMap.geoObjects.remove(firstGeoObject); выбивает ошибку Uncaught TypeError: Cannot read property 'id_13558277365292305' of undefined

не понятно откуда взялся айдишник...

В таких задачах лучше использовать свою коллекцию:

var myCollection = new ymaps.GeoObjectCollection();
myMap.geoObjects.add(myCollection); //добавление коллекции на карту.


После все операции по добавлению / удалению меток производить уже с myCollection. В этом случае, для удаления всех меток (например, предыдущих результатов поиска), можно использовать метод removeAll() : 

myCollection.removeAll();

Спасибо) а если просто метку удалить с старом апи было myMap.removeOverlay(geoResult); а как по новому? Не совсем понятно просто...

если метка была добавлена в myMap.geoObjects, тогда методом remove

myMap.geoObjects.remove(geoResult);

var myMap, route, firstGeoObject; 

метку добавила вот так

  // Удаление предыдущего результата поиска

 myMap.geoObjects.remove(firstGeoObject);

             // Запуск процесса геокодирования

             geocoder = ymaps.geocode(value);

geocoder.then(

function (res) {

myMap.geoObjects.add(res.geoObjects);

firstGeoObject = res.geoObjects.get(0),

bounds = firstGeoObject.properties.get('boundedBy');

 myMap.setBounds(bounds);

},

function (err) {

// обработка ошибки

}

);

так понимаю что удалять предидущую метку после нового поиска вот так

 myMap.geoObjects.remove(firstGeoObject);

но тогда ошибка Uncaught TypeError: Cannot read property 'id_13558277365292305' of undefined

вы ее не добавили на карту

вы добавляете все результаты

myMap.geoObjects.add(res.geoObjects);

надо удалять прямо перед добавлением, предварительно проверив что она есть

 

function (res) {

    firstGeoObject && myMap.geoObjects.remove(firstGeoObject);

    myMap.geoObjects.add(firstGeoObject = res.geoObjects.get(0));

    myMap.setBounds(firstGeoObject.properties.get('boundedBy'));

}, 

...

Спасибо огромное, поняла ))

Если можно еще вопрос, по поводу создания своей кнопки с помощью которой пользователь указывает на карте свое местоположение.

Создала var button = new ymaps.control.Button({

         data: {

             // Зададим иконку для кнопки

             image: '/images/set_dot_icon.png',

             // Текст на кнопке.

             

             // Текст всплывающей подсказки.

             title: 'Нажмите для определения Вашего местоположения'

         }

А какая функция это делает (определяет местоположение клика инструментом на карте) не знаю... В какую сторону копать?

Спасибо )

в следующий раз открывайте лучше новую тему.

пример кнопки геолокации мы размещали в блоге