Свои карты на leaflet.js

    В городе Красноярске намечено проведение Универсиады в 2019 году, в связи с этим и не только администрация Красноярска проводит разработку генерального плана территориального развития города до 2033 года. Недавно чиновники выложили схемы генерального плана на сайте администрации города для общественного обсуждения. Но вот незадача: просмотр и анализ схем неудобен, потому что файлы имеют большие размеры и разрешение. Например, файл основной схемы имеет размер 43,34Мб и разрешение 19256x16019px. У меня компьютер тормозит при просмотре такой картинки.

    Немного поскриптовав с коллегами, сделали вот такую интерактивную карту antirek.github.io/krskmap/main/index.html



    Далее немного подробнее, как сделать свою карту на leaflet.js из картинки с большим разрешением.


    Действия

    1. Подготавливаем слои. Чтобы карты можно было зуммировать (приближать-отдалять), необходимо сделать слои.

    Делаем 4 слоя (первый — это исходный файл и еще 3 с уменьшением в два раза каждый)

    $ convert bigdata.jpg -resize 50% bigdata_50.jpg
    $ convert bigdata.jpg -resize 25% bigdata_25.jpg
    $ convert bigdata.jpg -resize 12.5% bigdata_125.jpg
    


    2. Каждый слой нарезаем и складываем в отдельные директории
    $ convert -crop 100x100 bigdata.jpg  7/%d.jpg
    $ convert -crop 100x100 bigdata_50.jpg  6/%d.jpg
    $ convert -crop 100x100 bigdata_25.jpg  5/%d.jpg
    $ convert -crop 100x100 bigdata_125.jpg  4/%d.jpg
    


    Поскольку сходу не нашел как при нарезке нумеровать файлы по строкам и столбцам в документации на ImageMagick, пришлось делать шаг 3.

    3. Переименование файлов из линейной нумерации в сетку XxY

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

    <?php
    $pieces_count = 2550; //Число файлов-тайлов
    $pieces_count_on_row = 50; //Число файлов-тайлов, уложившихся в длину изображения, округленное в большую сторону.
    for($i=0; $i <= $pieces_count; $i++){
      $filename = (int)($i / $pieces_count_on_row);
      $filename .= 'x' . $i % $pieces_count_on_row;
      rename("{$i}.jpg","{$filename}.jpg");
    }
    ?>
    


    4. Подключаем на страничку скрипт leaflet.js, которому указываем, где брать тайлы для нашей карты.
    <div id="map" class="map"></div>
    
    <script>
    
    var map = L.map('map').setView([0, 0], 4);
    
    L.tileLayer('{z}/{y}x{x}.jpg',{
    minZoom: 4,
    maxZoom: 7,
    attribution: '',
    tms: false
    }).addTo(map);
    
    </script>
    

    Где самая магия это {z}, {x}, {y}. {z} — это уровень zoom'а, здесь стоит от 4 до 7, в таких директориях лежат нарезки тайлов каждого масштаба, в 4 низкая степень детализации (тот файл, который был сжат до 12,5%), далее по нарастающей.

    Вот, пожалуй, и все. Дальше всю кухню по работе с картой берет на себя leaflet.js, красиво зуммируя карту, позволяя перемещать ее мышкой и стрелками.

    В репозитории на гитхабе github.com/antirek/krskmap лежат нарезки тайлов основной и транспортных схем генерального плана территориального развития города Красноярска до 2033 года общим объемом в 0,5Гб. С гитхаба же идет и просмотр карты antirek.github.io/krskmap/main/index.html.

    P.S. В администрацию города Красноярска через онлайн-приемную было отправлено предложение разместить эту карту или ссылку на нее на сайте администрации города, зарегистрированное за номером ВП-2014-005631 от 13.10.2014.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 60
    • +1
      Очень здорово, если администрация вашего города примет ваш вариант, в течении 5 лет учавствовал в создании схем генеральных планов, обычно никто не делает на своем сайте нормальную визуализацию =( Посмотрите хотя бы на то, как выглядит подача генплана Санкт-Петербурга. www.kgainfo.spb.ru/picturemap/originalpicture.html?showmap&imageid=325af33d8a2e51d2bec5aedf7e0c5da3

      А ведь по идее из такой карты можно много интересной информации подчерпнуть. Где будут газ прокладывать, дороги новые, где садоводства в ИЖС будут на перспективу переводить.

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

        Просто все привыкли, что Яндекс, Google, 2Gis делают красивые, удобные приложения, где можно получить нужную информацию. И даже от них периодически просят добавить новую функциональность. Мне, например, нравится от 2Gis фишка — входы в здание, очень удобно.

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

        • +1
          Хорошая реализация. Я что-то наподобие делал на Яндекс api. с переключение генплана на Яндекс карту и соответственно с отметками участков. Возможно для следующий реализации буду пользоваться leaflet.js
          • 0
            Как говорится «мопед не мой»: ) в данном представлении генплана использовались возможности leaflet.js, которые представлены у них в примере на первой странице сайта, поэтому не могу советовать в чем лучше или хуже использовать ее относительно яндекс api. Но в целом, получилось очень быстро.

            Если серьезно, то отчасти целью этой заметки было показать, что можно сделать удобно, потратив лишь немного времени. Сейчас есть много удобных инструментов (в их числе leaflet.js), используя которые (даже неспециалист) может делать круто работающие сайты и приложения на любой платформе или браузере.
            • +2
              Лучше попросить у них вектор, могут и предоставить, отрисовать его каким-нибудь TileMill`ом )
              • 0
                Вероятнее всего всю документацию, в том числе и эти картинки-схемы, готовит один из НИИ, заявленных как разработчики генплана. Посему получение вектора может затянуться на неопределенное количество времени. А слушания по генплану Красноярска начались уже.
                • +1
                  А еще вектор обратно отскейлить по горизонтали можно.
                  • +1
                    Не какой-то НИИ, а Гипрогор. На схеме из примера штамп стоит в нижнем правом углу =)

                    Вообще вектор у администрации точно есть, т.к это обязательное условие по ТЗ. У них даже скорее всего есть 2 диска:
                    1. Карты для общественного пользования
                    2. Карты для служебного пользования

                    и они бы без проблем могли дать вам один из них, но не дадут, т.к им не хочется проблем и лишней головной боли. Если бы хотели — выложили бы на сайт.
                  • +1
                    TillMill'ом — это будет воистину титанической задачей, т.к карты сделаны в спец ПО(карта из топика, к примеру, в MapInfo) и нужно будет делать оформление для каждого слоя снова.
              • +1
                Бесценно, когда находишь на хабре статьи по задачам, с которыми тоже приходилось сталкиваться.
                Огромное спасибо автору!
                • +2
                  Недавно использовал leaflet отображения зумирующейся картинки — планов этажей.

                  Для нарезки пользовался библиотекой GDAL (gdal2tiles.py). Результатом доволен. На всех зумах с четкостью отлично.
                  В настройках слоя в leaflet надо ставить tms:true.

                  Идею и описание брал здесь

                  Еще есть очень удобная программа MapTiler, но очень она ограничена в бесплатном варианте.
                  Есть нарезчик тайлов от Яндекса. У него с резкостью было не очень (может только в моем случае)
                  • 0
                    Спасибо, можно попробовать и по мануалу Педро порезать картинки. Тем более, что заметил, что на сайте администрации Красноярска добавили схем.: )
                    • 0
                      Если правильно помню, MapTiler — это всего лишь GUI вокруг gdal2tiles.
                    • +3
                      По секрету всему свету:
                      Есть такой сервис (не очень известный) — geohosting.pro/products/tiler/
                      Позволяет взять картинку, разрезать ее на тайлы и залить на Яндекс.Диск.
                      После чего подключить как слой в Яндекс.Карты (или в гугл, или в леафлет — принцип везде один)
                      Никаких imagemagic и скриптов на php — все работает на клиенте.
                      • 0
                        Вчера попробовал несколько раз загрузить картинку для нарезки: один раз браузер у меня завис, а пару других получались в нарезке просто черные квадраты.
                        • +1
                          И что же за картинка там была?
                            • +1
                              У меня получилось открыть и использовать, вот тут она в слое «Универсиада»
                              • 0
                                Т.е. получилось нарезать в сервисе geohosting.pro/products/tiler/?
                                У меня в этом сервисе не получилось нарезать, а gdal2tiles.py'ем только так нашинковал.
                                • 0
                                  Нет, я думал просто архив с сайта у вас не открывался. Geohosting я не пробовал, как скачал MapTiler, только им пользуюсь. Особенно радует его оптимизация под многоядерные процессоры.
                      • +2
                        3. Переименование файлов из линейной нумерации в сетку XxY

                        Можно проще. Я делал что-то типа такого:
                        convert file_to_convert.png -crop 100x100 -set filename:tile "%[fx:page.x/100]_%[fx:page.y/100]" "folder/%[filename:tile].png"
                        

                        • 0
                          О, спасибо, добрый человек! Я пытался вкурить эту страницу www.imagemagick.org/Usage/crop/, найти пример, где есть нарезка сеткой. Но сделать надо быстро, и поэтому на php переименование запилил.
                        • +1
                          Привет. Поддерживаю начинание. Я в любительских целях писал(а больше говнокодил) карту для своего родного поселка(гугл-мапс -> фотошоп), и в конце помимо карты как то само получилось нечто вроде cms — с возможностью отмечать маркеры — с ролями юзеров и админа, с премодерацией этих маркеров, с несколькими разделами вне карты(новости, объявления, анонимный раздел), с возможностью аплоадить изображения и просмотра их как галереи к маркерам, с возможностью комментить маркеры и авторизацией через вконтакте api(passportjs).

                          К сожалению я устроился на работу и не успел переписать прототип и вообще даже запустить проект, но если кому то интересно, поделюсь исходниками. На сервере там node/express/mongo, на клиенте leaflet и backbone
                          • 0
                            Выглядит круто. Чтоб добро не пропадало, выложи, пожалуйста, на гитхаб. И статью по использованию на хабр выложи. И будет и карма, и благодарность, и может кого на мысль наведешь, и к делу побудишь.

                            Так-то вот к этому проекту можно было прикрутить пожелания жителей, их замечания, предложения по изменению генплана. Хорошо бы легло в твою cms, наверное.: )
                            • 0
                              он там лежит

                              Летом я остановился в нем на одном месте и сейчас даже чтобы его просто запустить недостаточно развернуть ноду и монго, надо еще создать руками админа:

                              var User = require('./models').User;
                              
                              // update
                              var adminrecord = new User({
                                  username: 'iamadmin',
                                  displayName: 'superadmin',
                                  vkontakteId: '666',
                                  avatar: 'http://site.com/img.bmp',
                                  created: Date.now(),
                                  status: 'godlike'
                              });
                              
                              adminrecord.save(function(err) {
                                  if (err) throw err;
                              });
                              


                              А также сделать все необходимое для oauth2 через вконтакте — добавить у себя в аккаунте приложение, дать ему нужные права и прописать его в /config/env.js. делается все это впринципе за 5 минут. а вот из под юзера я не помню почему нельзя сейчас зайти, но помню что там какой то мелкий баг, вообще то там тоже все работает.

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

                              Если буду переделывать, скорее всего возьму angular или какие-то плагины к бекбону для композитных вьюшек, ну и ajax-update на формах это как то не 2014 год, надо делать нормальный дата байндинг. Роутинга сейчас нет вообще, все происходит в пределах одной странички с помощью простых вьюшек.

                              но куски кода
                              • 0
                                мне кажется, что вы слишком самокритичны: переделать, ajax это не модно и т.д.: ) добейте до minimum viable product, зарелизьте, будет код шуршать на сервере, пользователи уже кнопки понажимают, а там уже к новому году причешете до «все ок».

                                а то столько кода и не работает.
                                • +1
                                  Сделаю версию, которую можно без гемороя запустить и выложу статью на хабре :) Может даже на выходных.
                                  Но я все равно уверен, что для нормального использования проект в таком виде не очень пригоден.
                                  • 0
                                    я буду вашим первым пользователем, жду версию для быстрого запуска. на гитхабе поставил watcher, чтобы отследить изменения проекта.
                                      • 0
                                        Отлично, было интересно прочитать историю проекта.

                                        Лично я всегда радуюсь за людей, которые решают какие-то задачи подручными средствами, рассказывают об этом, получают обратную связь, а затем либо улучшают свое решение, либо используют полученные навыки при решении других задач.

                                        Ваш проект напомнил мне habrahabr.ru/post/221653/
                            • +1
                              А мне вот, в свое время, работа не помешала. И вырос похожий проект, с похожими целями, в есоседи.
                              • +1
                                Согласен, у вас вполне коммерческий вариант. У меня была задача сделать изначально любителькую штуковину, делал буквально на коленке за пару месяцев в свободное время и как то совсем потом все свернулось к августу. А теперь другие дела мешают.
                                • +1
                                  У меня была абсолютно такая же задача.
                                  Вечерами на коленке, в электричке ради фана…
                                  Просто с тех пор прошло 6 лет :P
                                • +1
                                  Если не ошибаюсь, esosedi неколько лет использовали карты и объекты wikimapia, так что я даже считал это клоном wikimapia.
                                  • +1
                                    А еще панорамио, википедии, osm и букинга. Да и «карт» у викимапии нет. Но давайте об этом в другой раз.
                                    • 0
                                      Тем не менее esosedi до сих пор использует базу wikimapia (и использовала ещё за 5 лет до открытия API, что наводит на связь с создателями wikimapia), и в первую очередь отличается от wikimapia лишь отсутствием полноэкранного режима, что наводит на мысль о клоне-сателлите и аффилированных создателях.
                                      • 0
                                        Я, в свое время, работал в викимапии(но «после», а не «до») — это не секрет, но не пытайтесь найти мапию в есоседи — ее нет там. Это совсем разные проекты.
                                        PS: АПИ они открыли ~ 5 лет назад, а CC «подняли» еще раньше.
                                • 0
                                  Ваш неизвестный проект симпатичнее выглядит, чем есоседи. Чисто субъективно.
                                  • +1
                                    А www.localway.ru еще лучше выглядит. А еще 20 других сайтов выглядят по другому. А на хабре вообще карты нет.
                                    А АПИ Яндекс.Карт лучше леафлета. Чисто субъективно гарантирую.
                                    • 0
                                      Вы абсолютно правы, более того хорошо, когда есть проекты на разный вкус, цвет и аудиторию, когда есть разные средства, в том числе и для реализации карт. Я смотрел на есеседях Красноярск, ко многим местам описания и комментарии на карте — это какие-то воспоминания, типа здесь был аэропорт, а здесь были бега. Этакий историческое наслоение, интересно почитать.
                                      • 0
                                        Заглушка вылезает «О смене браузера» под яндекс.браузером
                                  • +1
                                    Для нарезки тайлов рекомендую MapTiler как уже выше посоветовали, своих 50 баксов или сколько там он стоит однозначно.
                                    • +2
                                      Для нарезки тайлов я использую gdal2tiles. Но предварительно его нужно будет немного пропатчить.

                                      После установки и последующего патчинга нарезание тайлов выглядит довольно просто:
                                      gdal2tiles.py -p raster -z 0-6 -w none testimage.png


                                      Все тайлы будут аккуратно сложены в директорию с названием, как у файла-исходника с картинкой.
                                      Здесь 0-6 — это минимальный и максимальный зум для карты.
                                      Определить максимальное значение для зума (чтоб не было размытия картинки) можно следующим образом:
                                      • Zoom level 0: 256 px
                                      • Zoom level 1: 512 px
                                      • Zoom level 2: 1024 px
                                      • Zoom level 3: 2048 px
                                      • Zoom level 4: 4096 px
                                      • Zoom level 5: 8192 px
                                      • Zoom level 6: 16384 px
                                      • Zoom level 7: 32768 px
                                      • и т.д.


                                      Таким образом, если у вас максимальная сторона картинки-исходника равна 19256 px, максимальный зум должен быть равен 7 (будет 0-7 в вашем случае).

                                      Кроме того, правильно будет ещё и сжать готовые тайлы для более быстрой загрузки. Для этого я использую утилиту pngquant.
                                      После нарезки тайлов заходим в директорию с ними:
                                      cd testimage


                                      И ужимаем все найденные файлы по маске:
                                      find . -name '*.png' -exec pngquant --ext .png --force 256 {} \;


                                      Здесь я ищу все файлы с расширением png и ужимаю их, попутно уменьшая количество цветов до 256. В результате сжатия итоговый размер тайлов уменьшается более, чем в 2 раза без видимого ухудшения качества.
                                      • 0
                                        Все прям как в статье у Педро, только на русском языке. Спасибо, теперь я точно попробую gdal2tiles.py порезать другие схемы.
                                      • +1
                                        Поймите меня правильно, я не хочу принизить заслуги автора, но к уже сказанному в комментариях про использование средств, которые не надо изобретать, я хотел бы добавить тот факт, что работа с картой без реальных координат — это как построить самодельный автомобиль, но ездить на нем, разгоняя его собственными ногами, вместо того, чтобы заправлять бензином.
                                        Без этого, например, невозможно наложение на другие карты, измерение расстояний и прочее.
                                        Почитать можно тут www.digital-geography.com/qgis-tutorial-i-how-to-georeference-a-map/
                                        • 0
                                          Мне кажется, вы сравниваете коробку автомат и механку. Большинству людей реальные координаты к чему? Надо просто посмотреть на карте место, прочитать названия, соориентироваться на месте относительно других каких-то известных точек.

                                          Еще одной целью было сделать просто и быстро за полдня карту, самый простой вариант был просто нарезать картинки и в html кнопками вверх-вниз, вправо-влево пододвигать на ряд картинок. А получилось быстро да еще и на leaflet.js. И одной из целей публикации было узнать о других более быстрых средствах подготовки своих карт. И как показывают комментарии выше, такое проделывали многие. Вчера попробовал скрипт gdal2tiles.py (по совету makis и Nop), и после нескольких прогонов получил нужный результат.

                                          • +2
                                            Я уже объяснил, для чего людям реальные координаты. Могу объяснить подробнее:
                                            — для того, чтобы иметь возможность совмещать карту с другими картами и снимками, векторными пользовательскими данными;
                                            — для того, чтобы другие люди могли использовать подготовленные вами тайлы в стандартном формате и стандартной схеме именования в каких-то своих проектах;
                                            — для того, чтобы измерять расстояние в метрах, а не в попугаях;
                                            — для того, чтобы иметь возможность осуществлять геокодирование (ткнуть в карту и получить адрес, либо, наоборот, по адресу найти координаты, чтобы забить их потом в навигатор) по внешним сервисам вроде Nominatim;
                                            — для того, чтобы прокладывать маршрут, используя внешние сервисы (OSRM);
                                            — конкретно в случае вашей карты это бы исправило искажение формы объектов (растяжение по вертикали), которое видно невооруженным глазом.

                                            То есть конечно, если лично вы не собираетесь развивать это — пожалуйста, имеете полное право оставить это в виде простой картинки, которую можно прокручивать, приближать и удалять.
                                            • +1
                                              Мне кажется основной посыл статьи в том, что многие сайты, например сайт Красноярской администрации выкладывают файлы over 100500 мб, которые не удобно смотреть даже если скачаешь себе на комп и показал простой и быстрый способ улучшить юзабилити. А материал автор взял, какой был, он судя по всему не картограф.

                                              Кстати, растяжение по вертикали появилось потому, что генпланы делаются в местной системе координат, для наименьших искажений реальных размеров. Также чтобы привязать такие материалы к WGS84(на которой работает GPS к примеру) нужны ключи перевода, которые доступны для служебного пользования. Такая вот секретность у нас по закону.
                                              • +2
                                                Материал называется «Свои карты на Leaflet.js» а не, например, «Как просматривать большие-большие картинки в browser-е, чтобы они не тормозили». Перефразируя пословицу: «Назвал свое творение картой — полезай в основы веб-картографии».

                                                Утверждение в вашем втором абзаце полностью не соответствует истине, потому что:
                                                — искажено само изображение карты, что можно увидеть по вертикально растянутым кругам в легенде карты — они не изображены в масштабе карты, но все равно растянуты;
                                                — действительно, местные системы координат выбираются так, чтобы изображать ограниченную территорию (область или город) с минимальными искажениями формы и размеров объектов на всей территории, где действует данная МСК, потому никакой растянутости в них не наблюдается (то есть вы сами привели аргумент, который опровергает, а не подтверждает ваш же тезис);
                                                — конкретно в Красноярском крае приняты местные системы координат, которые основаны на поперечной проекции Меркатора (потому что образованы сдвигом из СК-42, где используется именно эта проекция), что полностью соответствует предыдущему пункту;
                                                — наличие ключей перехода для МСК Красноярского края не дало бы абсолютно ничего для данного конкретного случая, потому что на этой карте отсутствуют координаты и даже сетка проекции, так что переводить из МСК в WGS84 банально нечего;
                                                — для привязки данной карты, учитывая ее степень подробности, было бы достаточно координат точек пересечения дорог, взятых из OpenStreetMap, например, так что ключи перехода тут совершенно бесполезны.

                                                P.S.: Загляните в список моих публикаций на Хабре, прежде чем продолжать спор по теме, в которой, очевидно, слабо ориентируетесь.
                                                • +1
                                                  Да, вы правы, я сразу не обратил внимание на появившееся вертикальное искажение, посмотрел оригинальный файл на сайте администрации, там такого нет. Осталось попробовать сделать GeoTiff, нарезать его на тайлы и посмотреть что получится. Интересно почему из-за простой нарезки на тайлы появились искажения, а также муть при приближении?

                                                  Также попробовал наложить OSM слой и карту из примера, наложились с минимальными искажениями.
                                                  • +1
                                                    Решил развить идею автора с учетом замечаний Moskus, что получилось можно посмотреть тут http://mirr04.github.io/index.html. Привязал ту же карту, что и в топике. Чтобы она включилась в правом верхнем углу меняйте слой на «My».

                                                    Кстати встал вопрос куда лучше загружать тайлы, т.к если zoom х15 — это 22,8 мб, 2108 файлов
                                                    zoom x16 — уже 8258 файлов
                                                    zoom x17 — 32634 файла

                                                    На github заливает очень медленно =( Да и на хостинг по FTP тоже.
                                                    Тайлы делал MapTiler'ом, который посоветовал Synoptic.
                                                    • 0
                                                      эээм… заливать архивом и распаковывать на хостинге
                                                      • 0
                                                        На github так можно сделать?

                                                        На хостинге ssh нет =) Попробую подрубить, спасибо
                                                        • 0
                                                          Спасибо за подсказку, обновил сервис mirr04.github.io/index.html, теперь там еще карта объектов универсиады и основной чертеж до 17-го зума.

                                                          Спасибо antirek за наводку, идея крутая. Часто за то же самое, но на базе Arcgis server бешенные деньги платят. Или публичная кадастровая карта сделана на MapInfo MapExtreme , а по приятности отрисовки мне кажется leafletjs выигрывает.
                                                          • 0
                                                            Для полной учености осталось еще сделать нарезку в PNG вместо JPEG и пройтись по тайлам хорошим оптимизатором палитры. Получится и меньше, и четче.
                                                        • 0
                                                          Круто получилось, что когда переключаешься между слоями, просматриваешь одно и то же место. Чтобы так получилось надо в MapTiler'е картинки совмещать и одинаково резать?
                                                          • 0
                                                            Чтобы так получилось, нужно сделать привязку своих данных к реальным координатам. А одинаковая нарезка получается автоматически, потому что стандартные тайловые форматы для веб-картографии имеют общую схему деления на тайлы.
                                                            • 0
                                                              В MapTiler'е есть удобная штука, визуальная привязка, вот как это выглядит. А дальше, как Moskus ниже написал оно само =) Плюс бонусом такие фишки как наложение gps-треков, измерение длин и площадей и такое прочее.

                                                              Еще думаю доделать, чтобы легенду просматривать одновременно с картой, а то неудобно получается, но это уже завтра =)
                                                • 0
                                                  В Safari не пашет.

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