Создание интерактивной карты офиса, часть 2

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

    Кратко напомним, зачем нам вообще понадобилось создавать карту своего офиса. Наша компания в последние годы достаточно бурно развивается, и количество сотрудников постоянно увеличивается (сейчас нас больше 300 человек). Соответственно, и найти нужного тебе коллегу среди такого количества людей бывает непросто, а с помощью карты легко можно узнать, где именно в офисе он сидит. Часто приходится решать и обратную задачу: бывает, что визуально человек знаком, известно и местонахождение его рабочего места, но вот ни имени, ни адреса электронной почты вспомнить не удается. Эти данные можно получить, кликнув по нужному столу на карте.

    Было -> стало


    Вообще, карта была переделана чуть более чем полностью. Этому способствовало не только желание разработчиков улучшить те моменты, которые давно хотелось улучшить, но и некоторые технические и юридические аспекты, о которых пойдет речь ниже.

    Новый движок

    Старая версия карты хорошо масштабировалась и, в принципе, ничто не мешало нам использовать ее после переезда. Однако в комментариях к прошлой статье нам указали на то, что пользовательское соглашение API Яндекс.Карт, на базе которых работала предыдущая версия, нельзя использовать так, как это делали мы. Поддержка Яндекса подтвердила этот факт, и — поскольку мы люди законопослушные — было решено «переехать» с карт Яндекса на опенсорсный движок отображения карт Leaflet.

    К слову, в актуальной на тот момент версии Leaflet 0.4.3 не было необходимой нам плоской проекции, и нам пришлось реализовать ее своими силами. В нынешней версии 0.5 эта функциональность присутствует, но координаты вычисляются немного не так, как у нас. Поэтому наша карта пока что работает на более старой версии движка.

    В комментариях к предыдущему посту нам также советовали обратить внимание на несколько других вариантов графических движков (вплоть до Planner 5D), но победил все же Leaflet, с небольшим отрывом опередивший OpenLayers.

    Главная трудность при разработке новой карты заключалась в экспорте столов (т.е. данных, которые их обозначают) из AutoCAD в базу данных. С одной стороны, это не было обязательным, ведь можно просто расставить столы сразу на карте. Но с другой стороны, поскольку столы стоят не ровно, а повернуты кто куда, то пришлось бы вручную «вертеть» кучу столов, чего делать не хотелось.

    В итоге была реализована схема, работающая следующим образом:

    1. В AutoCAD столы сдвигались на отдельный слой.
    2. Этот слой обрабатывался специальным скриптом на Lisp (его мы нашли в интернете; на всякий случай — вот он), который экспортировал данные в своем формате.
    3. Далее эти данные поступали на вход скрипту на питоне (с ним проще было иметь дело), который переводил их в SQL-скрипт вставки в базу. На этом же этапе происходил пересчет координат соответствия столов из терминов AutoCAD, в термины Leaflet.

    Если же нужно было «дорисовать» какие-то объекты, которых изначально не было (переговорки и проч.), то схема повторялась: создание объекта в автокаде → перемещение его на отдельный слой → экспорт данных лисповым скриптом → конвертация в SQL → вставка в базу.

    В результате изменился и внешний вид карты.

    Было:



    Стало:


    Карта располагается на интранет-портале компании, с которым по расписанию синхронизируются ее данные.

    Перемещение сотрудников

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

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

    В итоге сейчас сотрудникам отдела кадров нужно лишь кликнуть на стол на карте и выбрать из выпадающего списка сотрудника, который будет за ним сидеть.



    Введение пользовательских ролей

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

    Для аутентификации мы используем встроенный в ASP.NET механизм NTLM и несложную самописную систему ролей, позволяющую указать группы прямо в конфигурации приложения.



    Сейчас, кстати, на карте отсутствует возможность рисования новых столов. Ввиду того, что столов в новом офисе больше, чем сотрудников и организация новых рабочих мест пока не планируется, какое-то время эта функция не будет востребована. Хотя штука, конечно, нужная, и мы собираемся реализовать ее в будущем.

    Планы


    Совсем недавно мы провели опрос среди коллег, в результате которого удалось собрать большое количество идей. Были среди них и оригинальные предложения, например сфотографировать весь офис и сделать из этого панорамы (наподобие Google Street View), чтобы можно было совершать по офису виртуальные прогулки, но пока целесообразность данного нововведения ставится разработчиками карты под сомнение :).

    Помимо этого в планах значатся:

    • Реализация возможности бронирования стола сотрудниками отдела кадров для нового сотрудника заранее, пока он еще не вышел на работу и для него еще не заведена учетная запись в Active Directory.
    • Реализация возможности рисования столов на карте (можно сделать с помощью https://github.com/Leaflet/Leaflet.draw).
    • Добавление принтеров, аптечек и прочих потенциально нужных объектов. Первые шаги в этом направлении уже сделаны: на карте появились переговорные комнаты, телефонные будки, библиотека и стены для рисования маркером.

    Существуют и другие идеи разной степени проработанности и необходимости: слои на карте (например, с теми же принтерами и прочей офисной техникой) или интеграция с MS Exchange (при клике на переговорку показывать, когда и кем она занята и когда будет свободна, при клике на сотрудника выводить запланированные встречи из календаря). В дальнейшем, возможно, мы реализуем что-нибудь из этого.

    Демо


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

    UPD: Выложили исходники.

    Будем рады ответить на вопросы в комментариях. Всегда ваши, разработчики карты MikeOzornin и evgekon
    Positive Technologies
    144,00
    Компания
    Поделиться публикацией

    Комментарии 24

      +2
      А исходники, конечно, открывать не будете, да?
        +4
        Будем. Сейчас посмотрим, всё ли убрали из внутреннего (данные о сотрудниках, тайлы карты офиса и прочее) и выложим. Я напишу коммент, как сделаем.
          +5
            +1
            Спасибо большое вам!
          0
          Ребята, некрасиво получается: по ссылке в вашем демо «Продаем рекламу в popup'ах. Обращайтесь».
            +9
            У нас точно так же сделано и на офисной карте. Мы так выявляем коллег без чувства юмора :)
              +1
              Признаюсь, поймали :) С первым апреля вас!
                +2
                Тест на чувство юмора у нас висит на карте всегда, не только 1 апреля )
            0
            Я бы добавил еще какое-то понятное имя для обьектов, чтобы можно было встречаться в курилке «Майами», например, для однозначной идентификации этой самой курилки среди десятка.
            Из вариантов — по клику на сотруднике менюшка вроде «Отправить письмо/забить стрелку/написать в skype/lync/позвонить в sip»
              0
              Переговорки у нас тоже размечены, на них можно тыкнуть и посмотреть, что за переговорка, есть поиск: можно ввести название пеговорки и карта кажет, где переговорка. Ничего не мешает сделать так же курилки, слава богу их нет во всем бизнес-центре.

              Отправить письмо уже сейчас можно, благо это просто, про интеграцию с lync'ом думаем, но хочется сложней, чем просто ссылку, хочется показывать статус, например.
                0
                Ага. тогда уже можно в том числе смотреть над какими проектами человек работает (с фильтрами по проектам) и по списку проектов выделять всех участников на карте — тоже фича, да.
              0
              Кстати, а как вынесли роли из харкода в описании методов в настройки прилоежния в mvc?
                0
                Сейчас ролей две: читать и читать+править. Пользователи с ролью на правки вынесены в конфиг: github.com/mikeozornin/positive-office-map/blob/master/MapMvc/Web.config (15 строка).

                Если нужно что-то подробней, скажите, я призову в комментарии разработчика, он может пояснить. Я в асп.нет мвц не разбираюсь
                0
                Замечательно, можно было бы сделать на старом месте работы, но увы, не судьба.
                Могу внести предложение по ещё бОльшей автоматизации, ведь карта всё равно синхронизируется с доменом для авторизации:
                У каждого объекта есть свой код, например у стола на 5-ом этаже в кабинете 511, слева третий — 05.511.03, вот этот код сотрудники прописывают в каких-нибудь атрибутах пользователя (например адрес или описание и тд.).
                Поэтому стоит нажать на нужный стол (или использовать память), написать этот код у нового/старого пользователя в доменной учётке и он станет сидеть за тем столом, а вот как сделать проверку кто ещё сидит за тем же столом…
                  0
                  Этот способ возможен, но тогда для пересаживания нужен будет доступ к домену и умение им пользоваться, а сейчас кадровики сами справляются.
                  0
                  Я правильно понимаю, что в Leaflet у вас есть базовый растровый слой (собственно изображение карты) и векторный слой комнат и контуров столов, к которым привязаны popup'ы?
                  Если да, то у меня есть идея, как существенно улучшить внешний вид карты. Нужно всего лишь добавить antialiasing. Зубчатые линии уж слишком казенно выглядят, а сложные криволинейные объекты (стулья и растения) вообще создают впечатление кривизны и неряшливости.
                  Честно говоря, не знаю, есть ли у Автокада опция экспорта с антиалиасингом, но его можно успешно имитировать, если экспортировать изображение с двойным запасом по разрешению а потом уменьшить его в два раза с интерполяцией.
                    0
                    Да, все верно, есть растровые тайлы, которые получены из автокада, и векторные активные области, которые рисует лифлет. К активным областям привязаны попапы.
                    Изначально я пробовал экспортировать из автокада сразу в наибольшем размере, а потом уменьшать с интерполяцией. Это приводило к тому, что часть линий пропадало (картинка была большая, 4000х4000 и линии в пиксель толщиной алгоритмом уменьшения обрабатывались не всегда корректно). Поэтому потом я стал просто экспортировать из автокада три картинки (под каждый зум). Стало лучше, стены стали на месте.

                    К сожалению я не знаю, есть ли в автокаде возможность экспорта в более гладком виде.
                      0
                      А вариант с экспортом в векторный формат (EPS или PDF) c последующей растеризацией средством, которое умеет antialiasing (imagemagick+ghostscript, например) не рассматривали?
                        0
                        Нет даже не думали об этом, в силу того, что просто сложно, ну не родилась такая идея.
                          0
                          Это не сложно — всего один лишний шаг, на самом деле.
                            0
                            Например:
                            convert -density 144x144 +antialias image.eps image.png
                            (требует установленных ImageMagick и Ghostscript)
                      –1
                      Я немного не понял, во введении говорилось, что карта позволяет узнать местонахождение сотрудника. Я так понял, что она берет данные из СКД по текущему положению сотрудника(что было бы реально полезно), а выходит, что оно показывает место, где сотрудник работает? А в чем сложность интеграции с СКД для слежения в реальном времени за перемещениями сотрудников — вы ею просто не пользуетесь или это нарушает приватность(хотя какая может быть приватность на рабочем месте)?
                        +1
                        Местоположение — это и есть для нас рабочее место.

                        Самая главная причина, по которой я, как инициатор карты, даже не думаю это делать — непонятно зачем. Я не могу придумать ни одного полезного сценария, при котором нужно срочно кого-то лично увидеть, но при этому нельзя позвонить. Остаются ещё и нарушения приватности. Я бы сразу начал искать другую работу, если бы в компании начались внедрения подобных вещей. Я очень надеюсь, что у нас в компании не будет таких↓ случаев, не будет сервиса «покажи где прямо сейчас находится сотрудник Х», и что вообще здравый смысл не будет побеждён СКД.

                        Я правильно понимаю, что для вас нет приватности на рабочем месте? Вы готовы работать, если экран вашего компьютера будет транслироваться в публичное место (в офисе, конечно), если ваша переписка (рабочая) будет доступна всем коллегам, если за вами всегда будет следить камера и опять же транслироваться, ну, например, в столовую? Как вам, комфортно будет?
                          0
                          Сначала отвечу на персонально адресованные вопросы: у нас компания небольшая и дисциплина скорее семейная, чем деловая. Поэтому бывает и не целевое использование рабочего компьютера, что сделало бы трансляцию его экрана несколько не комфортной для сотрудника. Однако в больших компаниях, где дисциплина поставлена строго, действительно нет места приватности за исключением уборных и столовой. Если бы вопросы дисциплины были бы строго очерчены и требовалось их соблюдение — безусловно никакого зла в доступе к моей переписке и экрану ПК не было бы. Тем более, что технически никакой сложности доступ к экрану и переписке не составляет. Ваш IT-персонал может следить за вами, если захочет. Насчет камеры — меня итак все время видят коллеги — какая мне разница, ну транслирует, и? Как будто у кого-то есть время весь день смотреть на меня в монитор. Но ведь речь даже не об этом, а о местоположении в рамках офиса.
                          Теперь к сути вопроса: понимать в каком кабинете находится тот или иной сотрудник — это зачастую очень нужная информация. Возможно у вас люди мало мобильны в течении дня, но во многих организациях люди постоянно перемещаются и иметь подспорье в виде интерактивной карты — это отлично. Возможно не с общим доступом, а с доступом для ресепшн, где можно всегда получить справку о местонахождении нужного сотрудника. Это избавило бы от таких неудобных моментов, как звонки на телефон в неудобное время — на совещании, например. Не понимаю, как перемещения по офису, с указанием номера текущего кабинета, влияют на приватность.
                          Вообще — идея интересная, надо подумать над реализацией.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое