Карты в приложении
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Карты в приложении
Предыстория:
С различных устройств по различным каналам поступают сигналы. Устройств много и посылают они эти сигналы на разные ПК. Сами ПК предоставляют графический интерфейс для отображения сообщений/событий полученных с различных устройств и при этом могут пересылать эти события другим ПК с таким же софтом. Пересылка может проходить по различным каналам: интернет/интранет, радио, gsm и т.д., т.е. не гарантируется, что на ПК имеется доступ к сети интернет - приложение должно работать оффлайн. Устройства распределены в пространстве (например, в рамках города или области).
Необходимо:
Добавить в разработанное приложение интерфейс для отображения географического положения устройств, присылающих сообщение на карте города, региона и т.д.
Как показал проведенный обзор, имеется огромное количество бесплатных/платных вариантов "прикрутить" отображение карт к собственному приложению. Подскажите, какие решения выбрать? Платное решение (устраивающее заказчика) уже найдено, но хотелось бы решить этот вопрос бесплатно.
На текущий момент установлено:
PostgreSQL, PostGIS, скачана карта города в формате OSM, карта импортирована в БД.
Насколько я понимаю, теперь мне нужно API геокодера для того, чтобы посылать запросы в БД. Для того, чтобы рисовать карты (как я понял) есть хранимые процедуры в PostGIS. Короче, хотелось бы в общих чертах понять:
1) На правильном ли я пути?
2) Какое ПО мне необходимо и как его использовать? (Mapnik ?)
3) Насколько быстро возможна обработка данных на локальных ПК?
PostgreSQL уже задействована в проекте, поэтому выбор сделан в пользу этой СУБД. Подойдут любые открытые решения, а также решения распространяемые без исходного кода, но на бесплатной основе (и с документацией).
С различных устройств по различным каналам поступают сигналы. Устройств много и посылают они эти сигналы на разные ПК. Сами ПК предоставляют графический интерфейс для отображения сообщений/событий полученных с различных устройств и при этом могут пересылать эти события другим ПК с таким же софтом. Пересылка может проходить по различным каналам: интернет/интранет, радио, gsm и т.д., т.е. не гарантируется, что на ПК имеется доступ к сети интернет - приложение должно работать оффлайн. Устройства распределены в пространстве (например, в рамках города или области).
Необходимо:
Добавить в разработанное приложение интерфейс для отображения географического положения устройств, присылающих сообщение на карте города, региона и т.д.
Как показал проведенный обзор, имеется огромное количество бесплатных/платных вариантов "прикрутить" отображение карт к собственному приложению. Подскажите, какие решения выбрать? Платное решение (устраивающее заказчика) уже найдено, но хотелось бы решить этот вопрос бесплатно.
На текущий момент установлено:
PostgreSQL, PostGIS, скачана карта города в формате OSM, карта импортирована в БД.
Насколько я понимаю, теперь мне нужно API геокодера для того, чтобы посылать запросы в БД. Для того, чтобы рисовать карты (как я понял) есть хранимые процедуры в PostGIS. Короче, хотелось бы в общих чертах понять:
1) На правильном ли я пути?
2) Какое ПО мне необходимо и как его использовать? (Mapnik ?)
3) Насколько быстро возможна обработка данных на локальных ПК?
PostgreSQL уже задействована в проекте, поэтому выбор сделан в пользу этой СУБД. Подойдут любые открытые решения, а также решения распространяемые без исходного кода, но на бесплатной основе (и с документацией).
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Карты в приложении
какоеПлатное решение
Какая архитектура софта
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
http://www.gisinfo.ru/trir писал(а):какое
Софт на рабочем месте оператора можно воспринимать как standalone-приложение. Оно написано под .NET (преимущественно C#), использует несколько различных библиотек для подключения к базе, пересылки сообщений по различным каналам, логирования и т.д. - все это управляемый код. Сейчас сообщения приходящие с различных устройств (или с других экземпляров программы, что по сути не важно) отображаются в виде таблички. Заказчику очень хочется, чтобы они отображались в виде объектов на карте, которую можно листать, зумать и искать объекты по адресу. Используется СУБД PostgreSQL, все запросы идут напрямую в СУБД.trir писал(а):какая архитектура софта
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
- SergeyRyzhkov
- Гуру
- Сообщения: 909
- Зарегистрирован: 02 июл 2014, 19:13
- Репутация: 203
- Ваше звание: GP-экотеррористы
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Карты в приложении
Mapsui на гитхабе посмотрите
[ Сообщение с мобильного устройства ]
[ Сообщение с мобильного устройства ]
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
Спасибо, посмотрел dotSpatial, однако, не нашел (не понял) возможно ли его подключить к PostGIS, поэтому решил попробовать использовать MapWinGIS. Он, судя по документации http://mapwingis.codeplex.com/wikipage? ... umentation позволяет использовать Spatial Databasetrir писал(а):http://dotspatial.codeplex.com/
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
Посмотрел отзывы, люди рекомендуют SharpMap вместо Mapsui. За наводку спасибо.SergeyRyzhkov писал(а):Mapsui на гитхабе посмотрите
А вы сами Mapsui использовали для соединения с postGIS?..
И еще, возможно я выбрал не самый удачный подход с использованием реляционной БД в качестве хранилища пространственных данных. Я так понимаю, самый простой способ получать более менее актуальные карты - это использовать OSM. Может есть другой способ (без PostgreSQL или даже без OSM) который позволяет получать обновления карт, подготавливать эти данные и отображать офлайн в Windows приложении?
Поделитесь опытом

- SergeyRyzhkov
- Гуру
- Сообщения: 909
- Зарегистрирован: 02 июл 2014, 19:13
- Репутация: 203
- Ваше звание: GP-экотеррористы
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Карты в приложении
Если говорить именно про .NET, то немного разное назначение у проектовg00d писал(а):Посмотрел отзывы, люди рекомендуют SharpMap вместо Mapsui. За наводку спасибо.SergeyRyzhkov писал(а):Mapsui на гитхабе посмотрите
А вы сами Mapsui использовали для соединения с postGIS?..
И еще, возможно я выбрал не самый удачный подход с использованием реляционной БД в качестве хранилища пространственных данных. Я так понимаю, самый простой способ получать более менее актуальные карты - это использовать OSM. Может есть другой способ (без PostgreSQL или даже без OSM) который позволяет получать обновления карт, подготавливать эти данные и отображать офлайн в Windows приложении?
Поделитесь опытом
Mapsui - это именно рендеринг, причем для разных устройств. Очень компактно и бодро все.
SharpMap - попытка собрать в кучу все и доступ к данным (провайдеры) и отображение и т.д. Весьма солидно выглядит для небольших смотрелок
NetTopologySuite - порт с Java. По наименованию понятно назначение
еще с десяток есть, но порог вхождения "тяжелый", надо все увязывать, разбираться, править баги, подпиливать под себя.
Можно хоть leaflet под WinForms использовать и быстро, и разбираться не надо особо, но с минимальной функциональностью.
Вообщем от задачи зависит.
Насчет хранения - также от задач зависит, смотря какие данные хранить собираетесь и зачем (то есть это просто помойка данных или же осмысленное хранение с уровнем обработки данных). А так можно хоть в файловой системе хранить и в виде тайлов, и виде вектора, ну или в sqlite и пользуйтесь на здоровье.
Мой "боевой" опыт - это MapInfo MapExtreme + Oracle. PostGIS - не тянет, ИМНО
Но это очень большие проекты, вряд ли Вам это надо.
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Карты в приложении
MapWinGIS
Или напрямую
http://dotspatial.codeplex.com/wikipage ... tureSetsCS
1. Подключится к БД
2. Получить геометрию как wkb/wkt
3. Создать слой из этой геометрии
К DotSpatial тоже можно GDAL и через него к БДFor others GDAL drivers are used
Или напрямую
http://dotspatial.codeplex.com/wikipage ... tureSetsCS
1. Подключится к БД
2. Получить геометрию как wkb/wkt
3. Создать слой из этой геометрии
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
Реализовал SharpMap + PostGIS. Работает медленно даже для карты одной области. Загружаю только roads. Если добавить к ним label, то все работает очень тяжко. А когда я добавил еще один слой, то ... решил конца не ждать.
Создал с помощью TileMill БД формата mbtiles (с нужными слоями), но подключить ее пока не получается: нужно использовать BruTile, а у него ниодной доки нет. Примеры в нете со старой версией, для новой не работает. ((
Попробовал использовать shape, но это еще медленее на SharpMap-е
Что делать со скоростью? Можно ли использовать mbtiles (производительность улучшится)? Как подключить его на C#
Создал с помощью TileMill БД формата mbtiles (с нужными слоями), но подключить ее пока не получается: нужно использовать BruTile, а у него ниодной доки нет. Примеры в нете со старой версией, для новой не работает. ((
Попробовал использовать shape, но это еще медленее на SharpMap-е
Что делать со скоростью? Можно ли использовать mbtiles (производительность улучшится)? Как подключить его на C#
Последний раз редактировалось g00d 07 май 2015, 11:14, всего редактировалось 1 раз.
- SergeyRyzhkov
- Гуру
- Сообщения: 909
- Зарегистрирован: 02 июл 2014, 19:13
- Репутация: 203
- Ваше звание: GP-экотеррористы
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Карты в приложении
Используйте мод.версию шарпмапа
https://github.com/pauldendulk/Mapsui
В ней же есть поддержка BruTile (хотя я его пока не рискнул бы использовать, глючный код порой ...)
https://github.com/pauldendulk/Mapsui
В ней же есть поддержка BruTile (хотя я его пока не рискнул бы использовать, глючный код порой ...)
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
Наверное тогда придется использовать PostGIS и далее.SergeyRyzhkov писал(а):Используйте мод.версию шарпмапа
https://github.com/pauldendulk/Mapsui
В ней же есть поддержка BruTile (хотя я его пока не рискнул бы использовать, глючный код порой ...)
Я так понял проблема не в нем, он по скорости работает нормально, скорее всего проблема в sharpmap, ну да ладно... буду меньше объектов передавать просто
Последний раз редактировалось g00d 07 май 2015, 17:23, всего редактировалось 2 раза.
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
Есть еще вопрос: можно ли скрывать/отображать элементы карты при изменении масштаба (автоматически или надо кодить?) РЕШЕНО : MaxVisible и MinVisible для слоя
Можно ли включить кэш тайлов в SharpMap, чтобы ускорить его работу?
Частично ускорил путем простановки пределов масштаба отображения для слоев, а также изменением настроек mapBox - компонента, в котором рисуется карта (QueryGrowFactor, PreviewMode ) : стало пошустрее, но хотелось бы кэширование включить.
И еще вопрос про Геокодинг. Я так понял что в PostGIS можно использовать TIGER, но, чтобы использовать функцию geocode нужно загрузить данные из таблиц, созданных при загрузке osm2pgsql (planet_osm_line, planet_osm_line и т.д.) в таблицы в схеме tiger, чего не хочется делать. Есть еще Nominatim, но его нельзя ставить на Windows.
Может есть еще какие-то варианты? Как я понял, геокодер TIGER можно использовать только для адресов US, а nonatim в Windows установить нельзя. Поэтому я реализовал несколько методов для геокодинга и реверс-геокодинга, позволяющих по координатам определить адрес (с использованием кладр-а) и по адресу (разбитому на компоненты) определить координаты объекта (с использованием функций POSTGIS, типа ST_Covers и т.д.)
Можно ли включить кэш тайлов в SharpMap, чтобы ускорить его работу?
Частично ускорил путем простановки пределов масштаба отображения для слоев, а также изменением настроек mapBox - компонента, в котором рисуется карта (QueryGrowFactor, PreviewMode ) : стало пошустрее, но хотелось бы кэширование включить.
И еще вопрос про Геокодинг. Я так понял что в PostGIS можно использовать TIGER, но, чтобы использовать функцию geocode нужно загрузить данные из таблиц, созданных при загрузке osm2pgsql (planet_osm_line, planet_osm_line и т.д.) в таблицы в схеме tiger, чего не хочется делать. Есть еще Nominatim, но его нельзя ставить на Windows.
Может есть еще какие-то варианты? Как я понял, геокодер TIGER можно использовать только для адресов US, а nonatim в Windows установить нельзя. Поэтому я реализовал несколько методов для геокодинга и реверс-геокодинга, позволяющих по координатам определить адрес (с использованием кладр-а) и по адресу (разбитому на компоненты) определить координаты объекта (с использованием функций POSTGIS, типа ST_Covers и т.д.)
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
Собственно, что печалит: скорость - я настроил параметры отображения слоев в зависимости от масштаба, отфильтровал данные в OSM, но все равно, если для небольших городов, районов - скорость нормальная, то, например, для Ростова-на-Дону скорость отображения/обновления карты огорчает. Думаю, что это все таки вина SharpMap, т.к. когда я подключал БД в QGis таких проблем не наблюдалось. Может подскажите идею как найти узкое место?
Ну и отсутствие нормальной документации на SharpMap ужасно раздражает. Есть лишь примеры использования, при этом далеко не все рабочие с последней версией SHarpMap. Примеры из хауту не работают... Печаль, чес слово.
Попробовал создавать Image и вставлять их в pictureBox - скорость одинаковая. Все время уходит на refresh карты (БД точно не при чем).
В конце концов, может на C++ переписать?
Ну и отсутствие нормальной документации на SharpMap ужасно раздражает. Есть лишь примеры использования, при этом далеко не все рабочие с последней версией SHarpMap. Примеры из хауту не работают... Печаль, чес слово.
Попробовал создавать Image и вставлять их в pictureBox - скорость одинаковая. Все время уходит на refresh карты (БД точно не при чем).
В конце концов, может на C++ переписать?
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 03 мар 2015, 15:53
- Репутация: 0
Re: Карты в приложении
Может я что-то неправильно делаю:
По моим наблюдениям больше всего времени уходит на отрисовку слоя с полигонами.
P.S. Видимо придется смотреть в сторону dotspatial
Код: Выделить всё
mapBox1.Map.BackColor = Color.FromArgb(243, 226, 169);
mapBox1.Map.MinimumZoom = 1e3;
mapBox1.Map.MaximumZoom = 7e5;
SharpMap.Layers.VectorLayer MainLayer = MapForm.CreateLayer("regions", "Region");
MainLayer.Style.EnableOutline = true;
MainLayer.Style.Outline = new Pen(Color.FromArgb(167, 232, 232), 2);
MainLayer.Style.Fill = new SolidBrush(Color.FromArgb(206, 246, 236));
SharpMap.Layers.VectorLayer BuildingsLayer = MapForm.CreateLayer("buildings", "Buildings");
BuildingsLayer.Style.EnableOutline = true;
BuildingsLayer.Style.Outline = new Pen(Color.Black);
BuildingsLayer.Style.Fill = new SolidBrush(Color.DarkGray);
BuildingsLayer.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
SharpMap.Layers.VectorLayer BuildingsLayer2 = MapForm.CreateLayer("buildings_border", "Buildings_Border");
BuildingsLayer2.Style.Line = new Pen(Color.Black); ;
BuildingsLayer2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
SharpMap.Layers.VectorLayer ObjLayer = MapForm.CreateLayer("temp_objects", "Object");
ObjLayer.Style.PointColor = new SolidBrush(Color.FromArgb(0, 64, 255));
SharpMap.Layers.VectorLayer PlgLayer = MapForm.CreateLayer("temp_places", "Polygon");
PlgLayer.Style.EnableOutline = true;
PlgLayer.Style.Fill = new SolidBrush(Color.FromArgb(46, 254, 46));
SharpMap.Layers.VectorLayer HighwayLayer = MapForm.CreateLayer("temp_highway", "Highway");
HighwayLayer.Style.Line = new Pen(Color.SandyBrown, 2);
HighwayLayer.Style.Outline = new Pen(Color.Black);
HighwayLayer.Style.EnableOutline = true;
mapBox1.Map.Layers.Add(MainLayer);
mapBox1.Map.Layers.Add(PlgLayer);
mapBox1.Map.Layers.Add(HighwayLayer);
mapBox1.Map.Layers.Add(BuildingsLayer);
mapBox1.Map.Layers.Add(BuildingsLayer2);
mapBox1.Map.Layers.Add(ObjLayer);
mapBox1.Map.ZoomToExtents();
mapBox1.Refresh();
mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;
P.S. Видимо придется смотреть в сторону dotspatial
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя