Клуб API Карт

Найдено на тему «PHP»:
Возможность реализации серверной части LoadingObjectManager или RemoteObjectManager на PHP
Александр Копосов
10 января 2017, 15:19

Приветствую всех! 

Столкнулся с проблемой реализации серверной части LoadingObjectManager или RemoteObjectManager.

Общая картина: на сайте есть карта; на неё из базы загружаются десятки тысяч меток; используется ObjectManager и PieChartClusterer. Алгоритм такой: Пользователь задаёт фильтр, какие метки ему нужны; из базы загружаются соответствующие данные и формируется JSON; этот JSON скармливается ObjectManager'у; ObjectManager загружается на карту.

И всё бы хорошо, но первоначальная загрузка огромного числа меток занимает 100500 лет (т.е. загрузка довольно долгая).

Как я понимаю, лучше бы использовать LoadingObjectManager или RemoteObjectManager, которые бы позволяли подгружать метки, так скажем, по мере их появляемости в зоне видимости, а не сразу все, но отображать видимые (как делает ObjectManager). Про активные области я пока даже не заикаюсь.

Собственно, сама проблема:

Я читал документацию по "Работе с большим числом объектов", а также статью на Хабре и видел там Проект на гитхабе с примером реализации серверной части для RemoteObjectManager.

Может быть (скорее всего) я чего-то не так понял (ну или вообще не понял), но возможна вообще серверная сторона не на Node.js (как в примере), а на PHP?

Буду признателен за какой-нибудь примерчик, ну или тыканье носом в какую-нибудь статейку, где это дело рассматривается. Я ничего подобного не смог найти на просторах Интернета.

2 комментария
RemoteObjectManager,LoadingObjectManager,objectManager,множество объектов,PHP
Видимые объекты
webolution
21 декабря 2015, 16:51

Добрый день,
есть карта с базой 1000 точек. все через ajax + json и objectManager. Поиск по карте работает.
Встает вопрос как быть с 10 000 точек или 100 000 точек (вывод настроен не только на карту а еще и в список под картой).

Так как сейчас мы загружаем через json сразу все точки! а потом ищем по карте и показываем в результате только видимые объекты objectManager, как сделать запрос в php сразу по нужным точкам и формировать json с гораздом меньших объемом данных.
пример что то типа
http://www.mediacatalog.ru/

при изменениии зума или координат карты, эти данные оотправляются на сервер, это понятно как сделать. но вот как понять какие объекты отобрать? если objectManger в js а нам надо в базе через php.
спасибо 

7 комментариев
PHP,API 2.1,ObjectManager
Как с одной кнопки запустить две функции маршрутизатора?
С. А.
28 мая 2015, 12:42

 

Привет, друзья!

Суть такая: есть поле ввода "start2"

и кнопкой с id "search_route2" 

построение маршрутизатора идет по точкам  

start_p, end_p

Сообщается и время и длина пути:  time2 и resmarshrut2


ВОТ фрагмент кода:

 

$('#search_route2').submit(function () {

var start_p = $("#start2").val();

var end_p = [<?php echo $geolocation; ?>];

ymaps.route(

                   // Список точек, которые необходимо посетить

                   [start_p, end_p], {

                // Опции маршрутизатора

                mapStateAutoApply: true // автоматически позиционировать карту

            }).then(function (router) {

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

route = router;

                myMap.geoObjects.add(route);

$("#resmarshrut2").empty();

$("#resmarshrut2").append('Расстояние: '+route.getHumanLength());

var sec = route.getJamsTime() ;

var h = Math.floor(sec/3600) ;

var min = Math.floor((sec-h*3600)/60) ;

$("#time2").empty();

$("#time2").append('Время в пути: '+h+' час. '+min+' мин. ');

             }, function (error) {

                alert("Возникла ошибка: " + error.message);

            });

return false;

});

 

 

Как сделать, чтобы с той же самой кнопки запускалось гекодирование  - полученный из поля ввода start2

выводились геокоординаты в поле resstart

предположение такое - нужно добавить:

 

$("#searchmap").click(function () { 

var address = $('input[name="start2"]').val();

ymaps.geocode(address, {results: 1 }).then(function (res) {            

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

                // Координаты геообъекта.

                // coords = firstGeoObject.geometry.getCoordinates(), 

coord_lat = firstGeoObject.geometry.getCoordinates()[0],

coord_lon = firstGeoObject.geometry.getCoordinates()[1],

});

$("#resstart").empty(); 

$("#resstart").append('Точка старта: '+coord_lat+' '+coord_lon); 

})

 

 

 

Пробовал в разные места первого фрагмента кода "ввернуть" второй, но не работает(((

 

 

2 комментария
PHP,API 2.1,маршрутизация,геокодирование
yandex карта отображается как текст
Phantom911
26 мая 2015, 17:47

Добрый день!

 

карта отображается как текст

 

<script type="text/javascript" charset="utf-8" src="https://api-maps.yandex.ru/services/constructor/1.0/js/?sid=FvjYEA4O5xSKnhx7q5AYe6HMBH6YvnRD&width=600&height=450"></script>

 

либо так

 

© ЯндексОшибка на карте? · Условия использованиямирстранагородулицадомСхема СхемаСпутникГибридНародная карта

 

до этого все было ок, подскажите пожалуйста, как исправить?

9 комментариев
PHP,конструктор
Не отображается карта во всплывающем окне
Владимир Филиппов
21 мая 2015, 20:11

Здравствуйте! У меня на сайте test.gcardrus.net при нажатии на логотип какой-нибудь компании всплывает окно с информацией о ней. В том числе там должна быть и карта с меткой адреса.

Информация о компании строится в подгружаемом через jquery.load() файле.

Вот код построения карты (пишу на всякий случай):

 

<div id="about_company_map" class="about_company_map">

</div>

 

<script>

ymaps.ready(function() {

var myMap = new ymaps.Map('about_company_map', {

zoom: 16,

controls: ['zoomControl'],

behaviors: ['default', 'dblClickZoom']

        });

<? if (empty($rds[0]['geo_coords']) {?>

ymaps.geocode('<? echo $rds[0]['address'] ?>', {

results: 1 // Если нужен только один результат, экономим трафик пользователей

}).then(function (res) {

            // Выбираем первый результат геокодирования.

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

            // Координаты геообъекта.

coords = firstGeoObject.geometry.getCoordinates();

 

var point = new ymaps.GeoPoint(coords);

myMap.setCenter(point);

 

MyIconContentLayout = ymaps.templateLayoutFactory.createClass(

'<div style="color: #000000; font-size:10px; padding-left:2px; padding-bottom:2px;">{{ properties.geoObjects.length }}</div>');

var myPlacemark = new ymaps.Placemark(coords, 

{balloonContentBody: '<div class="logo_baloon"><img class="" src="/images/company/163/small/mini.jpg" alt="" /></div>',

clusterCaption: 'метка <strong></strong>'

},

{ iconLayout: 'default#image', 

 iconImageHref: '/images/new_design_2015/icons/na_karte_h40.png',

 iconImageSize: [27, 40],

 iconImageOffset: [-20, -62]

}

);

 

myMap.geoObjects.add(myPlacemark);

 

});

<? } else { ?>

myMap.setCenter(<?=$rds[0]['geo_coords']; ?>);

MyIconContentLayout = ymaps.templateLayoutFactory.createClass(

'<div style="color: #000000; font-size:10px; padding-left:2px; padding-bottom:2px;">{{ properties.geoObjects.length }}</div>');

var myPlacemark = new ymaps.Placemark([<?=$rds[0]['geo_coords']; ?>], 

{balloonContentBody: '<div class="logo_baloon"><img class="" src="/images/company/163/small/mini.jpg" alt="" /></div>',

clusterCaption: 'метка <strong></strong>'

},

{ iconLayout: 'default#image', 

 iconImageHref: '/images/new_design_2015/icons/na_karte_h40.png',

 iconImageSize: [27, 40],

 iconImageOffset: [-20, -62]

}

);

 

myMap.geoObjects.add(myPlacemark);

<? }?>

});

</script>

 

  

$rds[0]['geo_coords'] - это берётся из базы данных.

И ещё у меня выдаёт ошибку:

"NetworkError: 500 Internal Server Error - http://test.gcardrus.net/actions/get_company_data.php"

3 комментария
PHP,API 2.1
Jquery,JSON,маркеры
diasbaikoshkarov
13 мая 2015, 15:07

Добрый день, я только недавно начал работать с JAVASCRIPT и у меня возникла проблема с yandex maps, используя их пример отрисовки на карту маркеров с JSON, считываются координаты с базы, для отображения передвижения, функция отрисовки происходит по интервальному таймеру, но перед этим нужно удалять старые маркеры, что собственно у меня и не выходит. Может кто-нибудь уже сталкивался с этим, буду признателен за помощь.

Это код для отрисовки на карту

 
ymaps.ready()
    .done(function (ym) {
        var myMap = new ym.Map('YMapsID', {
            center: [55.751574, 37.573856],
            zoom: 10
        });
       var timerJ = setInterval(function()
       {
           jQuery.getJSON('drivers.php', function (json) {
            var geoObject = ym.geoQuery(json)
                .addToMap(myMap)
                .applyBoundsToMap(myMap, {
                    checkZoomRange: true
                });
               
        });
       
        }, 5000);    
    }); 
 


А это для считывания с базы

<?php
$db = mysqli_connect ("localhost", "esmart_server", "FvthbrfywsGbljhfcs!@#", "esmart_db");
 
$query_ru = "SELECT id, lat, lan  FROM es_gps_log";
$result = mysqli_query($db, $query_ru);
$rowct = $result->num_rows;
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
$i=0;
 
echo ('{ "type": "FeatureCollection", "features":[');
 
    do {
        $i++;  
        echo ('{ "type":"Feature", "geometry":{ "type":"Point", "coordinates":["'.$row[0].'","'.$row[1].'"], "properties":{"balloonContent":"comment","hintContent":"comment"}}}');
    if ($i<$rowct) {echo (',');}
        }  
    while ($row = mysqli_fetch_array( $result,MYSQLI_BOTH));
 
echo ('] }');
   
?>

 

7 комментариев
jQuery,Javascript,пользовательское соглашение,API 2.1,PHP
Доброго дня. Как можно выполнить include php для вывода его в balloonContentBody: [ тут мой include php ],
laufercnc
25 апреля 2015, 13:35

Понятно, конечно что это серверный язык это клиентский, но тем не менее.

Пробовал include php просто разрешая выполнять через htaccess мой код пшп в js файлах, не пашет.

Понимаю что нужен или JSON или AJAX но пока абсолютно не разбираюсь в них. Можно не инклудить результат файла PHP ((http://job.cnc.im/russia/_tpl/hireme/city/19.php))) а вставить код в js ))

 

Прошу помощи, как передать из БД данные в контент балуна другим методом?

  

 

--------------------------------

ymaps.ready(init);

 

myPlacemark = new ymaps.Placemark([55.75012148, 37.62277965], {

            

            balloonContentHeader: "Вакансии в г.Москва (Московская область)",

               balloonContentBody: [

 ============================

$connect_db = mysql_connect("laufer.mysql.ukraine.com.ua", "ХХХХХХ", "ХХХХХХХ");

mysql_select_db("laufer_jobberru", $connect_db);

$posts = mysql_query("SELECT * FROM jobs", $connect_db);

$num_rows = mysql_num_rows( $posts );

echo "Количество работ: $num_rows \n";

============================

        ],

           

            hintContent: "Вакансии в г.Москва (Московская область)"

        });

 

}

 

 

3 комментария
PHP
Добавление меток
Денис Артамонов
16 марта 2015, 17:40

Добрый день!

имеется php-массив  адресов

нужно разместить на карте метки в соответствии с адресами из массива

у каждой метки будет уникальный цвет и балун

 

подскажите, пример или как лучше это реализовать

 

Мой небольшой набросок кода, его результат здесь http://portal.vsistem.ru/maps/personal_map_tasks/placemarks.php

 

---------------------

<script src="http://api-maps.yandex.ru/2.1/?lang=ru_RU"></script>

<script>arAddress = []</script>

 

<?

$arAddress = array(

'Новосибирск демакова 23',

'Новосибирск Ильича 5',

'Новосибирск, ул. Семьи Шамшиных, 30'

);

 

for($i=0; $i<count($arAddress); $i++){

echo '<script>arAddress['.$i.']="'.$arAddress[$i].'"</script>';

}

 

?>

 

<script>

function init() {

myMap = new ymaps.Map('map', {

center: [55.030199, 82.92043],

zoom: 10

});

 

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

 

counter = 0;

 

ymaps.geocode(arAddress[i], {results: 1}).then(function (res) {

 

Address = arAddress[counter];

 

firstGeoObject = res.geoObjects.get(0),

coord_lat = firstGeoObject.geometry.getCoordinates()[0],

coord_lon = firstGeoObject.geometry.getCoordinates()[1];

 

 

myMap.geoObjects.add(new ymaps.Placemark([coord_lat, coord_lon], {

balloonContent: Address

},

{

iconColor: "green"

}));

 

arCoords[arCoords.length] = "["+coord_lat+", "+coord_lon+"]";

counter++;

});

 

}

 

 

}

ymaps.ready(init);

</script>

<div id="map" style="width: 100%; height: 100%"></div>

 

2 комментария
PHP,API 2.1,геокодирование
Загрузка меток через ajax из php
wiki@svrt.ru
18 февраля 2015, 11:07

Загружаю метки методом $.ajax({url: "out_3.php"....

Когда прописывал путь к json-файлу - всё было хорошо.

Сделал в php формирование json для одной метки - тоже получилось, а для двух меток - не получается. Где ошибка?
<?php
$s1='{"type": "Feature", "id":1, "geometry": {"type": "Point", "coordinates": [55, 38]}, "properties": {"balloonContent": "Russia", "clusterCaption": "None", "hintContent": "Russia"}},';
$s2='{"type": "Feature", "id":2, "geometry": {"type": "Point", "coordinates": [57, 48]}, "properties": {"balloonContent": "Russia", "clusterCaption": "None", "hintContent": "Russia"}}';
$s3=$s1.$s2;
echo($s3);
?>

Что не так? Одна выводится, а две нет.

Позже, будет, конечно json_encode, но пока хочу так научиться формировать для ajax массив из нескольких меток.

5 комментариев
PHP,API 2.1,AJAX,JSON
Разобрался с AJAX и вроде все отлично, но что то пошло не так, помогите кто чем сможет.
Удалённый пользователь
11 февраля 2015, 18:32

 

это основная страница

<html>

<head>

    <title>Примеры. Ломаные</title>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <!-- Если вы используете API локально, то в URL ресурса необходимо указывать протокол в стандартном виде (http://...)-->

<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>

<script type="text/javascript" src="jquery.js"></script>

    <style>

        html, body, #map {

            width: 100%; height: 100%; padding: 0; margin: 0;

        }

    </style>

         

<script type="text/javascript">

        function show()  

        {  

            $.ajax({  

                url: "time.php",  

                cache: false,  

                success:function(msg){

try {

            var result = jQuery.parseJSON(msg);

            alert("result.coordinates="+result.coordinates);

//result.lat - необходимая переменная

//result.lon - необходимая переменная

//result.time - необходимая переменная

 

//что больше нравится

 

/*alert("result.lat="+result.lat);

alert("result.lon="+result.lon);

alert("result.time="+result.time);*/

 

/*console.log("result.lat="+result.lat);

console.log("result.lon="+result.lon);

console.log("result.time="+result.time);*/

}

catch(e) {

alert("Error.\n"+msg);

}

        }

    });

        }  

      

        $(document).ready(function(msg){  

            show();  

            setInterval('show()',1000);  

        });  

    

 

ymaps.ready(init);

function init() {

    // Создаем карту.

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

            center: [52.52395, 103.780975],

            zoom: 10

        });

 

    // Создаем ломаную, используя класс GeoObject.

    var myGeoObject = new ymaps.GeoObject({

            // Описываем геометрию геообъекта.

            geometry: {

                // Тип геометрии - "Ломаная линия".

                type: "LineString",

                // Указываем координаты вершин ломаной.

                coordinates: [alert("result.coordinates="+result.coordinates)]

                

            },

            // Описываем свойства геообъекта.

            properties:{

                // Содержимое хинта.

                hintContent: "Я геообъект",

                // Содержимое балуна.

                balloonContent: "Маршрут"

            }

        }, {

            // Задаем опции геообъекта.

            // Включаем возможность перетаскивания ломаной.

            draggable: false,

            // Цвет линии.

            strokeColor: "#FFFF00",

            // Ширина линии.

            strokeWidth: 5

        });

 

        // Добавляем линии на карту.

    myMap.geoObjects

        .add(myGeoObject)

    }

 

</script>

</head>

<body>

  

<div id="map"></div>

</body>

</html>

 

Это страница с формированием данных

 

<?php

   function my_sql_connection($server, $user, $pass, $dbname) {

    // Подключаемся к базе

   mysql_connect($server, $user, $pass)

    or die ("Не удается подключиться к серверу: ".  mysql_error());

   mysql_select_db($dbname)

    or die ("Не удается подключиться к базе: ".  mysql_error());

   }

   

   $server = "localhost";

   $user = "****";

   $pass= "****";

   $dbname = "points";

   

  my_sql_connection($server, $user, $pass, $dbname); // Подключаемся к базе данных

 

   $tablename = "****";

   

   $i= mysql_query("SELECT Latitude, Longitude FROM $tablename ORDER BY id") or die ("Не удается подключиться к базе: ".  mysql_error());

   

$coordinates = array();

while ($row = mysql_fetch_assoc($i)) {

$currentCoordinates = array();

$currentCoordinates['lon'] = $row["Longitude"];

$currentCoordinates['lat'] = $row["Latitude"];

 

$coordinates[] = $currentCoordinates;

//$Latitude = json_encode($row["Latitude"]).",";

//$Longitude = json_encode($row["Longitude"]);

//$coordinates = "[".$Latitude." ".$Longitude."], ";

 

}

json_encode($coordinates);

 

?>

 

9 комментариев
PHP,API 2.1,AJAX
Точность при массовом геокодировании
wiki@svrt.ru
4 февраля 2015, 18:07

При геокодировании находится самый релевантный результат.

Но возможно, что из нескольких похожих посёлков будет найден не самый правильный.

Можно как-то управлять точностью запросов?

Чтобы брать результат только в том случае, если найден только один единственный результат?

Делаю так:

        $xml = simplexml_load_file('http://geocode-maps.yandex.ru/1.x/?geocode='.urlencode($row["address"]));
        // Если геокодировать удалось, то записываем в БД
        $found = $xml->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found;
Специфика ещё такая, что при поиске будут использоваться не только города и области, но и уезды с губерниями.

8 комментариев
PHP,геокодирование
Вывод блока "Загрузка данных" до полной загрузки объектов на карте v.2.1
4@п@еFF $ер}|{
3 февраля 2015, 07:27

Всем добрый день. Ищется решение такого вопроса.

Данные на карту выводятся через json. Как реализовать показ блока "Загрузка данных" до полной загрузки всех объектов на карте, после чего блок "Загрузка данных" убрать.

8 комментариев
PHP,API 2.1,JSON
Вредные советы
D.Abramov8
31 января 2015, 01:29

Доброй ночи!
Тут читаю вредные советы на хабре...и что-то запутался...
Совет:
"Идеальный вариант – это печатать конструкции JavaScript с помощью PHP"
полезный или вредный?

С уважением,
Дмитрий

2 комментария
PHP,Javascript,статьи
Правовой и технический вопрос: использование геокодера и route из php скрипта
wakeupkids
25 января 2015, 19:16

Есть сайт интернет магазина. Стоимость доставки высчитывается исходя из расстояния. Предполагается следующий алгоритм:

 

1. Пользователь вводит адрес

2. PHP скрипт получает координаты от геокодера

3. PHP скрипт получает расстояние от точки вывоза до точки пользователя

4. Юзеру выводится стоимость доставки

 

Вопрос 1: можно ли с помощью PHP получать расстояние пути от одной точки до другой? т.е. использовать функционал route вне js

Вопрос 2: легально ли будет исползование api из PHP без показа карты?

10 комментариев
API 2.1,расчет стоимости доставки,координаты,маршрутизация,PHP,пользовательское соглашение,геокодирование
Удаление метки
wiki@svrt.ru
25 января 2015, 14:13

Для добавления меток я использовал вот этот метод:

http://webmap-blog.ru/yandex-maps/yandeks-karta-na-vashem-sajte-s-vozmozhnostyu-dobavleniya-metok-polzovatelyami-api-yandeks-kart-v2-x-prodolzhenie

Что и где нужно добавить, чтобы удалить метку?

Я нашёл пример, где при клике по метке появляется ссылка "удалить".

Я смог добавить в каждую метку ссылку на удаление:

                    balloonContentBody: '<a href="#" class="btn btn-warning">удалить метку</a>'

Но этот метод не подходит, т.к. у меня должна остаться в каждой метке своя индивидуальная ссылка.

А ссылка/кнопка удаления тогда должна появляться при клике правой мышкой или пусть будет вообще отдельная кнопка удаления на форме для выбранной метки.

4 комментария
MySQL,PHP,API 2.1,метка
API Яндекс карты для WordPress
Выгодная Поездка
7 января 2015, 21:57

Есть плагин карт для WP. Карты работают Кнопки как ставить разобрался, а вот как и куда вставить Расчёт стоимости маршрута не пойму.

 

Помогите пожалуйста с Нового года сижу изучаю и не пойму как сделать. На HTML разобрался с примером, а здесь не могу.

 

ПОМОГИТЕ ПРОШУ ВАС ПОЖАЛУЙСТА

 

2 комментария
PHP,расчет стоимости доставки,WordPress,модули
LoadingObjectManager серверная часть с использование MySQL + PHP
losangelescarroll
2 января 2015, 12:53

В базе данных имеется таблица точек с координатами вида 'POINT(X Y)',0

Как составить MySQL-запрос, который извлечёт все записи из этой таблицы с точками, которые входят в область видимости этой карты?

1 комментарий
MySQL,PHP,API 2.1,менеджер объектов
Корректировка скрипта вывода метки на карту
ImSergeyS
13 декабря 2014, 18:51

Есть php файл, используемый для вывода меток на карту

 

<?php

header('Content-Type: text/html; charset=utf-8');

require ("config.php");

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

 

$result = mysql_query("SELECT * FROM addresses");

if(mysql_num_rows($result)>0)

{

while ($mar = mysql_fetch_array($result))

{

$json =  array(name=>$mar['name'], descriptions=>$mar['descriptions'], lat=>$mar['cx'], lng=>$mar['cy']);

$markers[] = $json;

}

}

$points = array(markers=>$markers);

echo json_encode($points);

}

?>

 

Все хорошо работает, только решил изменить структуру таблицы в БД. Теперь у меня не 2 столбца cx и cy, а один coords. Так вот вопрос в том, как подправить код, чтобы метка выводилась? А то вроде задача легкая, а никак не получится(

3 комментария
PHP,координаты
Как сделать кластеризацию объектов на Яндекс Картах 2.1?
4@п@еFF $ер}|{
6 декабря 2014, 10:03

День добрый всем!
Помогите плиз разобраться, полночи голову ломаю, я новичок в этом.

Есть JS-скрипт кластеризатора карт Яши. Все вроде нормально. Кластеризация проходит, но вот при интеграции в скрипт выводит во всех точках один и тот же объект (данные объекта).
Более подробно.
У меня CMS на смарти, решил прикрутить к новостям карты. Все сделал как надо, теперь осталось решить вопрос с выводом аннотаций новостей на карте. Без кластеризации все выводит нормально, но, на одно квартале есть и по 5 новостей, и без кластеризации получается полная чушь, не видно домов и т.п.

Нашел скрипт, вставил в шаблон, прописал переменными координаты, а как вывести это на карту не могу разобраться. Они по сути выводятся все, с разными координатами, только вот на всех точках новость одна и та же.
 

 Введите содержимое врезки

 
Помогите плиз. В API ничего не могу понять. Вот сам скрипт. Заранее благодарю.
<code>
<script src="https://api-maps.yandex.ru/2.1/?lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
            center: [55.751574, 37.573856],
            zoom: 9,
            behaviors: ['default', 'scrollZoom']
        }),
        /**
         * Создадим кластеризатор, вызвав функцию-конструктор.
         * Список всех опций доступен в документации.
         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Clusterer.xml#constructor-summary
         */
            clusterer = new ymaps.Clusterer({
            /**
             * Через кластеризатор можно указать только стили кластеров,
             * стили для меток нужно назначать каждой метке отдельно.
             * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/option.presetStorage.xml
             */
            preset: 'islands#invertedVioletClusterIcons',
            /**
             * Ставим true, если хотим кластеризовать только точки с одинаковыми координатами.
             */
            groupByCoordinates: false,
            /**
             * Опции кластеров указываем в кластеризаторе с префиксом "cluster".
             * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ClusterPlacemark.xml
             */
            clusterDisableClickZoom: true,
            clusterHideIconOnBalloonOpen: false,
            geoObjectHideIconOnBalloonOpen: false
        }),
        /**
         * Функция возвращает объект, содержащий данные метки.
         * Поле данных clusterCaption будет отображено в списке геообъектов в балуне кластера.
         * Поле balloonContentBody - источник данных для контента балуна.
         * Оба поля поддерживают HTML-разметку.
         * Список полей данных, которые используют стандартные макеты содержимого иконки метки
         * и балуна геообъектов, можно посмотреть в документации.
         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoObject.xml
         */
            getPointData = function (index) {
            return {
                balloonContentBody: 'балун <strong>метки ' + index + '</strong>',
                clusterCaption: 'Заголовок <strong>' + index + '</strong>'
            };
        },
        /**
         * Функция возвращает объект, содержащий опции метки.
         * Все опции, которые поддерживают геообъекты, можно посмотреть в документации.
         * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoObject.xml
         */
            getPointOptions = function () {
            return {
                preset: 'islands#violetIcon'
            };
        },
        points = [
            [55.831903,37.411961], [55.763338,37.565466], [55.763338,37.565466], [55.744522,37.616378], [55.780898,37.642889], [55.793559,37.435983], [55.800584,37.675638], [55.716733,37.589988], [55.775724,37.560840], [55.822144,37.433781], [55.874170,37.669838], [55.716770,37.482338], [55.780850,37.750210], [55.810906,37.654142], [55.865386,37.713329], [55.847121,37.525797], [55.778655,37.710743], [55.623415,37.717934], [55.863193,37.737000], [55.866770,37.760113], [55.698261,37.730838], [55.633800,37.564769], [55.639996,37.539400], [55.690230,37.405853], [55.775970,37.512900], [55.775777,37.442180], [55.811814,37.440448], [55.751841,37.404853], [55.627303,37.728976], [55.816515,37.597163], [55.664352,37.689397], [55.679195,37.600961], [55.673873,37.658425], [55.681006,37.605126], [55.876327,37.431744], [55.843363,37.778445], [55.875445,37.549348], [55.662903,37.702087], [55.746099,37.434113], [55.838660,37.712326], [55.774838,37.415725], [55.871539,37.630223], [55.657037,37.571271], [55.691046,37.711026], [55.803972,37.659610], [55.616448,37.452759], [55.781329,37.442781], [55.844708,37.748870], [55.723123,37.406067], [55.858585,37.484980]

/*
Вместо этого набора точек я вставляю переменную smarty -
{/literal}
   {foreach key=key item=obj from=$news}
      {if $obj.show_on_map}
{literal}
[{/literal}{$obj.coordinates}{literal}], - это цикл координат в таком же виде, что и выше
{/literal}
     {/if}
   {/foreach}
{literal}

 */
        ],
        geoObjects = [];

    /**
     * Данные передаются вторым параметром в конструктор метки, опции - третьим.
     * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Placemark.xml#constructor-summary
     */
    for(var i = 0, len = points.length; i < len; i++) {
        geoObjects[i] = new ymaps.Placemark(points[i], getPointData(i), getPointOptions());
    }

    /**
     * Можно менять опции кластеризатора после создания.
     */
    clusterer.options.set({
        gridSize: 80,
        clusterDisableClickZoom: true
    });

    /**
     * В кластеризатор можно добавить javascript-массив меток (не геоколлекцию) или одну метку.
     * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Clusterer.xml#add
     */
    clusterer.add(geoObjects);
    myMap.geoObjects.add(clusterer);

    /**
     * Спозиционируем карту так, чтобы на ней были видны все объекты.
     */

    myMap.setBounds(clusterer.getBounds(), {
        checkZoomRange: true
    });
});
</script>

<div id="map"></div>
</code>

9 комментариев
PHP,кластеризатор,API 2.1
Помогите кто знаком с API
Theflashmail
24 ноября 2014, 14:49

У меня есть БД в которой есть названия и адреса магазинов, как вывести на карту метки по адресам, а в балуне, чтобы было название, которые считывается с БД, с помощью http-геокодера я адреса преобразую в координаты, как мне теперь имея в БД координаты, названия и адреса магазинов, поставить метки на карте, а в балун записать адрес.

 

Просто http-геокодер записывается координаты не в той последовательности в которой нужны, а в обратной и как запихнуть их в функцию Placemark ?

 

Вот сайт - http://skindoctors.ru/magazini

 

Вот код, как сейчас я вывожу каждый элемент геокодирую

  

 

<?php 

    Yii::import('application.modules.pages.models.MagShop');

    $mags = MagShop::model()->findall();

 

    Yii::import('application.modules.pages.models.MagCity');

    $gors = MagCity::model()->findall();

 

    Yii::import('application.modules.pages.models.MagMag');

    $magi = MagMag::model()->findall();

?>

 <div class="content">

    <div class="breadcrumb"><a href="/">Главная</a><span class="breadcrumb-separator"> &gt; </span><span class="breadcrumb-page">Где купить</span></div>

    <div class="shop">

        <h1>Где купить</h1>

        <div class="map_contener">

            <div class="map_search">

                <input type="text" value="" placeholder="Укажите адрес или станцию">

                <button>Поиск</button>

            </div>

            <div class="left_map">

                Мы представлены в городах

                <ul>

                    <?php

 

                        foreach ($gors as $key => $value) {

                            echo "<li>".$value->name."</li>";

                        }

                    ?>

                </ul>

                <div style="clear:both;border-bottom:2px solid grey; height:5px;width:95%;"></div>

                Мы сотрудничаем с Интернет магазинами

                <ul>

                    <?php

 

                        foreach ($magi as $key => $value) {

                            echo "<li><a href='".$value->href."'>".$value->name."</a></li>";

                        }

                    ?>

                </ul>

            </div>

 

            <div class="right_map">

                <div id="map"></div>

           

<div> <strong>Список всех точек продаж:</strong> <br> &nbsp;</div>

<div> 

 <?php

 

                        foreach ($mags as $key => $value) {

                            echo "<li>".$value->city->name.", ".$value->address.",  &nbsp; &nbsp; &nbsp; ".$value->name."</li>";

                        }

                    ?>

 

</div>

 

  </div>

        </div>                                

    

</div>

 

</div>

 

 

 

<?

 

    // Параметры

 

    $config = Array(

 

        'host' => 'skin.mysql',

 

        'user' => 'skin_mysql',

 

        'password' => '9rrcmayq',

 

        'dbname' => 'skin_doctors',

 

        'tablename' => 'mag_shop',

 

        'apikey' => 'AF9KblQBAAAA6RvWPAIAvuxkWoSjyU4iHKeb1mDBePif0eEAAAAAAAAAAAC5EzZ7TIXimaEFc9eXi2t2U20-RQ=='

 

    );

 

 

    $dp = mysql_connect($config['host'], $config['user'], $config['password']) or die('Ошибка при подключении к серверу СУБД: '.mysql_error());

 

    mysql_select_db($config['dbname']) or die('Невозможно выбрать БД с именем "'.$config['dbname'].'": '.mysql_error());

 

    mysql_query('SET NAMES utf8');

 

 

    $addresses = mysql_query('SELECT * FROM '.$config['tablename']) or die('Ошибка при выполнении запроса к таблице "'.$config['tablename'].'": '.mysql_error());

 

 

    $countGeocode = $countGeocodeFault = 0;

 

 

    $result = '<table style="width:600px">';

 

    while ($row = mysql_fetch_assoc($addresses)) {

 

        $countGeocode++;

 

 

        $xml = simplexml_load_file('http://geocode-maps.yandex.ru/1.x/?geocode='.urlencode($row["address"]).'&key='.urlencode($config['apikey']).'&results=1');

 

 

        $found = $xml->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found;

 

        if ($found > 0) {

 

            $coords = str_replace(' ', ',', $xml->GeoObjectCollection->featureMember->GeoObject->Point->pos);

 

            $result .= '<tr><td>'.$row['address'].'</td><td>'.$coords.'</td></tr>';

 

            mysql_query("UPDATE `{$config['tablename']}` SET coords = '".mysql_real_escape_string($coords)."' WHERE id = {$row['id']}") or die("Ошибка при обновлении данных в таблице: ".mysql_error());

 

        } else {

 

            $result .= '<tr style="color:red"><td>'.$row['address'].'</td><td>ошибка</td></tr>';

 

            $countGeocodeFault++;

 

        }

 

    };

 

    $result .= '</table>';

 

 

    echo $result;

 

 

    mysql_close($dp);

 

 

    if ($countGeocode) {

 

        echo '<div style="margin-top:1em">Всего обработано адресов: '.$countGeocode.'</div>';

 

        if ($countGeocodeFault) {

 

            echo '<div style="color:red">Не удалось прогеокодировать: '.$countGeocodeFault.'</div>';

 

        }

 

    } else {

 

        echo '<div>Таблица с адресами пуста.</div>';

 

    }

 

?>

 

 

<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>

<script type="text/javascript">

    <?php

        echo "var magObjs = ["; 

        foreach ($mags as $key => $value) {

            if ($key!=0) {

                echo ",'".$value->city->name.",".$value->address."'";

            } else {

                echo "'".$value->city->name.",".$value->address."'";

            }

        }

        echo "];";

    ?>

</script>

<script type="text/javascript">

    var CityCoordinats;

    function init(street) {                

        if (street) {

            street = street;

            var res = '';

            var myGeocoder = ymaps.geocode(street);

            myGeocoder.then(

                function (res) {

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

                    CityCoordinats = firstGeoObject.geometry.getCoordinates();

                    myMap.setCenter(CityCoordinats, 9);

                },

                function (err) {

                }

            );

        }             

        var myMap = new ymaps.Map('map', {

            center: [55.753676, 37.619899],

            zoom: 9,

            controls: ['zoomControl']

        });

        for(var el=0;el<magObjs.length;el++){

 

        }

 

         <?php

            if (count($mags)>0) {

                echo "var objects = ymaps.geoQuery("; 

                foreach ($mags as $key => $value) {

                    if ($key!=0) {

                        echo ".add(ymaps.geocode('г. ".$value->city->name.", ".$value->address. "'))";

                    } else {

                        echo "ymaps.geocode('г. ".$value->city->name.", ".$value->address."'))";

                    }

                }

            } else {

                echo "var objects = false;";     

            }

            

        ?>

        

        if (objects) {

            myMap.geoObjects.add(objects.clusterize());    

        };

 

 

    }

 

ymaps.ready(init);

$(document).ready(function() {

    $('.map_search button').click(function(){

        $('.right_map #map').html('');    

        var street =  $('.map_search input').val(); 

        init(street);

    })

    $('.left_map ul li').click(function(){

        $('.right_map #map').html('');    

        var street =  $(this).text();    

        init(street);

    })

});

 

</script>

<div style="clear:both;border-bottom:2px solid grey;"></div>

3 комментария
PHP,API 2.1,геокодирование