Карты в приложении

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Карты в приложении

Сообщение g00d » 03 мар 2015, 16:21

Предыстория:
С различных устройств по различным каналам поступают сигналы. Устройств много и посылают они эти сигналы на разные ПК. Сами ПК предоставляют графический интерфейс для отображения сообщений/событий полученных с различных устройств и при этом могут пересылать эти события другим ПК с таким же софтом. Пересылка может проходить по различным каналам: интернет/интранет, радио, gsm и т.д., т.е. не гарантируется, что на ПК имеется доступ к сети интернет - приложение должно работать оффлайн. Устройства распределены в пространстве (например, в рамках города или области).

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

Как показал проведенный обзор, имеется огромное количество бесплатных/платных вариантов "прикрутить" отображение карт к собственному приложению. Подскажите, какие решения выбрать? Платное решение (устраивающее заказчика) уже найдено, но хотелось бы решить этот вопрос бесплатно.

На текущий момент установлено:
PostgreSQL, PostGIS, скачана карта города в формате OSM, карта импортирована в БД.

Насколько я понимаю, теперь мне нужно API геокодера для того, чтобы посылать запросы в БД. Для того, чтобы рисовать карты (как я понял) есть хранимые процедуры в PostGIS. Короче, хотелось бы в общих чертах понять:
1) На правильном ли я пути?
2) Какое ПО мне необходимо и как его использовать? (Mapnik ?)
3) Насколько быстро возможна обработка данных на локальных ПК?

PostgreSQL уже задействована в проекте, поэтому выбор сделан в пользу этой СУБД. Подойдут любые открытые решения, а также решения распространяемые без исходного кода, но на бесплатной основе (и с документацией).

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Карты в приложении

Сообщение trir » 03 мар 2015, 21:34

Платное решение
какое
Какая архитектура софта

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 03 мар 2015, 21:58

trir писал(а):какое
http://www.gisinfo.ru/
trir писал(а):какая архитектура софта
Софт на рабочем месте оператора можно воспринимать как standalone-приложение. Оно написано под .NET (преимущественно C#), использует несколько различных библиотек для подключения к базе, пересылки сообщений по различным каналам, логирования и т.д. - все это управляемый код. Сейчас сообщения приходящие с различных устройств (или с других экземпляров программы, что по сути не важно) отображаются в виде таблички. Заказчику очень хочется, чтобы они отображались в виде объектов на карте, которую можно листать, зумать и искать объекты по адресу. Используется СУБД PostgreSQL, все запросы идут напрямую в СУБД.

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Карты в приложении

Сообщение trir » 03 мар 2015, 22:45


Аватара пользователя
SergeyRyzhkov
Гуру
Сообщения: 909
Зарегистрирован: 02 июл 2014, 19:13
Репутация: 203
Ваше звание: GP-экотеррористы
Откуда: Санкт-Петербург
Контактная информация:

Re: Карты в приложении

Сообщение SergeyRyzhkov » 03 мар 2015, 23:22

Mapsui на гитхабе посмотрите

[ Сообщение с мобильного устройства ]

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 04 мар 2015, 10:01

Спасибо, посмотрел dotSpatial, однако, не нашел (не понял) возможно ли его подключить к PostGIS, поэтому решил попробовать использовать MapWinGIS. Он, судя по документации http://mapwingis.codeplex.com/wikipage? ... umentation позволяет использовать Spatial Database

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 04 мар 2015, 10:06

SergeyRyzhkov писал(а):Mapsui на гитхабе посмотрите
Посмотрел отзывы, люди рекомендуют SharpMap вместо Mapsui. За наводку спасибо.

А вы сами Mapsui использовали для соединения с postGIS?..

И еще, возможно я выбрал не самый удачный подход с использованием реляционной БД в качестве хранилища пространственных данных. Я так понимаю, самый простой способ получать более менее актуальные карты - это использовать OSM. Может есть другой способ (без PostgreSQL или даже без OSM) который позволяет получать обновления карт, подготавливать эти данные и отображать офлайн в Windows приложении?

Поделитесь опытом :)

Аватара пользователя
SergeyRyzhkov
Гуру
Сообщения: 909
Зарегистрирован: 02 июл 2014, 19:13
Репутация: 203
Ваше звание: GP-экотеррористы
Откуда: Санкт-Петербург
Контактная информация:

Re: Карты в приложении

Сообщение SergeyRyzhkov » 04 мар 2015, 11:10

g00d писал(а):
SergeyRyzhkov писал(а):Mapsui на гитхабе посмотрите
Посмотрел отзывы, люди рекомендуют SharpMap вместо Mapsui. За наводку спасибо.
А вы сами Mapsui использовали для соединения с postGIS?..
И еще, возможно я выбрал не самый удачный подход с использованием реляционной БД в качестве хранилища пространственных данных. Я так понимаю, самый простой способ получать более менее актуальные карты - это использовать OSM. Может есть другой способ (без PostgreSQL или даже без OSM) который позволяет получать обновления карт, подготавливать эти данные и отображать офлайн в Windows приложении?
Поделитесь опытом :)
Если говорить именно про .NET, то немного разное назначение у проектов
Mapsui - это именно рендеринг, причем для разных устройств. Очень компактно и бодро все.
SharpMap - попытка собрать в кучу все и доступ к данным (провайдеры) и отображение и т.д. Весьма солидно выглядит для небольших смотрелок
NetTopologySuite - порт с Java. По наименованию понятно назначение
еще с десяток есть, но порог вхождения "тяжелый", надо все увязывать, разбираться, править баги, подпиливать под себя.
Можно хоть leaflet под WinForms использовать и быстро, и разбираться не надо особо, но с минимальной функциональностью.
Вообщем от задачи зависит.

Насчет хранения - также от задач зависит, смотря какие данные хранить собираетесь и зачем (то есть это просто помойка данных или же осмысленное хранение с уровнем обработки данных). А так можно хоть в файловой системе хранить и в виде тайлов, и виде вектора, ну или в sqlite и пользуйтесь на здоровье.

Мой "боевой" опыт - это MapInfo MapExtreme + Oracle. PostGIS - не тянет, ИМНО
Но это очень большие проекты, вряд ли Вам это надо.

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Карты в приложении

Сообщение trir » 04 мар 2015, 11:28

MapWinGIS
For others GDAL drivers are used
К DotSpatial тоже можно GDAL и через него к БД

Или напрямую
http://dotspatial.codeplex.com/wikipage ... tureSetsCS

1. Подключится к БД
2. Получить геометрию как wkb/wkt
3. Создать слой из этой геометрии

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 07 май 2015, 10:18

Реализовал SharpMap + PostGIS. Работает медленно даже для карты одной области. Загружаю только roads. Если добавить к ним label, то все работает очень тяжко. А когда я добавил еще один слой, то ... решил конца не ждать.

Создал с помощью TileMill БД формата mbtiles (с нужными слоями), но подключить ее пока не получается: нужно использовать BruTile, а у него ниодной доки нет. Примеры в нете со старой версией, для новой не работает. ((

Попробовал использовать shape, но это еще медленее на SharpMap-е

Что делать со скоростью? Можно ли использовать mbtiles (производительность улучшится)? Как подключить его на C#
Последний раз редактировалось g00d 07 май 2015, 11:14, всего редактировалось 1 раз.

Аватара пользователя
SergeyRyzhkov
Гуру
Сообщения: 909
Зарегистрирован: 02 июл 2014, 19:13
Репутация: 203
Ваше звание: GP-экотеррористы
Откуда: Санкт-Петербург
Контактная информация:

Re: Карты в приложении

Сообщение SergeyRyzhkov » 07 май 2015, 10:25

Используйте мод.версию шарпмапа
https://github.com/pauldendulk/Mapsui
В ней же есть поддержка BruTile (хотя я его пока не рискнул бы использовать, глючный код порой ...)

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 07 май 2015, 11:56

SergeyRyzhkov писал(а):Используйте мод.версию шарпмапа
https://github.com/pauldendulk/Mapsui
В ней же есть поддержка BruTile (хотя я его пока не рискнул бы использовать, глючный код порой ...)
Наверное тогда придется использовать PostGIS и далее.

Я так понял проблема не в нем, он по скорости работает нормально, скорее всего проблема в sharpmap, ну да ладно... буду меньше объектов передавать просто
Последний раз редактировалось g00d 07 май 2015, 17:23, всего редактировалось 2 раза.

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 07 май 2015, 12:03

Есть еще вопрос: можно ли скрывать/отображать элементы карты при изменении масштаба (автоматически или надо кодить?) РЕШЕНО : 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 и т.д.)

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 14 май 2015, 19:14

Собственно, что печалит: скорость - я настроил параметры отображения слоев в зависимости от масштаба, отфильтровал данные в OSM, но все равно, если для небольших городов, районов - скорость нормальная, то, например, для Ростова-на-Дону скорость отображения/обновления карты огорчает. Думаю, что это все таки вина SharpMap, т.к. когда я подключал БД в QGis таких проблем не наблюдалось. Может подскажите идею как найти узкое место?

Ну и отсутствие нормальной документации на SharpMap ужасно раздражает. Есть лишь примеры использования, при этом далеко не все рабочие с последней версией SHarpMap. Примеры из хауту не работают... Печаль, чес слово.

Попробовал создавать Image и вставлять их в pictureBox - скорость одинаковая. Все время уходит на refresh карты (БД точно не при чем).

В конце концов, может на C++ переписать?

g00d
Новоприбывший
Сообщения: 9
Зарегистрирован: 03 мар 2015, 15:53
Репутация: 0

Re: Карты в приложении

Сообщение g00d » 14 май 2015, 23:44

Может я что-то неправильно делаю:

Код: Выделить всё

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 гостя