Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
#1

YandexMapKit vs Yandex - Программирование Android

06.04.2016, 14:32. Просмотров 1025. Ответов 8
Метки нет (Все метки)

Сорри, в тему забыл добавить Yandex Maps JS API WebView.
Итак, парни, решил я залезть в одну и ту же реку дважды.
Потребовалось выбрать движок для карт. Google maps не подошли по причине не очень высокого покрытия. Решили взять карты от "Яндекс". Потратив некоторое время, нашёл пару рабочих примеров:
https://github.com/yandexmobile/yandexmapkit-android/issues/196
http://www.slideshare.net/elenavoynova3/ss-41460782 (ссылка на 83 слайде).
Запустил, первый визуально помедленнее. На эмуляторе x86 запустить не смог, требовался ARM, наверное. Функционал победнее. Поддержка YMK, как вы понимаете, была заморожена 3 года назад, сейчас что-то возобновили (см. https://github.com/yandexmobile/yandexmapkit-android).
Второй побыстрее, больше функций (есть слои, светофор, поиск), запускается и на эмуляторе (правда, со второго раза). Думаю, что можно прямо по карте строить пути.
По картам есть такие неплохие ссылки:
http://vk.com/ymapsapi
https://yandex.ru/blog/mapsapi/
Выбор за вами.

Добавлено через 4 часа 7 минут
Оба варианта не допускают использование оффлайн-карт (лицензионное соглашение). Соответственно, доступ к Интернету обязан быть. В случае с YMK требуется прописать ещё несколько разрешений, поэтому, опять же, способ с WebView предпочтительнее.
После нескольких часов мучений написал более-менее вменяемый интерфейс для карты. Этот HTML-файл надо положить в папку assets и получать доступ через WebView. Как это сделано, указано в примере на 83 слайде.
А вот и сама разметка:
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Размещение интерактивной карты на странице</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport"
          content="initial-scale=1.0, user-scalable=no, maximum-scale=1"/>
    <script src="//api-maps.yandex.ru/2.1.38/?lang=ru_RU"
            type="text/javascript"></script>
    <script type="text/javascript">
        ymaps.ready(init);
 
        function init(){
            var myMap = new ymaps.Map("map", {
                center: [55.76, 37.64],
                zoom: 14,
                controls: ["default","routeEditor"]
            });
            //myMap.setType('yandex#satellite');
 
            var myPlacemark = new ymaps.Placemark([55.76, 37.64], {
                hintContent: 'Москва!',
                balloonContent: 'Столица России'
            });
 
            myMap.geoObjects.add(myPlacemark);
        }
    </script>
    <style>
        html, body, #map {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
        #map {
            background-color: #888;
        }
    </style>
</head>
<body>
    <div id="map"></div>
</body>
</html>

Для работы с кнопками на карте рекомендую почитать https://tech.yandex.ru/maps/doc/jsap...trols-docpage/.

Добавлено через 37 минут
Если требуется отобразить несколько объектов на карте, подойдёт следующий способ. В теге <script> пропишите код (http://codd-wd.ru/shpargalka-yandeks-karty-yandex-maps-api/):
Кликните здесь для просмотра всего текста

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        ymaps.ready(init);
 
        function init(){
            var myMap = new ymaps.Map("map", {
                center: [55.76, 37.64],
                zoom: 14,
                controls: ["default","routeEditor"]
            });
            //myMap.setType('yandex#satellite');
 
            var myPlacemark = new ymaps.Placemark([55.76, 37.64], {
                hintContent: 'Москва!',
                balloonContent: 'Столица России'
            });
 
            myMap.geoObjects.add(myPlacemark);
 
            // Добавляем в геокодер список адресов
            var objects = ymaps.geoQuery(
                    ymaps.geocode('Москва, Слесарный переулок, д.3'))
                    .add(ymaps.geocode('Люберцы, Октябрьский проспект д.143'))
                    .add(ymaps.geocode('Москва, ул. Льва Толстого, 16'))
                    .addToMap(myMap);
            // Создаем коллекцию геообъектов, в котором будут находиться эти адреса
            var geoObjectsCollection = new ymaps.GeoObjectCollection();
            // После того, как поиск вернул результат, вызывается callback-функция
            objects.then(function () {
                // добавляем координаты адресов в коллекцию geoObjectsCollection
                objects.each(function (object) {
                    var coordinates = object.geometry.getCoordinates();
                    geoObjectsCollection.add( new ymaps.Placemark(coordinates) );
                });
                // Добавляем коллекцию геообъектов на карту
                myMap.geoObjects.add(geoObjectsCollection);
                // Спозиционируем карту так, чтобы на ней были видны все объекты.
                //myMap.setBounds(geoObjectsCollection.getBounds());
                myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true}).then(function(){
                    if(myMap.getZoom() > 15) myMap.setZoom(15); // Если значение zoom превышает 15, то устанавливаем 15.
                });
            });
       }

Видно, что находятся дома с такими же адресами и в городах Подмосковья.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос YandexMapKit vs Yandex (Программирование Android):

YandexMAPkit - Программирование Android
Файл yandexmapkit-android.jar подключил к проекту. При выполнении программы в LogCat получаю: Could not find class...

Android studio & yandexmapkit - Программирование Android
Добрый день! Кто нибудь пробовал подружить android studio и yandexmapkit? По официальной инструкции работать не хочет...

Yandex mapkit и другие - Программирование Android
Здравствуйте. Нужно встроить в приложение карту для наглядного местоположения какого либо объекта, зная его координаты (карта должна быть...

Yandex Map Kit android - Программирование Android
Добрый день. Хочу написать приложение для android, использующее карту Яндекс. Скачал библиотеку, документацию и пример кода: ...

Yandex MapKit на Android Studio - Программирование Android
Здравствуйте, импортировал библиотеку карт в проект, на эмуляторе все отлично работает, но на реальном телефоне вылетает. Пробовал менять...

Приложение с Yandex Map Kit - Программирование Android
Ребят посмотрите, закукунился уже) Не работает и все) 3 дня уже мучаюсь) Проект во вложении)

8
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
06.04.2016, 15:13  [ТС] #2
После того как объекты добавлены на карту, удобнее их объединить в группы (кластеры). Подробнее об этом почитайте в https://tech.yandex.ru/maps/doc/jsap...age/#clusters:
Кликните здесь для просмотра всего текста

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
        ymaps.ready(init);
 
        function init(){
            var myMap = new ymaps.Map("map", {
                center: [55.76, 37.64],
                zoom: 14,
                controls: ["default","routeEditor"]
            });
 
            // Множество объектов на карте.
            var coords = [
                [56.023, 36.988],
                [56.025, 36.981],
                [56.020, 36.981],
                [56.021, 36.983],
                [56.027, 36.987]
            ];
 
            // Кластеризация.
            var myGeoObjects = [];
 
            for (var i = 0; i < coords.length; i++) {
              myGeoObjects[i] = new ymaps.GeoObject({
                geometry: {
                  type: "Point",
                  coordinates: coords[i]
                },
                properties: {
                  clusterCaption: 'Геообъект № '+(i+1),
                  balloonContentBody: 'Текст объекта № '+(i+1)
                }
              });
            }
 
            var myClusterer = new ymaps.Clusterer(
              {clusterDisableClickZoom: true}
            );
            myClusterer.add(myGeoObjects);
            myMap.geoObjects.add(myClusterer);
 
            myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true}).then(function(){
                if(myMap.getZoom() > 15) myMap.setZoom(15); // Если значение zoom превышает 15, то устанавливаем 15.
            });
        }

Как всегда, не обошлось без багов. На экране смартфона кнопка закрытия окошка находится далеко справа (см. рис.).
0
Миниатюры
YandexMapKit vs Yandex  
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
07.04.2016, 11:06  [ТС] #3
Добавлю, что можно просто запускать HTML-страницу в браузере, а затем уже вставлять в проект. Для этого требуется заменить источник (https или http):
HTML5
1
2
    <script src="https://api-maps.yandex.ru/2.1.38/?lang=ru_RU"
            type="text/javascript"></script>
Достаточно симпатично сделано оформление на сайте http://jsfiddle.net/ktxwfak5/. Попробуем добавить описание к адресам.
Кликните здесь для просмотра всего текста

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
        var myMap;
 
        ymaps.ready(init);
 
        // Создание экземпляра карты.
        function init(){
            myMap = new ymaps.Map("map", {
                center: [55.76, 37.64],
                zoom: 14,
                controls: ["default","routeEditor"]
            });
 
            loadBalloons();
        }
 
        function loadBalloons(){
            // Макет.
            var MyBalloonContentLayoutClass = ymaps.templateLayoutFactory.createClass(
                '<h3>$[properties.name]</h3>'
                + '<p>Время доставки: $[properties.period]</p>'
                + '<p>Адрес: $[properties.address|неизвестно]</p>'
            );
 
            var array = [
                {
                    id : 101,
                    coord : [56.023, 36.988],
                    name : 'Имя 1',
                    address : 'Адрес 1',
                    period : '10:00 - 12:00'
                },
                {
                    id : 102,
                    coord : [56.025, 36.981],
                    name : 'Имя 2',
                    address : 'Адрес 2',
                    period : '12:00 - 15:00'
                },
                {
                    id : 103,
                    coord : [56.020, 36.981],
                    name : 'Имя 3',
                    address : 'Адрес 3',
                    period : '15:00 - 18:00'
                },
                {
                    id : 104,
                    coord : [56.021, 36.983],
                    name : 'Имя 4',
                    address : 'Адрес 4',
                    period : '15:00 - 18:00'
                },
                {
                    id : 105,
                    coord : [56.027, 36.987],
                    name : 'Имя 5',
                    address : 'Адрес 5',
                    period : '15:00 - 18:00'
                }
            ];
 
            // Множество объектов на карте.
            for (var i = 0; i < array.length; i++) {
                var item = array[i];
                var myPlacemark = new ymaps.Placemark(
                    item.coord,
                    {
                        name: item.name,
                        period: item.period,
                        address: item.address
                    },
                    {balloonContentLayout: MyBalloonContentLayoutClass}
                );
                myMap.geoObjects.add(myPlacemark);
            }
 
            myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true}).then(function(){
                if(myMap.getZoom() > 15) myMap.setZoom(15); // Если значение zoom превышает 15, то устанавливаем 15.
            });
        }
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
07.04.2016, 12:05 #4
CoolMind, а объективно, чем yandex maps лучше google maps или open street maps?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
07.04.2016, 16:02  [ТС] #5
YuraAAA, хороший вопрос, надо будет как-нибудь сделать и их сравнение. Работал с Google Maps, но в усечённом функционале, без прокладки маршрута, пробок (если есть).
Для России, насколько я могу судить, Яндекс-карты более предпочтительны, поскольку на них больше информации по городам и сёлам, обычно они актуальнее (но я могу ошибаться). Также это может зависеть от того, к каким картам привязаны другие продукты заказчика.

