Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Иконки для маркеров в гугл мапс. (https://javascript.ru/forum/misc/14108-ikonki-dlya-markerov-v-gugl-maps.html)

mamamiya 29.12.2010 21:27

Иконки для маркеров в гугл мапс.
 
Уже битый час бьюсь. Нужно в зависимости от полученных данных выставить определенный маркер для метки в гугл мапс. Все работает на ура, но метки везде всегда выставляются только одного типа (конкретно - для страны)
for (var k in data){
            var v = data[k];
            if(v.country_id){
                loc = 'страна ' + v.country_name;
                icon = '/css/green_big_select.png';
            } 
            if(v.city_id){
                loc = 'город ' + v.city_name;
                icon = '/css/blue_mini.png';
            }
            geocoder.geocode( {
                'address': loc 
            }, function(results, status) {
                if(status=='OK'){
                    markers[k] = new google.maps.Marker({
                        position: results[0].geometry.location,
                        map: map, 
                        icon: icon /* - вот здесь иконка всегда равна первому варианту, хотя loc (тот, по которому ищутся координаты всегда разный)*/
                    });


                }
                else alert('не удается найти объект');
            });
        }

Причем в массиве входящих данных первым идет город, потом 3 страны. А иконки только для станы на выходе. Подозреваю что проблема, скорее всего, в асинхронности получения результатов геокодера.

dmitriymar 29.12.2010 21:30

я могу ошибаться-но это javascript? не ну конечно если бы я знал as3 меньше чем сейчас-прочитал всего несколько страниц -я бы сказал что это он.но это не он.

mamamiya 29.12.2010 21:35

js, родной.. и даже работает. вот только проблема таки остается)

dmitriymar 29.12.2010 21:37

Цитата:

Сообщение от mamamiya
for (var k in data)

непохоже как то. точнее совсем не похоже
а вот на цикл for/in языка JAVA совсем очень похоже-я бы сказал что близнецы

mamamiya 29.12.2010 21:41

Цитата:

Сообщение от dmitriymar (Сообщение 85733)
непохоже как то

а как должно быть чтобы было похоже?)

dmitriymar 29.12.2010 21:47

та да нашел их и в скрипте .не знал что он есть в скрипте

mamamiya 29.12.2010 21:51

рад кому то помочь обогатиться знаниями. и всетаки нет желания разобраться в чем может быть реальня проблема?)

dmitriymar 29.12.2010 21:52

я не понимаю больше половины в приведённом тобой скрипте:(
if(v.country_id)-не понимаю вообще.v.country_id по логике 1 или 0 должны быть в этом случае. но глядя на след строчку понимаю что принимает любые значения и обрабатывается в этом ветвлении -но как?

mamamiya 29.12.2010 21:57

country_id, city_id могут быть каким то числом или null. Соответственно где country_id = null город будет 100% задан и наоборот, и проверка таким образом идет нормально.

dmitriymar 29.12.2010 22:01

интересно ... но ведь для вхождения в тело ветвления значение должно быть true внутри скобок. а по скольку оно у тебя любое-то по логике в тело ветвления зайдёт только когда примет значение 1. не могу понять всё равно.

mamamiya 29.12.2010 22:04

null = false. Если в кратце)

dmitriymar 29.12.2010 22:04

Цитата:

Сообщение от mamamiya
if(v.country_id){
loc = 'страна ' + v.country_name;
icon = '/css/green_big_select.png';
}
if(v.city_id){
loc = 'город ' + v.city_name;
icon = '/css/blue_mini.png';
}

по идее ведь если v.country_id!=1 и v.city_id!=1 то не зайдёт ни в одно из ветвлений. мож стоит поменять на v.country_id>=1 и v.city_id>=1 ну или !=0

dmitriymar 29.12.2010 22:05

