You are not logged in.

#26 2012-05-30 17:40:07

Dmitry Terentiev
Member
From: Мурманск
Registered: 2008-09-05
Posts: 366

Re: Данные OSM в MongoDB

x10kHz wrote:

Корректно ли вообще такое отношение?

Корректно. И outer и inner может быть несколько замкнутых полигонов,  составленных из отдельных веев. Вот пересечения и самопересечения недопустимы.


www.MurmanskOSM.ru - валидатор адресов Мурманской области по данным  http://www.cikrf.ru

Offline

#27 2012-05-30 19:23:52

x10kHz
Member
Registered: 2009-10-06
Posts: 138

Re: Данные OSM в MongoDB

Спасибо! Самое фиговое что можно из нескольких незамкнутых веев полигон собрать замкнутый...
Как-то эту хрень надо в один нормальный полик превращать...

Offline

#28 2012-05-30 19:52:49

PShA
Member
Registered: 2011-07-26
Posts: 170

Re: Данные OSM в MongoDB

Препроцессить, не?

Offline

#29 2012-05-31 06:20:34

x10kHz
Member
Registered: 2009-10-06
Posts: 138

Re: Данные OSM в MongoDB

для простых поликов научился кое-как создавать списки веев и отдельных нодов входящие в конкретный тайл...
теперь нужно учитывая отношения сделать также только с мультиполигонами и береговыми линиями вода/суша
Я рассчитывал что с мультиполигонами ситуация несколько проще чем оказалось)
т.е. они хотя бы должны были состоять из замкнутых веев) А их еще и собрать нужно... точка к точке, надеюсь в базе нету перепутанных местами незакрытых outer'ов, но почти уверен что есть) В таком случае придется еще и высчитывать можно ли корректно собрать один или несколько замкнутых полигонов из списка outer'ов незакрытых...

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

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

Демку такой штуки я делал на небольших примерах... не так уж и много объектов получается, гугл и MapsWithMe же как-то рендерят на лету
Объем не очень большой т.к. информация хранится только для крупных тайлов в основном, для мелких она хранится в том случае если мы в густо зарисованных районах типа крупных городов...

Offline

#30 2012-06-01 21:34:41

x10kHz
Member
Registered: 2009-10-06
Posts: 138

Re: Данные OSM в MongoDB

Встречайте! Страшный и ужасный мультиполигон
Достаточно сложный... состоит из нескольких перемешанных местами незакрытых и закрытых внешних веев, а также внутренних)
multipolygon.png

Как-то удалось собрать его в кучу... связкой Boost Graph и Boost Geometry)
На других страшных мультиполигонах не тестил, но уже что-то!

Возможно не самый короткий и правильный путь, но заработал)
В кратце получается так что отдельно для внешних и внутренних веев:
1) из всех незакрытых веев, которые записаны в релейшн нужно посмотреть первые и последние id нодов... они будут вершинами графа
2) в граф добавить ребра соответствующие этим нодам. Далее найти циклы в графе. Соответственно должны получится полигоны из вершин графа.
3) для каждого цикла проверить последовательности нодов в веях и "развернуть" некоторые веи т.к. направление их не учитывается.
4) для каждого цикла сложить ноды всех веев (с учетом разворота) в отдельный вектор , в итоге получаем вектор векторов нодов, т.е. массив полигонов!
Попутно можно ловить ошибки, сохранять их в бд.

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

Offline

#31 2012-06-01 22:28:07

PShA
Member
Registered: 2011-07-26
Posts: 170

Re: Данные OSM в MongoDB

Вроде очень неэффективно.
Берешь обычный std::map, например, или любой другой ассоциативный массив.
В нём у тебя будет храниться инфа о незамкнутых контурах.
Берешь очередной вей из отношения, смотришь, если есть какая-нибудь из конечных точек в мапе - пристегиваешь к сегменту, может быть склеиваешь два.
Если нет - добавляешь новым сегментом.
Как то так.

Offline

#32 2012-06-01 22:39:06

x10kHz
Member
Registered: 2009-10-06
Posts: 138

Re: Данные OSM в MongoDB

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

Offline

#33 2012-06-02 08:49:34

PShA
Member
Registered: 2011-07-26
Posts: 170

Re: Данные OSM в MongoDB

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

Offline

#34 2012-06-02 20:49:06

x10kHz
Member
Registered: 2009-10-06
Posts: 138

Re: Данные OSM в MongoDB

Реализовал без графов, достаточно просто, примеры которые есть работают...
попроще получилось и шустрее должно быть, буду гонять на planet.pbf или дампе России может и вылезет что нехорошее, но пока все ок!

UPD: вот на таком полигоне все поломалось)
UPD2: полигон поправил... там реально ошибка, на такой релейшн еррор нужно вешать!

Last edited by x10kHz (2012-06-02 21:32:14)

Offline

Board footer

Powered by FluxBB