Картографические и ГИС компоненты для разработчиков на GitHub

    Добрый день, жители и гости Хабра!

    Представляю вашему вниманию один интересный инструмент, для тех, кто по роду своей деятельности или в силу увлечения интересуется пространственными данными, созданием разноплановых ГИС-систем и картографических сервисов.

    Итак, MapAround — это полноценный картографический движок, который содержит инструментарий для решения большинства типовых задач, возникающих при разработке ГИС, реализован полностью на .NET (не является «оберткой» native-библиотек), имеет высокую степень модульности. Данный SDK организует данные в удобоваримом для карты виде, т.е. позволяет привязать карту к реальным координатам, настроить ее отображение, разбить на слои/объединить их.




    Исходники на GitHub доступны по ссылке: github.com/gkrsu
    github.com/gkrsu/maparound.core — ядро

    Функциональные возможности:
    — вычисление длин, расстояний, площадей и периметров;
    — решение прямой и обратной геодезических задач;
    — вычисление объединений, пересечений, разности и симметричной разности объектов
    — построение буферных зон;
    — вычисление матрицы пересечений;
    — вычисление значений двоичных предикатов: «эквивалентен», «разъединен», «содержит», «содержится», «пересекает», «скрещивается», «перекрывает», «касается»
    — построение разбиения Вороного и триангуляции Делоне;
    — преобразование из географических координат в одну из следующих проекций: проекция Меркатора; поперечная проекция Меркатора (UTM); равновеликая проекция Альберса; равноугольная проекция Ламберта.

    Если выражаться проще, то задачи из разряда "выбрать все участки площадью не меньше гектара, находящиеся не ближе двухсот метров от ж/д-путей и не пересекаемые линиями электропередач" — решаются довольно легко.
    Или, к примеру, требуется посчитать буферную зону, имея географические координаты где-нибудь в районе Архангельска – в MapAround это возможно.

    При оформлении цифровых карт у движка имеются следующие возможности:

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

    Можно получить любую тематическую карту. Внешний вид карты можно настраивать, не прибегая к кодированию. Все настройки можно сохранить в xml-формате. Изображение цифровой карты можно получить в форматах: JPG, BMP, PNG, GIF, TIFF.

    Приведу простой пример создания карты (WinForms)

    public partial class Form1 : Form
    {
            private Map _map;
    
            public Form1()
            {
               //Берем из библиотеки MapAround контрол управления (MapControl) и размещаем его на форме
                InitializeComponent();
                _map = new MapAround.Mapping.Map();
                mapControl.Map = _map; // Устанавливаем созданный объект MAP
            }
    
            private void btnOpen_Click(object sender, EventArgs e) // Действия функции «Добавить слой»
            {
    
                using (var dialog = new OpenFileDialog())
                {
                    dialog.Filter = "*.shp|*.shp";
                    dialog.CheckFileExists = true;
    
                    if (dialog.ShowDialog() == DialogResult.OK)
                    { 
                       // Создание нового слоя
                        var layer = new FeatureLayer() { Alias = dialog.FileName, Visible = true };
                        
                        var shape = new ShapeFileSpatialDataProvider {FileName = dialog.FileName}; 
                        shape.QueryFeatures(layer); // Загрузка данных из Shape файла
                        _map.AddLayer(layer); // Добавляем слой к карте
                        SetViewBox(); // Находим новый ViewBox (требуется для отображения)
    
                    }
                }
            }
    
    
            private void SetViewBox() // Метод поиска ViewBox
            {
                BoundingRectangle rectangle = _map.CalculateBoundingRectangle();
                if (rectangle.IsEmpty()) return; // Расчет  области данных карты
                
                // Поправка, для того, что бы вписать данные в контрол
                double deltaY = rectangle.Width * mapControl.Height / 2 / 
                                              mapControl.Width - rectangle.Height / 2;         
          
                // Установка нового ViewBox                               
                mapControl.SetViewBox( new BoundingRectangle(rectangle.MinX, rectangle.MinY - deltaY,
                                                             rectangle.MaxX, rectangle.MaxY + deltaY)); 
            }
            
            //  Добавляем функции приблизить/отдалить объект на карте
            private void btnZoomIn_Click(object sender, EventArgs e)
            {
                if (_map.Layers.Count == 0) return;
                mapControl.ZoomIn();
            }
    
            private void btnZoomOut_Click(object sender, EventArgs e)
            {
                if (_map.Layers.Count == 0) return;
                mapControl.ZoomOut();
            }
    
            private void btnViewAll_Click(object sender, EventArgs e)
            {
                if (_map.Layers.Count == 0) return;
                SetViewBox();
            }
    
     }
    


    Код примера выложен на github, скачать можно здесь

    Что еще сказать.
    MapAround поддерживает следующие форматы векторной графики: ESRI Shape-file, MapInfo TAB, DXF. Пространственные данные можно хранить в таблицах реляционных баз данных (поддерживается: Oracle Spatial; PostGIS; Microsoft SQL Server 2008 (geometry, geography))

    Векторные данные можно сериализовать в форматы Well-known text и Well-known binary.

    Если вам стало интересно, напоминаю, исходные коды можно взять здесь

    И как обычно — будем очень рады вашим замечаниям и предложениям по MapAround!
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 23

      +1
      А есть примеры каких-то реальных продуктов на основе движка?
        +1
        Один из последних проектов odinarod.ru/o4, можно еще посмотреть на карту Нижнего Новгорода webmap.admgor.nnov.ru/
          0
          Какая часть odinarod.ru сделана на нём, слой с маркерами? Если да, то какой смысл был в таком усложнении, у Лифлета маркеры и так есть?
            0
            Это было сделано, чтобы на карту можно было добавлять свои векторные слои, которые находились в базе данных Oracle, т.е. маркерами задача не ограничивалась
        0
        У вас там транное поведение при www.maparound.ru/DemoLive.aspx?example=_URL_ например www.maparound.ru/DemoLive.aspx?example=http://habrahabr.ru/post/168369/
          +1
          Круто! Я относительно давно занимаюсь картографией (преимущественно оффлайновой) по роду своей деятельности и давно искал адекватный свободный движок для этого… Я разрабатываю под .NET платформу и искал решения конкретно под эту платформу. Из всего, что я нашел пришлось остановиться на MapWindow6 (как наиболее подходящем по функционалу, производительности и адекватности, в сравнении с остальными), может слышали о таком, он еще начинал развиваться как ActiveX компонент… Но он настолько забагован и, что печальней, похоже заброшен или форкнут в другие проекты, которые, тем не менее, так же уныло развиваются и тянут за собой все наследие багов и глюков, что приходилось настолько сильно извращаться, чтобы он вел себя так, как от него требовалось и продолжать поиски адекватных аналогов… Дошло до того, что для онлайн картографии был создан свой минималистичный движок (т.к. большинство ныне существующих решений (не только для картографии) создаются исключительно для веб-разработки), а для оффлайн картографии (что в разы сложней), опять же, предполагалось в ближайшем будущем создавать свое решение взамен MapWindow, ну, вы понимаете…

          И эта новость не может меня не радовать! Я обязательно посмотрю ваш проект и, возможно, сделаю на него ставку. Особенно радует, что это отечественный проект. И есть к кому обратиться с вопросами. Как я понимаю, вы являетесь одной из представителей проекта?

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

          1. Насколько резво происходит отрисовка карты? (и насколько сильна зависимость от объема данных, от настроек и свойств объектов, от параметров рендера?)

          2. Есть ли возможность гибкой настройки и отображения меток объектов? (как например: метки вписываются внутрь фигур, которым принадлежат, такие как здания; метки вписываются вдоль линейных объектов и огибают их изгибы, таких как дороги и тп..) В MapWindow такого нет. Все это приходилось допиливать своими силами «поверх» MapWindow.

          3. Возможно ли задавать отдельно бордюр и толщину бордюра для отрисовки различных объектов (такие, как дороги, здания и т.п.) и отрисовываются ли они с разрывом на пересечении линий одного и того же слоя? Т.к. в том же MapWindow такая возможность как бы есть (наличие самих бордюров), но по факту эти бордюры пересекаются между собой для различных дорог (к примеру) одного слоя, вместо того, чтобы плавно переходить из одного бордюра в другой с разрывом бордюров, т.е. по факту эта опция была бесполезной, поэтому приходилось обходить этот недостаток таким грязным и затратным хаком, как подкладывать под слой с более тонкими белыми (к примеру) дорогами слой с немного более толстыми теми же дорогами, но черными (цвет бордюра)… И тогда нижний слой служил полноценным бордюром без всяких пересечений в пределах слоя. Хотя на самом деле этот принцип и должен быть заложен в рендере для отрисовки бордюров в пределах одного слоя.

          Да, пожалуй, пока хватит с вопросами) В любом случае, я вас поздравлю с публикацией проекта и желаю вам его дальнейшего развития и успехов! Спасибо за ваш труд! Самое главное — не забрасывайте его! :)

          PS: У меня такое смутное чувство, что я как-то натыкался на ваш сайт и, возможно, он у меня даже где-то в закладках хранится, но, видимо на тот момент ваш проект еще не был готов к выкладыванию в паблик… :)
            +1
            1. Насколько резво происходит отрисовка карты? (и насколько сильна зависимость от объема данных, от настроек и свойств объектов, от параметров рендера?)

            Скорость отрисовки карты зависит от исходных данных и от настроек рендеринга, так как непосредственно сама отрисовка осуществляется при помощи GDI+. Например, рендеринг всей карты НН, представленной в примерах, для полотна 5000x5000 пикселей осуществляется около 7 сек.
              +1
              2. Есть ли возможность гибкой настройки и отображения меток объектов? (как например: метки вписываются внутрь фигур, которым принадлежат, такие как здания; метки вписываются вдоль линейных объектов и огибают их изгибы, таких как дороги и тп..)

              Если под метками имеется в виду надписи, то да. Существует, гибка настройка стиля отображения надписей. Для линейных объектов можно установить возможность видения надписи вдоль объекта. А вот возможности вписать надпись в фигуру, к сожалению нет.
                0
                А вот возможности вписать надпись в фигуру, к сожалению нет.

                Надеюсь, что со временем появится) Это интересная задачка для разработчиков — поиск оптимального места и аккуратное вписывание надписи в сложную фигуру :)
                +1
                3. Возможно ли задавать отдельно бордюр и толщину бордюра для отрисовки различных объектов (такие, как дороги, здания и т.п.) и отрисовываются ли они с разрывом на пересечении линий одного и того же слоя?

                Бордюр задавать можно: и цвет и толщину. Но если требуется что бы вид карты был такой же как Google Maps (без лишних бордюров в местах пересения фич) то надо делать двумя слоями, т.е. нарисовать один и тот же слой дважды, первый раз толстой линией, второй раз более тонкой, получается что бордюры есть, но в местах пересечений бордюры прерываются.
                  0
                  Ну, т.е. так же, как я и описывал в пояснении своего вопроса))
                  Ясно. Все-таки, мне думается, что это должен делать сам движок. Спасибо за ответы!
                0
                Эта карта в оффлайне может работать?
                  0
                  Да, может
                  0
                  Почему я смотрю карту Нижнего Новгорода и вижу надписи на английском языке? А не на русском?
                    0
                    [deleted]
                      0
                      1) Все бесплатно?
                      2) Можно ли в качестве подложки использовать яндекс карту?
                      3) Можно ли реализовать свой WMS Server?
                      4) Вот так можно сделать? wiki.thinkgeo.com/wiki/Map_Suite_Samples_Applies_To
                        0
                        1) Все бесплатно?

                        Сам движок и его исходные коды опубликованы под лицензией GPLv3.
                          0
                          3) Можно ли реализовать свой WMS Server?

                          Да. При помощи MapAround можно реализовать собственный WMS Server (опять же, пример простого WMS сервера приведен в репозитории с примерами). Для доступа к WMS серверу могут быть использованы различные клиенты, многие из них имеют возможность использования подложек. В том числе и клиент из MapAround.
                            0
                            4) Вот так можно сделать? wiki.thinkgeo.com/wiki/Map_Suite_Samples_Applies_To

                            Да, все примеры, приведенные по ссылки можно реализовать при помощи MapAround.
                            0
                            Спасибо за ответы. Для уточнения последний вопрос. То есть можно реализовать WMS сервер который будет отдавать тайлы в проекции Яндекс — WGS 84?
                              0
                              Да, можно
                              0
                              А псевдо 3д на стороне сервера можно реализовать, как в geoserver например?
                                0
                                На текущий момент в MapAround нет полноценной поддержки псевдо 3D (точнее говоря 2.5D). Но существуют некоторые наработки в этой области. Так что, если будет спрос на данный функционал, то он, возможно, появиться в ближайшем будущем.

                              Only users with full accounts can post comments. Log in, please.