да я то знаю что такое 0. у тебя просто логика там что если ни одно из значений не 1 то ни один код в ветвлении не выполнится-а именно присваивание
loc = 'страна ' + v.country_name;
icon = '/css/green_big_select.png';
и

loc = 'город ' + v.city_name;
icon = '/css/blue_mini.png';
и
icon: icon будет оставатся практически всегда неизменным.

mamamiya 29.12.2010 22:05

оно особой роли не играет, потому что как я писал в начале топика переменная loc отрабатывает в любом случае правильно

mamamiya 29.12.2010 22:07

Цитата:

Сообщение от dmitriymar (Сообщение 85745)
по идее ведь если v.country_id!=1 и v.city_id!=1 то не зайдёт ни в одно из ветвлений. мож стоит поменять на v.country_id>=1 и v.city_id>=1 ну или !=0

не обязательно 1. может любое значение кроме 0, null, false ну и т.п.
подредактировал как предлагаешь - тоже работает, мой вариант банально короче. Проблема остается)

dmitriymar 29.12.2010 22:17

незнаю мож скажу банальщину или глупость. но насколько я понимаю код не весь. проверь вхождение в ветвления алертами. если всё так как ты говоришь-то ничего не должно мешать смене иконок. и ikon как ты отслеживаеш-изменилась картинка или нет? а если самый тупой вариант-у тебя ошибка в отображении картинки? типа src гдето потерял и т.д?

mamamiya 29.12.2010 22:19

не.. все это перепробовано уже 100 раз. проблема скорее всего как раз в том, что цикл идет на новую ветку до того, как получен ответ от геокодера, поэтому первый ответ и пропадает.

dmitriymar 29.12.2010 22:21

ну дак отслеживай получение ответа аякс ведь это позволяет.

Shaci 29.12.2010 22:28

Цитата:

Сообщение от dmitriymar (Сообщение 85733)
непохоже как то. точнее совсем не похоже
а вот на цикл for/in языка JAVA совсем очень похоже-я бы сказал что близнецы

o_O
foreach в java вот так реализуется
Код:

Test [] testArray = new Test[3];
testArray[0] = new Test();
testArray[1] = new Test();
testArray[2] = new Test();
//foreach
for (Test e : testArray) {
System.out.println(e.toString());
}


dmitriymar 29.12.2010 22:32

Цитата:

Сообщение от Shaci
o_O
foreach в java вот так реализуется

а я и не говорил что яву знаю. забил в поиск фо ин выкинуло что ява

mamamiya 29.12.2010 22:35

этот гугл меня убивает. Эту проблему я решил совсем по другому - гугль отдает кроме координат объекта еще и его тип (соответственно можно определить страна это или город) С этим разобрались. Но теперь новая беда)
if(status=='OK'){
                    if(results[0].types[0]=='locality') var iconco = '/css/blue_mini.png';
                    if(results[0].types[0]=='country') var iconco = '/css/green_big_select.png';
                    //console.log(markers.length);
                    markers[markers.length] = new google.maps.Marker({
                        position: results[0].geometry.location,
                        map: map, 
                        icon: iconco
                    });
                    google.maps.event.addListener(markers[markers.length-1], 'click', function() {/*вот тут markers[markers.length-1] хоть и существует - вроде только что был записан, как то не совсем логично*/
                        var infowindow = new google.maps.InfoWindow({
                            content: '<img class="map_waiter" src="/css/loader.gif">'
                        });
                        infowindow.open(map,markers[markers.length-1]);
                    });
                }

собственно маркеры добавляются и иконки у них (бл*ь) как нужно, но при попытке обратиться к маркеру все инфоокна ссылаются на последний добавленный маркер... почему?

Kolyaj 30.12.2010 12:24

Цитата:

Сообщение от mamamiya
infowindow.open(map,markers[markers.length-1]);

Так вы берёте последний элемент всегда.

http://javascript.ru/basic/closure#p...-ispolzovaniya


Часовой пояс GMT +3, время: 11:55.