[РЕШЕНО] OpenLayers - Внедрение карты в Друпал

Главные вкладки

Аватар пользователя MasteRRR MasteRRR 2 октября 2010 в 19:01

Здравствуйте, уважаемые форумчане/друпаловеды/друпальщики. У меня следующая проблема: Заказчик хочет на сайт выложить карту города с возможностью переходить от общего вида города к выбранному району.
Требования:
1. На карту должны быть нанесены наши "водяные знаки": название сайта и логотип компании
2. Сделать так, чтобы карту нельзя было скачать.
Доп. требования:
3. Возможность добавлять свои пометки на карте зарегистрированным пользователям.
Имеется: 300мб карт и сайт на Друпале.

Вопросы:
1. Существует ли готовое решение для друпала, реализующее хотя бы базовые требования?
2. Существует ли бесплатное решение, которое не связанно с Друпалом, реализующее хотя бы базовые требования?
Пока думаю насчет Flash-овой карты, но я с ним не знаком, поэтому пока ищу готовое решение. Ну и имеется ли компонент, который накладывает "водяные знаки" на изображения?

UPD1: Как внедрить собственную карту, созданную с помощью OpenLayers? См. Ниже
[Решение]: Совсем забыл сообщить о решении. Исправляюсь)
Кратко решение исходной проблемы выглядит так:
1. Нарезаем растр с помощью MapTiler (или py-GDAL).
2. На всю эту кучу файлов накладываем водяные знаки с помощью ImageMagick.
3. Устанавливаем модуль OpenLayers.
4. Создаем слои с вашими картами, в пути к слою выбираем относительный путь к корневой папке с тайлами.
5. Создаем Preset с вашими слоями.
6. Создать тип содержимого с полем OpenLayers WKT, с созданным вами Preset'ом.
7. ...
8. PROFIT!

Комментарии

Аватар пользователя adubovskoy adubovskoy 2 октября 2010 в 19:26

Делайте на флеше. Теоретически можно на js написать - но так ее гораздо проще будет "слить", т.к. все-равно придется клиенту отдавать картинки.

Аватар пользователя Stutzer Stutzer 2 октября 2010 в 19:44

существует готовое бесплатное решение
GIS (MapServer или GeoServer) + OpenLayers
но если вы с этим не знакомы, то, надеюсь, вы обладаете стальными нервами, терпением и кучей свободного времени Smile
Кстати, в каком формате ваши 300 метров карт?

Аватар пользователя adubovskoy adubovskoy 2 октября 2010 в 19:52

"Stutzer" wrote:
существует готовое бесплатное решение
GIS (MapServer или GeoServer) + OpenLayers

Век живи, век учись... меня радует drupal.ru... ушел читать документацию - не сталкивался, интересно. Спасибо за наводку)

Аватар пользователя Stutzer Stutzer 2 октября 2010 в 20:05

adubovskoy wrote:
Век живи, век учись... меня радует drupal.ru... ушел читать документацию - не сталкивался, интересно. Спасибо за наводку)

Удачи! Вас ждет чудесный новый увлекательный мир картографии, проекций, сферойдов, настольных ГИС-приложений, шэйпфайлов, SLD и прочих интересных штук Smile

Аватар пользователя Stutzer Stutzer 2 октября 2010 в 20:38

По теме, если более подробно, вам нужен WMS-сервер, которому скармливаются карты. Он по специальнообученному запросу рендерит/берет из кэша, накладывает логотипы, вотермарки и прочую хрень и отдает в виде куска карты или набора тайлов, которые js-библиотека openlayers любезно выводит на клиенте в виде клевой карты в стиле Google map.

Для друпала есть одноименный модуль openlayers, который немного помогает, но порой доставляет нереальные головняки, поскольку еще сыроват.
В общем, я на этом деле немало нервов потрепал, возможно, вам повезет больше )

Аватар пользователя kwas@drupal.org kwas@drupal.org 2 октября 2010 в 22:27

По-моему, и гугль и яндекс предоставляет возможность работать с их картами на своем сайте. Для гугля есть модулИ на друпале. Вот только с водяными знаками там, наверное, не прокатит. А метки ставить можно. А 300 метров карт не потребуются.

Аватар пользователя MasteRRR MasteRRR 3 октября 2010 в 8:39

"Stutzer" wrote:
существует готовое бесплатное решение
GIS (MapServer или GeoServer) + OpenLayers
но если вы с этим не знакомы, то, надеюсь, вы обладаете стальными нервами, терпением и кучей свободного времени Smile
Кстати, в каком формате ваши 300 метров карт?

Пытался установить OpenLayers, правда, там без поллитра не разберешься. Карты в формате jpg.

"Stutzer" wrote:
По теме, если более подробно, вам нужен WMS-сервер, которому скармливаются карты. Он по специальнообученному запросу рендерит/берет из кэша, накладывает логотипы, вотермарки и прочую хрень и отдает в виде куска карты или набора тайлов, которые js-библиотека openlayers любезно выводит на клиенте в виде клевой карты в стиле Google map.

Спасибо за наводку, что-то подобное я искал. Сколько времени займет данная задача при изучении WMS-сервера+OpenLayers с нуля?

Аватар пользователя Stutzer Stutzer 3 октября 2010 в 12:32

MasteRRR wrote:
Спасибо за наводку, что-то подобное я искал. Сколько времени займет данная задача при изучении WMS-сервера+OpenLayers с нуля?

Если с английским хорошо, то можно разобраться, если нет — лучше не связываться )
Значительную часть времени у меня заняла подготовка картографических данных, пришлось скачивать и ломать кучу GIS-систем, потом разбираться с этими монстрами, чтобы из одного формата получить другой, при этом избавиться от ошибок в данных, из-за который GeoServer вешался.
Дальше, когда GeoServer таки схавал мои карты, пришлось разбираться с проекциями (есть проекция, в которой хранятся картографические данные, есть отображаемая проекция). Само понятие проекция не сказать, что элементарное, к тому же из существует сотни разных... Далее SDL для стилизации данных, тоже пару дней убить придется, чтоб понять что к чему. У меня, к примеру, получился файл для стилизации дорожной сети в 1700 строк Smile Потом сами openlayers, тоже не самая простая штука.
В общем, есть на что потратить время в этом стеке технологий. Документация по GeoServer и OpenLayers довольна хорошая, а вот нужную инфу по основам картографии я откапывал с трудом, потому что порой просто не знаешь, по какому слову гуглить то или иное явление.
Если в сумме, то начал заниматься этим вопросом я еще летом, но копаюсь до сих пор, правда, с перерывами на отпуски, и другие проекты. На текущий момент, благо, все уже находится на стадии «украшательства» и добавления «фишечек».
Если честно, до сих пор я себя считаю в этой теме полным чайником, т.к. кучу вещей еще неплохо было бы изучить для эффективной работы с геоданными (научиться использовать тот же PostGIS, например, вместо шэйпфайлов), кучу базовых концепция картографии неплохо было бы более детально изучить. Пока все на уровне «работает» и замечательно.

В общем, удачи!

Аватар пользователя Stutzer Stutzer 3 октября 2010 в 12:36

MasteRRR wrote:
Пытался установить OpenLayers, правда, там без поллитра не разберешься. Карты в формате jpg.

Это по умолчанию, нормальный WMS-сервер может отдавать тайлы в любом формате с множеством настроек (с антиалайсингом/без него, сглаживать только текст, и текст и графику, не сглаживать ничего). Генерировать jpeg, png, gif, прозрачный png. Накладывать водяные знаки и проч...
Гибкости и возможностей там достаточно для самого искушенного пользователя. Посмотрите, хотя бы на вот эти карты http://mapbox.com/examples (правда, там используется не геосервер, а нечто под названием TileMill.

Аватар пользователя cand cand 3 октября 2010 в 13:59

Не хочу создавать отдельную тему, потому что вопрос тоже про карту города. Насколько я понял в этом топике идет речь о картах вытаскиваемых из специальных картографических серверов. Но что делать, если наш городок настолько мал и видимо не особо интересен, что нет его на ГеоКартах в таком разрешении, чтобы увидеть улицы?

Поэтому я решил отрисовать карту города сам (попросил в отделе землепользования тиффовскую оцифрованную). Отрисовывать буду в векторе. У меня вопрос: можно ли сделать стандартными средствами увеличение карты по районам? Вроде как натыкался на модуль, который выделяет на карте регионы и увеличивает их. Очень бы хотелось, чтобы ссылки на странички допустим магазинов появлялись и фотки магазинов и т.д. Это возможно стандартными способами сделать?

Аватар пользователя Stutzer Stutzer 3 октября 2010 в 14:21

