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

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

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

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

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

А как определить правильный зум для карты? (Например, если всего 2 адреса прямо рядом находятся, то увеличение сильное должно быть. А если всего 2 адреса по разным краям города - то зуб должен быть далеким. Адресов может быть неизвестное количество). Как можно решить этот вопрос?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2016, 09:13
Ответы с готовыми решениями:

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

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

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

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

8
Эксперт PHP
5509 / 3975 / 1420
Регистрация: 06.01.2011
Сообщений: 10,948
08.09.2016, 09:53 2
Смотрю в документации:
https://tech.yandex.ru/maps/do... state.zoom

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

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

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

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

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

Неужели всех этих вычислений нет на Яндекс.Карты...
1
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
08.09.2016, 09:55  [ТС] 3
Ужас)) Буду пытаться разбираться)) Спасибо Вам)
0
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
09.09.2016, 13:34  [ТС] 4
Не, не осилил я эти вычисления, к сожалению...
0
832 / 442 / 223
Регистрация: 20.05.2015
Сообщений: 717
09.09.2016, 15:02 5
Лучший ответ Сообщение было отмечено 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  [ТС] 6
evikza, Огромное спасибо. То, что нужно!
0
Эксперт PHP
5509 / 3975 / 1420
Регистрация: 06.01.2011
Сообщений: 10,948
10.09.2016, 08:04 7
Цитата Сообщение от 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  [ТС] 8
Para bellum, благодарю Вам))
0
Эксперт PHP
5509 / 3975 / 1420
Регистрация: 06.01.2011
Сообщений: 10,948
10.09.2016, 11:20 9
Ну, если пригодится -- пожалуйста.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2016, 11:20
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru