Клуб API Карт

После json_decode вижу данные, но на карту как разместить?

alexsp2007
24 августа 2016, 20:05
Вот что получаю после вывода данных из БД
Array ( [0] => Array ( [name] => Газовая АЗС в селе Алтайское [meta_keyword] => Газовая АЗС в селе Алтайское [model] => Круглый год [geolocation] => 51.943358, 85.3447 [category_id] => 66 ) [1] => Array ( [name] => Газовая заправка в Благовещенке [meta_keyword] => АГЗС Благовещенка [model] => Круглый год [geolocation] => 52.819953287307534, 79.88247999999996 [category_id] => 66 )

Потом пытаюсь передать все это добро как массив меток

$.getJSON("marker-layout.php", function(json){ 
if (json.status == 'OK') { 
var myobj=json;

for (var key in myobj) { 
window.myObjects = ymaps.geoQuery({
                
        type: "FeatureCollection",
        features: [
            	{
                type: 'Feature',
                geometry: {
                    type: 'Point',
                    coordinates: [myobj[key].geolocation]
                },
                options: {
                    preset: 'islands#darkBlueDotIconWithCaption'
                },
				properties: {
				iconCaption: 'myobj[key].name',
				balloonContentHeader: 'myobj[key].model',
				balloonContentBody: 'myobj[key].meta_keyword'
				}    
}]   }).addToMap(myMap);
  
}
}
});

Варианты были и другие. но... пока метки не выводятся.. Подскажите где косяк(и)?

18 комментариев
Подписаться на комментарии к посту
ну как минимум здесь
coordinates: [myobj[key].geolocation]
dimik,
я даже не знаю, что  думать. Это из-за неправильной записи координат  в базу? или обработка js'ом?
alexsp2007,
Эта запись означает, что у вас массив из одного элемента
 coordinates:  [myobj[key].geolocation]



Двже если в myobj[key].geolocation лежат координаты (массив из 2-х чисел), это не то же самое, что
coordinates: myobj[key].geolocation
dimik,
делал так:
1) coordinates: myobj[key].geolocation
2) coordinates: 'myobj[key].geolocation'
3) coordinates: ['myobj[key].geolocation']

а потом проверил в консоли говорит 
Uncaught ReferenceError: myobj is not defined(…)
alexsp2007,
поставьте debugger; там где вы создаете myobj и посмотрите что в json приходит
dimik,
Да уж... пробелы в моих знаниях колоссальные((
Подозреваю, что есть ошибки в выходе данных из БД
Говорит:
console.debug($.getJSON)

VM2114:2 (e,t,n){return x.get(e,t,n,"json")}
console.debug(Array)

VM2126:2 Array() { [native code] }
а про json, myobj и ключи данных, полученные из полей БД говорит так:
VM2135:2 Uncaught ReferenceError: geolocation is not defined(…)

 
командой print_r я вывел значения, указанные в начале темы ...
Если вывести при помощи echo то приходят кракозябры:
[{"geolocation":"51.943358, 85.3447","name":"\u0413\u0430\u0437\u043e\u0432\u0430\u044f \u0410\u0417\u0421 \u0432 \u0441\u0435\u043b\u0435 \u0410\u043b\u0442\u0430\u0439\u0441\u043a\u043e\u0435","model":"\u041a\u0440\u0443\u0433\u043b\u044b\u0439 \u0433\u043e\u0434","meta_keyword":"\u0413\u0430\u0437\u043e\u0432\u0430\u044f \u0410\u0417\u0421 \u0432 \u0441\u0435\u043b\u0435 \u0410\u043b\u0442\u0430\u0439\u0441\u043a\u043e\u0435"},...








alexsp2007,
Нужно добиться корректного вывода при помощи echo? 
alexsp2007,
Вы сейчас о чем? Какое эхо? Это клуб про javascript АПИ, работающее в браузере. Что надо сделать на сервере тут обычно не обсуждают. Там могут использоваться разные стеки технологий.
http://php.net/manual/ru/function.json-encode.php
dimik,
Извините, если оскорбил ))
Учусь ездить на велосипеде по инструкциям


Вывод из БД настроен, показывал знающим людям, они говорят, что кракозябры это хорошо и правильно, но они  не сильны в АПИ.


$.getJSON("marker-layout.php", function(json) {
var myobj = json;

for (var i = 0; i < myobj.length; i++) {
ymaps.geoQuery({

type: "FeatureCollection",
features: [{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: myobj[i].geolocation.split(/\s*,\s*/)
},
options: {
preset: 'islands#darkBlueDotIconWithCaption'
},
properties: {
iconCaption: myobj[i].name,
balloonContentHeader: myobj[i].model,
balloonContentBody: myobj[i].meta_keyword
}
}]
}).addToMap(myMap);

}
});





но не работает!
Если спросить
console.debug(coordinates)
то
VM416:1 Uncaught ReferenceError: coordinates is not defined(…)
то же самое и про другие myobj, json и т. д.
хм...
Вот страница:
http://goo.gl/dDykSS
alexsp2007,
у вас marker-layout.php отдает html, вместо json. Вы разбирайтесь с похапэ, на форуме специальном спросите. А то так и будете на АПИ пенять
dimik,
нет-нет не пеняю ни в коем случае, пытаюсь честно разобраться, сказал лишь, что мы не сильны... Спасибо Вам за участие и за сервис геокодирования - очень помогает в строении)))  
alexsp2007,
Используя geoQuery можно свести клиентскую часть к минимуму, по крайней мере эти циклы не нужны.
https://tech.yandex.ru/maps/jsbox/2.1/data_load_jquery



Вам остается лишь сформировать данные в нужном виде и отправить их клиенту.
Для этого есть json_encode им и нужно пользоваться.
Использовать echo или "клеить" результат как строки – неправильный подход.

dimik,
Практически это будет выглядеть так: я должен сформировать ответ через json_encode под структуру data.json, которая является "родной" для Яндекс АПИ  ?
Не совсем понимаю, как можно сделать без циклов, ведь массив из БД так и просит обработки в JS.
Или предлагаете каждый раз дополнять вручную файл data.json? Кстати, возможно есть скрипты, которые подгружают новые записи в этот файлик при внесении новых данных в БД? Продолжаю поиски....
alexsp2007,
АПИ совместимо со стандартом GeoJSON (есть отличия, но в целом он поддерживается), его и надо сформировать.
Файлов никакх формировать не надо, отдавайте JSON нужного формата при запросе с клиента и все (не забываем про правильный http-заголовок Content-Type). Вам нужно сформировать на стороне сервера из данных, полученных из БД структуру PHP, которая будет сериализовываться с помощью json_encode в GeoJSON. Постобработка на клиенте не нужна.

dimik,
правильный заголовок 
header('Content-Type: text/html; charset=utf-8');
?
ну вот кажется все уже сделал.
view-source:http://comfort.xn--22-6kc1cvaaoh7b.xn--p1ai/index.php?route=account/voucher

(строка 350)
в исходном коде вывел нужную структуру json, но где-то в js что-то неправильно ? И как понять, вывод PHP или HTML ? Не нашел понятного для себя пояснения
alexsp2007,
Приветствую! Вывод маркеров наладил - все было из-за неверного указания на источник файла. Скрипту был нужен полный путь!  
$.getJSON("http://comfort.xn--22-6kc1cvaaoh7b.xn--p1ai/catalog/view/theme/default/template/account/marker-layout.php",
function(data) {
for (var i = 0; i < data.length; i++) {

var agzsCollection = ymaps.geoQuery(
{
type: "FeatureCollection",
features: [{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: data[i].geolocation.split(/\s*,\s*/)
},
options: {
preset: 'islands#darkBlueDotIconWithCaption'
},
properties: {
iconCaption: 'АГЗС',
balloonContentHeader: data[i].name,
balloonContentBody: data[i].meta_keyword + '</br>' + data[i].model,
balloonContentFooter: '<a target="_blank" href="http://comfort.xn--22-6kc1cvaaoh7b.xn--p1ai/index.php?route=product/product&product_id='+ data[i].product_id + '" />Подробнее>>> </a>'
}
}]
}).addToMap(myMap);

}


$('#agzs').click(function (e) {
if($('#agzs').is(':checked')) {
myMap.addOverlay(agzsCollection);
} else {
myMap.removeOverlay(agzsCollection);
}
}); 
});


Теперь еще вопрос... 
Не получается использовать чекбокс для вывод скрытия маркеров. Знаю, что уже плохой тон про это спрашивать. целую неделю все читал, но что-то нет понимания... код вверху, вариаций было множество.