Добавлено через 1 час 36 минут
Добавим кластеризацию. Заодно уменьшим размер всплывающего окна ("балуна"), который я ошибочно посчитал багом.
Кликните здесь для просмотра всего текста

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
        var myMap;
 
        ymaps.ready(init);
 
        // Создание экземпляра карты.
        function init(){
            myMap = new ymaps.Map("map", {
                center: [55.76, 37.64],
                zoom: 14,
                controls: ["default","routeEditor"]
            });
 
            loadBalloons();
        }
 
        function loadBalloons(){
            // Макет.
            var MyBalloonContentLayoutClass = ymaps.templateLayoutFactory.createClass(
                '<h3>$[properties.name]</h3>'
                + '<p>Время доставки: $[properties.period]</p>'
                + '<p>Адрес: $[properties.address|неизвестно]</p>'
            );
 
            var array = [
                {
                    id : 101,
                    coordinates : [56.023, 36.988],
                    name : 'Имя 1',
                    address : 'Адрес 1',
                    period : '10:00 - 12:00'
                },
                {
                    id : 102,
                    coordinates : [56.025, 36.981],
                    name : 'Имя 2',
                    address : 'Адрес 2',
                    period : '12:00 - 15:00'
                },
                {
                    id : 103,
                    coordinates : [56.020, 36.981],
                    name : 'Имя 3',
                    address : 'Адрес 3',
                    period : '15:00 - 18:00'
                },
                {
                    id : 104,
                    coordinates : [56.021, 36.983],
                    name : 'Имя 4',
                    address : 'Адрес 4',
                    period : '15:00 - 18:00'
                },
                {
                    id : 105,
                    coordinates : [56.027, 36.987],
                    name : 'Имя 5',
                    address : 'Адрес 5',
                    period : '15:00 - 18:00'
                }
            ];
 
            // Кластеризация.
            var myGeoObjects = [];
 
            for (var i = 0; i < array.length; i++) {
                var item = array[i];
                myGeoObjects[i] = new ymaps.GeoObject({
                    geometry: {
                        type: "Point",
                        coordinates: item.coordinates
                    },
                    properties: {
                        clusterCaption: item.name,
                        balloonContentBody: '<p>Время доставки: ' + item.period + '</p>'
                            + '<p>Адрес: ' + item.address + '</p>'
                    }
                });
            }
 
            var myClusterer = new ymaps.Clusterer({
                // Установим дизайн метки (по умолчанию - blueClusterIcons):
                preset: 'islands#redClusterIcons',
                // Установим балун кластера в виде карусели для удобства
                balloonContentLayout: 'cluster#balloonCarousel',
                // Устанавливаем максимальное количество элементов в нижней панели на одной странице
                clusterBalloonPagerSize: 5,
                // Устанавливаем режим открытия балуна.
                // В данном примере балун никогда не будет открываться в режиме панели.
                clusterBalloonPanelMaxMapArea: 0,
                // Устанавливаем ширину макета контента балуна.
                balloonContentLayoutWidth: 300,
                // Устанавливаем высоту макета контента балуна.
                balloonContentLayoutHeight: 200,
                // Отображаем информацию об объектах вместо приближения.
                clusterDisableClickZoom: true
            });
            myClusterer.add(myGeoObjects);
            myMap.geoObjects.add(myClusterer);
 
            myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true}).then(function(){
                if(myMap.getZoom() > 12) myMap.setZoom(12);
            });
        }
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
07.04.2016, 17:45  [ТС] #6
Только после прочтения статьи https://tech.yandex.ru/maps/jsbox/2.1/cluster_balloon_carousel_21 понял, как меняются макеты кластера и "балуна" одновременно. Впрочем, там ещё много всего можно поделать. Например, вид значка в зависимости от условия.
Кликните здесь для просмотра всего текста

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
        var myMap;
 
        ymaps.ready(init);
 
        // Создание экземпляра карты.
        function init(){
            myMap = new ymaps.Map("map", { // ID блока с картой.
                center: [55.76, 37.64],
                zoom: 14,
                controls: ["default","routeEditor"]
            });
 
            loadBalloons();
        }
 
        function loadBalloons(){
            var array = [
                {
                    id : 101,
                    coordinates : [56.023, 36.988],
                    name : 'Имя 1',
                    address : 'Адрес 1',
                    period : '10:00 - 12:00'
                },
                {
                    id : 102,
                    coordinates : [56.025, 36.981],
                    name : 'Имя 2',
                    address : 'Адрес 2',
                    period : '12:00 - 15:00'
                },
                {
                    id : 103,
                    coordinates : [56.020, 36.981],
                    name : 'Имя 3',
                    address : 'Адрес 3',
                    period : '15:00 - 18:00'
                },
                {
                    id : 104,
                    coordinates : [56.021, 36.983],
                    name : 'Имя 4',
                    address : 'Адрес 4',
                    period : '15:00 - 18:00'
                },
                {
                    id : 105,
                    coordinates : [56.027, 36.987],
                    name : 'Имя 5',
                    address : 'Адрес 5',
                    period : '15:00 - 18:00'
                }
            ];
 
            // Кластеризация.
            var myGeoObjects = [];
 
            for (var i = 0; i < array.length; i++) {
                var item = array[i];
                myGeoObjects[i] = new ymaps.GeoObject({
                    geometry: {
                        type: "Point",
                        coordinates: item.coordinates
                    },
                    properties: {
                        name: item.name,
                        address: item.address,
                        period: item.period,
                        balloonContentBody: '<h3>' + item.name + '</h3>'
                            + '<i>Время доставки: ' + item.period + '</i>'
                            + '<p>Адрес: ' + item.address + '</p>'
                    }
                });
            }
 
            // Макет кластера.
            var myBalloonLayout = ymaps.templateLayoutFactory.createClass(
                '<h3>$[properties.name]</h3>'
                + '<p>Время доставки: $[properties.period]</p>'
                + '<p>Адрес: $[properties.address|неизвестно]</p>'
            );
 
            var myClusterer = new ymaps.Clusterer({
                // Отображаем информацию об объектах вместо приближения.
                clusterDisableClickZoom: true,
                clusterOpenBalloonOnClick: true,
                // Устанавливаем стандартный макет балуна кластера "Карусель".
                clusterBalloonContentLayout: 'cluster#balloonCarousel',
                // Устанавливаем собственный макет.
                clusterBalloonItemContentLayout: myBalloonLayout,
                // Устанавливаем режим открытия балуна.
                // В данном примере балун никогда не будет открываться в режиме панели.
                clusterBalloonPanelMaxMapArea: 0,
                // Устанавливаем размеры макета контента балуна (в пикселях).
                clusterBalloonContentLayoutWidth: 200,
                clusterBalloonContentLayoutHeight: 130,
                // Устанавливаем максимальное количество элементов в нижней панели на одной странице
                clusterBalloonPagerSize: 5
                // Настройка внешего вида нижней панели.
                // Режим marker рекомендуется использовать с небольшим количеством элементов.
                // clusterBalloonPagerType: 'marker',
                // Можно отключить зацикливание списка при навигации при помощи боковых стрелок.
                // clusterBalloonCycling: false,
                // Можно отключить отображение меню навигации.
                // clusterBalloonPagerVisible: false
            });
            myClusterer.add(myGeoObjects);
            myMap.geoObjects.add(myClusterer);
 
            myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true}).then(function(){
                if(myMap.getZoom() > 12) myMap.setZoom(12);
            });
        }

Здесь есть небольшая разница между видом кластера и "балуна".
0
Миниатюры
YandexMapKit vs Yandex  
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
08.04.2016, 15:50  [ТС] #7
Сделал на основе статьи https://androidcookbook.com/Recipe.seam?recipeId=4426 передачу данных (массива точек) из Андроид-программы в HTML-страницу. Если кому надо, могу написать код. Проверил на API 15, 21 - всё работает. На 10 не установилась.

Добавлено через 2 минуты
В предыдущем сообщении забыл добавить одну строку:
Javascript
1
                        clusterCaption: item.name, // Для отображения имени в списке в кластере.
Её нужно вставить после 68 строки, чтобы отображались названия при разных видах кластеров.

Добавлено через 4 часа 50 минут
Вопрос знатокам.
У меня есть список (ListView) с адресами. Пользователь может нажать на любой из них, при этом откроется карта, на ней будет адрес. Загрузка занимает секунд 5. Нажимает кнопку "назад", открывает следующий адрес.
Карту можно поворачивать на 90 градусов.
Как сделать так, чтобы при нажатии на следующий адрес время загрузки карты было минимальным?
0
Deno95
9 / 9 / 3
Регистрация: 16.12.2013
Сообщений: 108
16.04.2016, 17:42 #8
При передвижении карты, она немного подтягиваеться. Как исправить этот эффект?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.04.2016, 19:35  [ТС] #9
Цитата Сообщение от Deno95 Посмотреть сообщение
При передвижении карты, она немного подтягиваеться
Не совсем понял, что куда подтягивается. Да, там грузятся текстуры. Иногда и вовсе может упасть по переполнению памяти.
0
16.04.2016, 19:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2016, 19:35
Привет! Вот еще темы с ответами:

Yandex.money sdk в приложении - Программирование Android
Добрый день! Подскажите, кто-нибудь пробовал по этому sdk https://github.com/yandex-money/yandex-money-sdk-android реализовывать...

Yandex mapkit узнать координаты адреса - Программирование Android
Доброго времени суток. Только начал работать с yandex map kit и не могу найти ответа на вопрос как по адресу узнать координаты? Нужно...

Как получить GeoCode в yandex mapkit? - Программирование Android
Как получить GeoCode зная координаты?

Как получить экранные и геокоординаты по клику по MapView в yandex mapkit? - Программирование Android
Как получить экранные и геокоординаты по клику по MapView в yandex mapkit? Пробовал повесить OnTouchListener на mapview, не работает


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru