Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579

Отцентровка карты и правильный zoom

08.09.2016, 09:13. Показов 2664. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Вопрос может не в той теме, но точно не знаю, куда его задавать. Имеется много разных адресов в БД. Получаем эти адреса, получаем координаты широты и долготы для каждого. Помещаем метки на карте (Карта гугл или яндекс, пока не имеет значения). Теперь необходимо правильно отцентровать карту и получить правильный зум.

Как отцентровать карту я примерно понимаю - пишу функцию на PHP, которая получает все точки с широтой и долготой. Находим среднее значение для широты и долготы - и полученная точка и будет являться центром (поправьте, если я не прав).

А как определить правильный зум для карты? (Например, если всего 2 адреса прямо рядом находятся, то увеличение сильное должно быть. А если всего 2 адреса по разным краям города - то зуб должен быть далеким. Адресов может быть неизвестное количество). Как можно решить этот вопрос?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2016, 09:13
Ответы с готовыми решениями:

Отцентровка коардинат
Вставляю на страницу флеим: <style> iframe {position:fixed; z-index:9999; overflow:hidden; top:250px; left:575px; width:475px;...

Найти оптимальный zoom карты (яндекс карты)
Есть массив с координатами (Х, У). Как найти оптимальный zoom, (от 1го до 17) чтобы все точки из массива попадали в область карты... ...

Как изменить Zoom Lvl в плагине WP IMAGE ZOOM
Мне нужно увеличить размер картинки при наведении на неё . В настройках плагина это функция есть , но она платная , можно ли как то...

8
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
08.09.2016, 09:53
Смотрю в документации:
https://tech.yandex.ru/maps/do... state.zoom

Добавлено через 48 секунд
Видимо не понял сразу. Надо же значение вычислить. Сейчас подумаю.

Добавлено через 24 минуты
Расстояние между объектами по широте:
1) Вычисляем самую близкую к экватору точку.
2) Вычисляем самую дальнюю от экватора точку (просто сортировкой массива).
Исходя из того, что в одной минуте 1.851 километра, можно сделать вычисления, зная масштаб карты.
Таким образом найдём минимальный размер карты по вертикали.

Расстояние между объектами по долготе:
Так же, находим ближайшую и дальнюю от нулевого меридиана точку.

Вычисляем для точек, какое расстояние в одной минуте:
Code
1
(COS долгота°) × 40000 / 360
Находим среднее арифметическое и умножаем его на разницу между точками в минутах.
Таким образом найдём минимальный размер карты по горизонтали.

Если нигде не ошибся, то как-то так.

Неужели всех этих вычислений нет на Яндекс.Карты...
1
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
08.09.2016, 09:55  [ТС]
Ужас)) Буду пытаться разбираться)) Спасибо Вам)
0
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
09.09.2016, 13:34  [ТС]
Не, не осилил я эти вычисления, к сожалению...
0
 Аватар для evikza
968 / 530 / 244
Регистрация: 20.05.2015
Сообщений: 776
09.09.2016, 15:02
Лучший ответ Сообщение было отмечено Dmitrin как решение

Решение

Dmitrin, за масштабирование, отвечает setBounds.

Вот вам кусок кода, он даже рабочий, забирает данные с файла -> выводит метки. (однажды делал для себя, тут метки еще с балуном, можете удалить лишнее. Версия API 2.1)

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
$(document).ready(function() {
 
var myMap, myPlacemark, coords;
 
  ymaps.ready(init);
 
  // load myMap.
  function init() {
    var myCollection = new ymaps.GeoObjectCollection(); // создаем коллекцию
 
    var myMap = new ymaps.Map("map", {
      center: [56.8075, 60.6025],
      zoom: 13,
      type: "yandex#map", // yandex#satellite
      controls: ['zoomControl', 'geolocationControl'], // зум и геолокация
    }, {
      suppressMapOpenBlock: true // убираем плашку "открыть в браузере"
    });
    //Запрос данных и вывод маркеров на карту
      $.getJSON("json.php",
        function(json) {
            // цикл вывода меток ymaps.Placemark
          for (i = 0; i < json.points.length; i++) {
 
            var myPlacemark = new ymaps.Placemark([json.points[i].lat, json.points[i].lon], {
              iconCaption: json.points[i].iconText,
              balloonContentBody: [
                '<div class="street">' +
                json.points[i].hintText +
                '</div>',
                '<i class="desc">' +
                json.points[i].balloonText +
                '</i>',
              ].join(''),
              balloonContentFooter: json.points[i].humanDate
            }, {
              // Опции
              preset: json.points[i].stylePlacemark,
            });
 
            // Добавляем метку на карту
            myCollection.add(myPlacemark);
 
          }
          myMap.geoObjects.add(myCollection);
          // настраиваем позиционирование, относительно меток
          myMap.setBounds(myCollection.getBounds());
        });
  }
});
Для меток находящихся рядом друг с другом, лучше всего использовать кластеризацию, но это уже совсем другая история...
1
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
09.09.2016, 15:30  [ТС]
evikza, Огромное спасибо. То, что нужно!
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
10.09.2016, 08:04
Цитата Сообщение от Para bellum Посмотреть сообщение
(COS долгота°) × 40000 / 360
Ошибся. Тут широта должна быть. В общем, если кому-то вдруг понадобится вычислять расстояние между параллелями и меридианами координат, копирую сюда класс:
PHP
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
<?php
    class Distance {
        /*
         * Длина окружности планеты по экватору/меридиану
         */
        protected $cirference;
        
        /*
         * Масштаб (по умолчанию 1:1)
         */
        protected $space;
        
        /**
         * Создание объекта класса
         * 
         * @param integer $space 
         * @param integer $cirference 
         * 
         * @return void
         */
        public function __construct($space=1, $cirference=40000){
            $this->space = $space;
            $this->cirference = $cirference;
        }
        
        /**
         * Вычисление расстояние в одном градусе на экваторе
         * 
         * @return integer 
         */
        protected function space(){
            return $this->cirference / 360 / $this->space;
        }
        
        /**
         * Вычисление косинуса для угла широты
         * 
         * @param float $number 
         * 
         * @return float
         */
        protected function cosine($number){
            # Преобразуем градусы в радианы
            $radians = deg2rad($number);
            
            return round(cos($radians), 3, PHP_ROUND_HALF_DOWN);
        }
        
        /**
         * Преобразование координаты в градусы
         * 
         * @param float $number 
         * 
         * @return float
         */
        protected function convert(& $numbers){
            foreach($numbers as & $number){
                # Округляем координату до градусов
                $integer = floor($number);
                
                $number = $integer + (($number - $integer) / 60);
            }
        }
        
        /**
         * Вычисление расстояния между параллелями
         * 
         * @param array $numbers
         * 
         * @return float
         */
        public function parallels(array $numbers){
            # Преобразуем координаты в градусы
            $this->convert($numbers);
 
            return abs($numbers[0] - $numbers[1]) * $this->space();
        }
        
        /**
         * Вычисление расстояния между меридианами
         * 
         * @param array $coords
         * 
         * @return float
         */
        public function meridians(array $numbers){
            # Преобразуем координаты в градусы
            $this->convert($numbers);
            
            # Вычисляем длину дуги одного градуса параллели и складываем значения для широт
            $space  = $this->cosine($numbers[2]) * $this->space();
            $space += $this->cosine($numbers[3]) * $this->space();
            $space /= 2;
            
            return abs(($numbers[0] - $numbers[1]) * $space);
        }
    }
Пользоваться так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
/*
    Выводим расстояние между параллелями.
    Где первое значение массива -- широта первого объекта, а второе -- широта второго объекта.
*/
echo $coordinates->parallels([55.47, -37.82]), ' км между широтами';
 
/*
    Выводим расстояние между меридианами.
    Где первое значение массива -- долгота первого объекта, а второе -- долгота второго объекта.
    Третье -- широта первого объекта, четвёртое -- широта второго объекта.
*/
echo $coordinates->meridians([80.29, 36.41, 55.47, -37.82]), ' км между меридианами';
Добавлено через 5 минут
Можно ещё масштаб указать (глобуса, например). А можно вообще другой планеты -- главное знать длину окружности по экватору.

Добавлено через 9 часов 37 минут
Так, сейчас расстояние между 180 и -180 градусами долготы вычисляется как вся длина параллели, что может быть приемлемо для плоских карт, но не для глобусов и не для самой планеты. Так как 180 и -180 градусов долготы -- это один и тот же меридиан.
Исправлено:
PHP
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
114
115
116
117
118
119
class Distance {
        /*
         * Длина окружности планеты по экватору/меридиану
         */
        protected $cirference;
        
        /*
         * Масштаб (по умолчанию 1:1)
         */
        protected $space;
        
        /**
         * Создание объекта класса
         * 
         * @param integer $space 
         * @param integer $cirference 
         * 
         * @return void
         */
        public function __construct($space=1, $cirference=40000){
            $this->space      = $space;
            $this->cirference = $cirference;
        }
        
        /**
         * Вычисление расстояние в одном градусе на экваторе
         * 
         * @return integer 
         */
        protected function space(){
            return $this->cirference / 360 / $this->space;
        }
        
        /**
         * Вычисление косинуса для угла широты
         * 
         * @param numeric $number 
         * 
         * @return numeric
         */
        protected function cosine($number){
            # Преобразуем градусы в радианы
            $radians = deg2rad($number);
            
            return round(cos($radians), 3, PHP_ROUND_HALF_DOWN);
        }
        
        /**
         * Преобразование координаты в градусы
         * 
         * @param numeric $number 
         * 
         * @return numeric
         */
        protected function convert(& $numbers){
            foreach($numbers as & $number){
                # Округляем координату до градусов
                $degree = floor($number);
                
                # Получаем минуты
                $minutes = $number - $degree;
                
                $number = $degree + ($minutes / 60);
            }
        }
        
        /**
         * Вычисление расстояния между параллелями
         * 
         * @param array $numbers
         * 
         * @return numeric
         */
        public function parallels(array $numbers){
            # Преобразуем координаты в градусы
            $this->convert($numbers);
            
            # Вычисляем разницу широт
            $difference = abs($numbers[0] - $numbers[1]);
            
            return $difference * $this->space();
        }
        
        /**
         * Вычисление меньшего угла окружности между точками
         * 
         * @param $length 
         * 
         * @return numeric
         */
        protected function minDegree($degree){
            return min($degree, 360 - $degree);
        }
        
        /**
         * Вычисление среднего расстояния между меридианами
         * 
         * @param array $numbers
         * 
         * @return numeric
         */
        public function meridians(array $numbers){
            # Преобразуем координаты в градусы
            $this->convert($numbers);
            
            # Вычисляем длину дуги одного градуса параллели и складываем значения для широт
            $space  = $this->cosine($numbers[2]);
            $space += $this->cosine($numbers[3]);
            $space *= $this->space();
            
            # Вычисляем среднее значение длины дуги одного градуса параллели
            $space /= 2;
            
            # Вычисляем разницу долгот
            $difference = abs($numbers[0] - $numbers[1]);
 
            return $this->minDegree($difference) * $space;
        }
    }
1
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
10.09.2016, 11:09  [ТС]
Para bellum, благодарю Вам))
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
10.09.2016, 11:20
Ну, если пригодится -- пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2016, 11:20
Помогаю со студенческими работами здесь

Нужно сделать правильный выбор (2 карты)
Ребят... помогите... я не разбираюсь в тонкостях есть на руках две карты 1. NVIDIA QUADRO FX 4600 (...

Отцентровка страницы
Приветствую знатоков и экспертов IT! :senor: Есть вопрос касательно отцентровки всей страницы. Использовал margin:0 auto; при изменении...

Отцентровка блоков
Есть исходный код http://jsfiddle.net/3j06e880/ На нем не правильно отображается нижние блоки, они должны выровняны под картинкой, т.е....

Отцентровка заголовока таблицы
Доброго времени суток, форумчане! Собрал стиль таблицы, но он никак не хочет центровать заголовок. Вот код: &lt;Style...

Отцентровка текста в DIV'e
Здравствуйте товарищи. Сайт: контраст-пермь.рф Проблема: Не могу отцентровать текст в менюшке которая находится ниже шапки Flexheader....


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru