Php точки на карте

Рисуем координаты на карте с помощью PHP + GDLib

Так сложилось что по долгу своей службы я занимаюсь гео-поиском. И зачастую мне нужно показать на карте координаты пользователей, для того чтобы сделать какие-либо анализы. Для этой цели я, до определенного времени, успешно использовал Google Maps, пока, однажды, мне не понадобилось нанести на карту не много не мало 16 млн. координат.

Как я это сделал?

На ум сразу пришла библиотека DynamicDataDisplay, о которой писалось здесь не так давно. Но к сожалению нарисовать карту мне нужно было на Linux-сервере. Да и, вобщем-то если бы даже её и можно было запустить на линуксе — сделать это было бы крайне проблематично. Я решил не искать готового, а разобраться заодно с тем, что давно хотел сделать.

Итак, нам понадобятся: PHP, GDLib и самая малость энциклопедических знаний.

За знаниями отправляемся на Википедию. Вкратце расскажу теорию.

Земля круглая, а мониторы плоские. Для того, чтобы можно было смотреть землю на мониторе — существуют методы проецирования земного шара на плоскость.
Один из таких методов — проекция Герарда Меркатора, заключается в том что земной шар вытягивают в районе полюсов в цилиндр, а затем получившийся цилиндр разрезают по 180 меридиану в результате чего получается плоское изображение.

Так как в районе полюсов карта получается очень растянутая, то небольшие куски сверху и снизу карты обрезаются (оставляют диапазон широт примерно от -85° до 85°). В итоге получается такая карта:

На википедии можно скачать карту проекции Меркатора в высоком разрешении на которой мы и будем рисовать.

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

С широтой сложнее. Масштаб увеличивается от экватора к полюсам. Чем дальше от экватора — тем выше искажение.
Увеличивается масштаб по такой формуле:

Здесь φ — это широта (в радианах), y — коэффициент искажения.
Зная это — умножаем широту на масштаб по Y и на коэффициент искажения.

Читайте также:  Java check if exe is running

В качестве примера я сделал небольшой скрипт который рисует на карте точки. Там же можно найти несколько примеров использования.
Мои 16 млн. координат я смог нанести на карту с помощью этого скрипта примерно за 2 минуты. Получилось примерно следующее:

UPD: Пользователь axshavan в коментариях рассказал о равнопромежуточных проекциях.
Доработал немного скрипт, добавил в него поддержку этой проекции.

Вкратце отличия от проекции меркатора:

Проекция не искажается по широте, соотв. широта считается так же как и долгота.
Есть несколько преимуществ в использовании этой проекции: во первых немного увеличивается диапазон широт, во вторых несколько быстрее просчитываются точки, т.к. математические операции — примитивные.
Впрочем есть один незначительный минус — карта немного «сжата» по вертикали.

Источник

Как вывести метки на Яндекс.Картах из MySQL+PHP

В статье рассмотрены примеры как вывести метки на карту из БД.

Структура БД

В таблице `objects` находятся записи с названиями и координатами объектов:

CREATE TABLE IF NOT EXISTS `objects` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `point` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; INSERT INTO `objects` (`id`, `name`, `point`) VALUES (1, 'Тверская 9', '55.75985606898725,37.61054750000002'), (2, 'Тверская, 20', '55.766642568974845,37.60237299999997'), (3, 'Охотный Ряд, 1 ', '55.75805306898262,37.6160005'), (4, 'Солянка, 16 ', '55.75061056899327,37.64180899999995');

Получение и вывод метки

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль'); // Запись с `id` = 1 $sth = $dbh->prepare("SELECT * FROM `objects` WHERE `id` = 1"); $sth->execute(); $object = $sth->fetch(PDO::FETCH_ASSOC);

И выведем полученную запись на карту:

   

Источник

Рисуем координаты на карте с помощью PHP + GDLib

Так сложилось что по долгу своей службы я занимаюсь гео-поиском. И зачастую мне нужно показать на карте координаты пользователей, для того чтобы сделать какие-либо анализы. Для этой цели я, до определенного времени, успешно использовал Google Maps, пока, однажды, мне не понадобилось нанести на карту не много не мало 16 млн. координат.

Как я это сделал?

На ум сразу пришла библиотека DynamicDataDisplay, о которой писалось здесь не так давно. Но к сожалению нарисовать карту мне нужно было на Linux-сервере. Да и, вобщем-то если бы даже её и можно было запустить на линуксе — сделать это было бы крайне проблематично. Я решил не искать готового, а разобраться заодно с тем, что давно хотел сделать.

Итак, нам понадобятся: PHP, GDLib и самая малость энциклопедических знаний.

За знаниями отправляемся на Википедию. Вкратце расскажу теорию.

Земля круглая, а мониторы плоские. Для того, чтобы можно было смотреть землю на мониторе — существуют методы проецирования земного шара на плоскость.
Один из таких методов — проекция Герарда Меркатора, заключается в том что земной шар вытягивают в районе полюсов в цилиндр, а затем получившийся цилиндр разрезают по 180 меридиану в результате чего получается плоское изображение.

Читайте также:  Java pattern match any string

Так как в районе полюсов карта получается очень растянутая, то небольшие куски сверху и снизу карты обрезаются (оставляют диапазон широт примерно от -85° до 85°). В итоге получается такая карта:

На википедии можно скачать карту проекции Меркатора в высоком разрешении на которой мы и будем рисовать.

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

С широтой сложнее. Масштаб увеличивается от экватора к полюсам. Чем дальше от экватора — тем выше искажение.
Увеличивается масштаб по такой формуле:

Здесь φ — это широта (в радианах), y — коэффициент искажения.
Зная это — умножаем широту на масштаб по Y и на коэффициент искажения.

В качестве примера я сделал небольшой скрипт который рисует на карте точки. Там же можно найти несколько примеров использования.
Мои 16 млн. координат я смог нанести на карту с помощью этого скрипта примерно за 2 минуты. Получилось примерно следующее:

UPD: Пользователь axshavan в коментариях рассказал о равнопромежуточных проекциях.
Доработал немного скрипт, добавил в него поддержку этой проекции.

Вкратце отличия от проекции меркатора:

Проекция не искажается по широте, соотв. широта считается так же как и долгота.
Есть несколько преимуществ в использовании этой проекции: во первых немного увеличивается диапазон широт, во вторых несколько быстрее просчитываются точки, т.к. математические операции — примитивные.
Впрочем есть один незначительный минус — карта немного «сжата» по вертикали.

Источник

Рисуем координаты на карте с помощью PHP + GDLib

Так сложилось что по долгу своей службы я занимаюсь гео-поиском. И зачастую мне нужно показать на карте координаты пользователей, для того чтобы сделать какие-либо анализы. Для этой цели я, до определенного времени, успешно использовал Google Maps, пока, однажды, мне не понадобилось нанести на карту не много не мало 16 млн. координат.

Как я это сделал?

На ум сразу пришла библиотека DynamicDataDisplay, о которой писалось здесь не так давно. Но к сожалению нарисовать карту мне нужно было на Linux-сервере. Да и, вобщем-то если бы даже её и можно было запустить на линуксе — сделать это было бы крайне проблематично. Я решил не искать готового, а разобраться заодно с тем, что давно хотел сделать.

Читайте также:  Opening zip files python

Итак, нам понадобятся: PHP, GDLib и самая малость энциклопедических знаний.

За знаниями отправляемся на Википедию. Вкратце расскажу теорию.

Земля круглая, а мониторы плоские. Для того, чтобы можно было смотреть землю на мониторе — существуют методы проецирования земного шара на плоскость.
Один из таких методов — проекция Герарда Меркатора, заключается в том что земной шар вытягивают в районе полюсов в цилиндр, а затем получившийся цилиндр разрезают по 180 меридиану в результате чего получается плоское изображение.

Так как в районе полюсов карта получается очень растянутая, то небольшие куски сверху и снизу карты обрезаются (оставляют диапазон широт примерно от -85° до 85°). В итоге получается такая карта:

На википедии можно скачать карту проекции Меркатора в высоком разрешении на которой мы и будем рисовать.

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

С широтой сложнее. Масштаб увеличивается от экватора к полюсам. Чем дальше от экватора — тем выше искажение.
Увеличивается масштаб по такой формуле:

Здесь φ — это широта (в радианах), y — коэффициент искажения.
Зная это — умножаем широту на масштаб по Y и на коэффициент искажения.

В качестве примера я сделал небольшой скрипт который рисует на карте точки. Там же можно найти несколько примеров использования.
Мои 16 млн. координат я смог нанести на карту с помощью этого скрипта примерно за 2 минуты. Получилось примерно следующее:

UPD: Пользователь axshavan в коментариях рассказал о равнопромежуточных проекциях.
Доработал немного скрипт, добавил в него поддержку этой проекции.

Вкратце отличия от проекции меркатора:

Проекция не искажается по широте, соотв. широта считается так же как и долгота.
Есть несколько преимуществ в использовании этой проекции: во первых немного увеличивается диапазон широт, во вторых несколько быстрее просчитываются точки, т.к. математические операции — примитивные.
Впрочем есть один незначительный минус — карта немного «сжата» по вертикали.

Источник

Оцените статью