- PVSM.RU - https://www.pvsm.ru -

NodeMap, но не то, что вы подумали

Понятно, что сама по себе идея без практической реализации не стоит ничего.

У меня в голове роится уйма идей, но на реализацию большинства из них не хватает времени, денег или желания. Это не сильно мешает, так как мне есть чем заняться, но летом я достаточно близко подошел к реализации одной из таких идей.

image [1]

К концу июля, через полтора месяца непрерывной работы и ежедневных коммитов у меня закончилось свободное время и до полноценного запуска я идею не довел. За это время был собран полнофункциональный прототип того, что я хотел сделать. Вчера в комментариях [2] к топику с похожей задумкой мне посоветовали опубликовать статью и поделиться наработками, чтобы код не лежал на гитхабе [3] мертвым грузом.

Водяные знаки

В начале июня я сидел у своих деда и бабушки в небольшом поселке на самой границе Татарстана и Башкирии, пил чай и смотрел старые фото. Дед в 50-80х годах увлекался фотографией и посмотреть было на что. В основном были «луки», фото людей в помещениях или на отдыхе на природе, подобные фото можно снимать и сейчас, поэтому они меня не очень интересовали.

Тем не менее, я отобрал около пятидесяти штук, показавшихся мне интересными, потому что на них были изображены знакомые всем жителям поселка места, которые сейчас выглядят совершенно по-другому. Я отсканировал их и, довольный, пошел делиться в стандартную для любого города группу вконтакте «Типичный %city%». Я и не подозревал, что группой заправляет малолетний денегерат, который испоганит своими немытыми ручонками мои, без сомнения, редчайшие и гениальные находки.

image [4]

Авторство снимков не было указано, комментарии в группе нещадно сносились, на личные сообщения малолетний дегенерат отвечать отказывался, а бить его в силу малолетнего возраста было как-то несподручно. Как вы наверное уже догадались, пукан у меня от такого поворота событий у меня бомбанул очень качественно, с огоньком. Нужен был план, и план появился.

План

Идея была простая как три копейки: напринтскринить гугл-карт поселка с нужным разрешением, попросить какого-нибудь фрилансера отрисовать её покрасивее, взять скрипты OpenStreetMap или leaflet.js и получилось бы даже лучше, чем в группе вконтакте — с привязкой к конкретному месту.

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

image [5]

image [6]

Невозможно отказаться

Теперь был файл index.html с подключенным скриптом leaflet.js [7] и тайлами карты, сгенерированными с помощью удобной, но платной программы MapTiler [8]. Я давно верстаю, а также немного знаю node.js, так что для меня не составило сложности по быстрому накидать простых поп-апов для добавления маркеров [9]. Данные гонялись туда-сюда REST-ом, сначала я тренировался на JSON-заглушках, а потом, когда захотелось обратной связи, поменял их на mongo с парой несложных табличек.

image [10]

Все работало, можно было заполнять, но в этот момент мне стало как-то грустно. Такая красивая штуковина, а под капотом полтора скрипта. Это не Web 2.0, это нединамично, надо что-нибудь туда еще прикрутить по быстрому. «По быстрому» продолжалось месяц, за это время было прикручено:

image [28]

Технические детали

Каркас приложения — nodejs/express/mongoose на сервере, leafletjs/backbone+underscore templates/fancybox на клиенте. Маршрутизации на клиенте нет вобще никакой. Сервер шлет json, проверяет авторизацию, жмет заливаемые картинки и собирает-минифицирует css/js grunt-om. Клиент делает все остальное.

Авторизация проверяется не только при входе, а при любых действиях пользователя, связанных со взаимодействием с сервером — далеко не на все у посетителей есть права, а админские вьюшки при большом желании запустить на клиенте(и потыкать разные нехорошие кнопочки) все-таки можно.

Однозначно есть баги, в конце июля я уехал работать и оставил проект в текущем виде.

Как запустить (не для слабых духом):

  1. Установить стабильные node.js [29] и mongodb [30].
  2. Установить imagemagick:
    npm i -g imagemagick
    

  3. Склонировать себе репозиторий:
    git clone https://github.com/Synopticum/nodemap.git
    

  4. Создать папку для базы данных /db в директории проекта и натравить на нее mongodb [31]:
    mongod --dbpath ~/nodemap/db
    
  5. Можно сделать в корне проекта
    npm install
    

    чтобы обновить модули, но я не проверял, может что-то отвалится.

  6. Запустить admincreate.js в корне проекта, чтобы создать в базе запись админа. Когда запись создастся — указать id свежесозданного админа в конфиге [32] /config/env.js.
  7. На стороне вконтакте тоже все должно быть настроено. Подробно это описано в других статьях и в документации vk api, но в двух словах — надо добавить себе приложение в аккаунт вконтакте и заполнить все необходимые настройки. Этот скрин [33] поможет.
  8. Запустить app.js [34]
  9. Зайти на localhost [35]:3000/

В реальности все не так страшно, как в этом списке и все процедуры занимают от силы минут 15. Запускать и отлаживать приложение рекомендую уже не в консоли, а в WebStorm.

Felina

Так что же по поводу изначальной идеи? Старые фото с привязкой к местности и все такое? Все в более чем в силе [36]. Хотя я устроился на работу и свободное время абсолютно закончилось, клиентская часть проекта зимой будет переписана заново.

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

В процессе работы стало понятно почему на подобных сервисах на гугл- или яндекс-картах никто толком и не сидит — потому что они унифицированые и бездушные. А такие штуки как эта — работа ручная. Было бы интересно завершить хотя бы один такой проект, но еще интереснее, если бы их было несколько с каким-то общим API для межсайтового взаимодействия, с возможностью навигации по таким изолированным, но хорошо детализованным кусочкам карт, объединенных в общую сеть, подключенную к межгалактическому роутеру…

Как думаете, роботы захватят мир?)

NodeMap on GitHub [3]

Автор: Synoptic

Источник [37]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/72056

Ссылки в тексте:

[1] Image: http://habrastorage.org/files/abc/a51/e12/abca51e12c944b6a856a98aa36dd07e8.jpg

[2] в комментариях: http://habrahabr.ru/post/240681/#comment_8072113

[3] гитхабе: https://github.com/Synopticum/nodemap

[4] Image: http://habrastorage.org/files/52d/633/db7/52d633db723941d0aa41e544b60331eb.jpg

[5] Image: http://habrastorage.org/files/afa/9cc/a1a/afa9cca1adb34b9e8b2145761a1118a1.png

[6] Image: http://hsto.org/files/ae8/06d/fa4/ae806dfa43ea46f8ae9ebd73135dfbfa.jpg

[7] leaflet.js: http://leafletjs.com/

[8] MapTiler: http://www.maptiler.org/

[9] маркеров: https://www.iconfinder.com/search/?q=marker&minimum=32&maximum=32&price=free

[10] Image: http://habrastorage.org/files/87a/702/13f/87a70213f2f242e6a43e3114b1d85c2a.jpg

[11] через: http://habrastorage.org/files/973/758/1af/9737581afdd64948aff235b6eb5dcc4a.png

[12] вконтакте: http://habrastorage.org/files/eb7/4c3/222/eb74c3222e844929a10e273920a9319c.png

[13] passportjs: http://passportjs.org/

[14] маркер определенного цвета, заголовок, краткое описание: http://hsto.org/files/bbe/21d/a21/bbe21da215e0406384e132b5e1e18869.png

[15] галерея изображений: http://habrastorage.org/files/19b/a3c/2eb/19ba3c2ebf5b4fdcaecb46b486b695e9.png

[16] будет доступна кнопка Play/Pause: http://hsto.org/files/d63/f3e/38d/d63f3e38d7d3464db6d0686171aca5d3.png

[17] комментить: http://habrastorage.org/files/8f9/0f3/974/8f90f3974a584014a8cdc5eddc186d82.png

[18] просматривать карту: http://habrastorage.org/files/93b/ecd/c86/93becdc86b47441e97c107a987fdd3c4.png

[19] добавлять точки: http://habrastorage.org/files/86e/b8c/3b8/86eb8c3b89d04fdebe4c0dee86c39135.png

[20] доставку еды из местной пиццерии и просмотр времени до автобуса: http://habrastorage.org/files/5f5/9de/88c/5f59de88cbf34a88b8b5d9c20f4ab744.png

[21] пропускать или не пропускать сообщения: http://habrastorage.org/files/98b/76c/539/98b76c539b3a4fb496009e298c6699e0.png

[22] режим trusted: http://habrastorage.org/files/689/cf3/956/689cf39569fd4c8da783a651e548687d.png

[23] новости: http://habrastorage.org/files/f9e/575/e66/f9e575e66a8745788bfa57f5e6e28c2d.png

[24] объявления: http://habrastorage.org/files/9a0/655/5ec/9a06555ec88c4ebfb21f896bfcbf1317.png

[25] инициативы: http://habrastorage.org/files/1a6/fe9/0cd/1a6fe90cd37e42beb85752831a395bee.png

[26] жалобы: http://habrastorage.org/files/898/bfd/67a/898bfd67aa4e434ca47eb6b52ac0ef3b.png

[27] анонимный раздел: http://habrastorage.org/files/b50/36a/66e/b5036a66ef27422fb148c790ffb897ed.png

[28] Image: http://habrastorage.org/files/823/bbc/4c7/823bbc4c78ec41b981d0bc35aa9b7a41.jpg

[29] node.js: http://nodejs.org/

[30] mongodb: http://www.mongodb.org/

[31] натравить на нее mongodb: http://habrastorage.org/files/f5a/8db/1fd/f5a8db1fd0df49c9b1d016b728a0eacb.png

[32] в конфиге: http://habrastorage.org/files/6ef/0d3/ef4/6ef0d3ef44e441d2baf816606a49a3e2.png

[33] Этот скрин: http://habrastorage.org/files/58c/a6e/ce5/58ca6ece5cc840ab8bc2915579666d63.png

[34] Запустить app.js: http://habrastorage.org/files/496/18c/071/49618c07117e4e0d8f75e3193e6bfeae.png

[35] localhost: http://localhost

[36] Все в более чем в силе: http://habrastorage.org/files/602/988/3b2/6029883b23a5470ba0d3be8bb3c4f2b4.png

[37] Источник: http://habrahabr.ru/post/240807/