cand wrote:
Насколько я понял в этом топике идет речь о картах вытаскиваемых из специальных картографических серверов. Но что делать, если наш городок настолько мал и видимо не особо интересен, что нет его на ГеоКартах в таком разрешении, чтобы увидеть улицы?

Здесь речь идет как раз о вашей ситуации: вашего города нет на общедоступных картах (гуглокарты, яндекскарты), а она вам очень нужна.

cand wrote:
Отрисовывать буду в векторе. У меня вопрос: можно ли сделать стандартными средствами увеличение карты по районам? Это возможно стандартными способами сделать?

Да, отрисовывайте карту, разбивайте на слои, конвертируйте в shapefile, загружайте в WMS-сервер, пишете SLD-стили, выводите на сайт с помощью OpenLayers.
Чем вам не стандартное решение?
Если проще, то shapefile (или база в PostGIS) + WMS-сервер + SLD + OpenLayers — это способ сделать свой гугломэп, с блекджеком и шлюхами Smile

Аватар пользователя MasteRRR MasteRRR 8 ноября 2010 в 13:10

Немного расскажу, как у меня получилось решить проблему:
1. Нарезаем растр с помощью MapTiler. Получаем несколько уровней отображения карты и тучу png-файлов размером 256х256 пикселей. Также MapTiler генерит страничку, отображающую тайлы с помощью OpenLayers.
2. На всю эту кучу файлов накладываем водяные знаки с помощью ImageMagick:
composite -watermark 15 -gravity South "watermark.png" result.png
Осталось последнее действие: Прикрутить это все к Друпалу. Пробовал через компоненты OpenLayers и Mapping Kit, однако затруднения как минимум, 2:
1. Как добавить свой с исходными тайлами?
2. С помощью чего его правильно отображать?

Аватар пользователя MasteRRR MasteRRR 15 ноября 2010 в 14:41

Итак, я почти закончил, осталось только то, что требует непосредственно работы с Друпалом.
Имеется: 300мб карт и сайт на Друпале. Карты порезаны с помощью MapTiler, на каждый тайл нанесены водяные знаки и т.д. Требуется интегрировать это с сайтом. Пробовал 3 способами:
1. Использование компонента OpenLayers:
В OpenLayers-компоненте я создал свой слой типа MapTiler, создал новый preset в котором по умолчанию выставлен единственный слой, который я создал, и создал новый тип содержимого с ССК-полем, которое использует этот preset. В результате - при создании ноды вполне нормально показывается слой/набор слоев, который я создал, работает переключение и т.д. а после сохранения все равно выводится слой по умолчанию (OpenStreetMaps). Какие причины могут вызывать это явление?

2. Использование компонента MappingKit:
Взял карту в виде целого файла, добавил как Image Layer как указано здесь http://aardbodem.nl/node/63. Результат - карта нормально вставилась, но уж больно медленная загрузка, скорее всего из-за большого файла карты. Можно ли подцепить как-нибудь правильно тайлы, сгенерированные для OpenLayers?
При попытке использовать TMS с путем к папке с тайлами у меня возникают ещё более жуткие жуткие тормоза, которые вешают сервер

3. PHP-инклуд HTML-страницы, генерируемой с помощью MapTiler - тормоза при работе с сайтом и нарушается верстка.

Как можно правильно вставить такую страницу и возможно ли это вообще?

Аватар пользователя MasteRRR MasteRRR 21 января 2011 в 12:59

Совсем забыл решение: Все оказалось достаточно запутанно, но после подключения тестовых слоев (модуль OpenLayers Tests из комплекта OpenLayers) удалось создать тип содержимого, который содержит выбранный Preset с необходимыми слоями. Скорее, это просто совпадение, однако сработало после первой же попытки.

Кратко решение исходной проблемы выглядит так:
1. Нарезаем растр с помощью MapTiler (или py-GDAL).
2. На всю эту кучу файлов накладываем водяные знаки с помощью ImageMagick.
3. Устанавливаем модуль OpenLayers.
4. Создаем слои с вашими картами, в пути к слою выбираем относительный путь к корневой папке с тайлами.
5. Создаем Preset с вашими слоями.
6. Создать тип содержимого с полем OpenLayers WKT, с созданным вами Preset'ом.
7. Разрешить просмотр созданного поля необходимым группам юзеров
8. ...
9. PROFIT!