Снова про area

Конечно, одна из основных проблем модели OSM — отсутствие типа для полигонов. В очередной блогопростыне Jochen Topf напомнил об этом, а заодно дополнил предложение типа данных небольшим комментарием про его использование:
Определим «area» аналогично объектам «way»: список ссылок на точки и набор тегов. Первая и последняя точка в списке должны совпадать. Как будет выглядеть API для редактирования подобных объектов? Пользователь отправляет запрос с bbox для редактирования. Чтобы работать с запрошенной областью, нам нужны все точки внутри этого прямоугольника, плюс как минимум по одной дополнительной точке с краёв линий. Если полигон входит целиком — хорошо, иначе потребуется знать, какая сторона внешняя, а какая внутренняя. Для этого постановим, что все точки должны быть отсортированы по часовой стрелке (можно и наоборот, но чаще сортируют так). Теперь редактор сможет нарисовать многоугольник правильно (внутри загруженной области): с учётом тегов у него будут все требуемые данные.
Далее он утверждает, что если отредактированная таким образом часть полигона корректна, то и весь полигон не поломается. «У меня нет математического доказательства, но буду рад примерам обратного». В блоге, правда, отключены комментарии: интересно, а если просто отразить весь набор точек половины полигона относительно перпендикуляра к границе загруженной области?
Поделиться
Отправить
2012   блоги
17 комментариев
dkiselev
А дырочки как вырезать?
Ivan
Если дырочки в МП и закручены в нужную сторону, то отчего ж не вырезать.
Если просто отражать — не факт, что он замкнется в отражении.
Ivan
«We obviously need a lot more discussion in the community» — и комментарии отключены. Эпично.
Ivan
Еще логическая ошибка у него, где он рассуждает про то, что если вносимые правки ограничены скачанным bbox, то целая area останется валидной. Это может быть не так в случае, если bbox пересекает один из сегментов area, но не содержит ни одной точки этого сегмента.
OverQuantum
Отправьте ему кто-нить
http://ge.tt/8zXzcRS/v/0?c

Ivan, икзакли! :)
Ivan
Уже, только свое наваял ))
Ivan
Ответил, что такие линии тоже надо выгружать. Логично, кто б спорил.
Vovanium
Если допустить, что степень «внутренности» может быть больше 1 (полигон в полигоне) и меньше 0 (дырка в пустом месте) то можно считать такую картинку валидной. Если не устраивает, то можно ловить сторонним валидатором, но всё равно, такой полигон сломать куда сложнее, чем его имитацию, что сейчас существует.
Ivan
Это ж самопересечение. Не понял, при чем тут «степень внутренности».
fserges
И тогда наконец отношения станут отношения а не «всем подряд».
Vovanium
Это три полигона, два из которых с положительным направлением обхода и один с отрицательным.
Вообще для правильной работы частичного редактирования алгоритм отбора отрезков должен быть соответствующим, а не по попаданию вершин в зону. Хотя бы по пересечению bounding box.
Ivan
Vovanium, о каких трех полигонах вы говорите? На картинке OverQuantum один bbox и один полигон — до и после разрушающего валидность изменения.
>алгоритм отбора отрезков должен быть соответствующим
так это и обсуждаем, Jochen просил контпример для его алгоритма — мы ему его привели.
dkiselev
Вопрос лишь что дешевле, посчитать на сервере все требуемые линии, или отдать клиенту весь набор точек чтоб сам разбирался.
freeExec
Ну в таком случае при аплоаде можно вернуть ошибку и заставить клиента докачать весь объект целиком.
Hind
Тред не читал, но в свое время предлагал такой способ хранения и обмена для типа area:

<area>
<nd ref=«1» />
<nd ref=«2» />
<nd ref=«3» />
<nd ref=«4» />
<nd />
<nd ref=«5» />
<nd ref=«6» />
<nd ref=«7» />
<nd ref=«8» />
</area>

Вот вам и область.
Но не надо забывать о том, что мультиполигоны применяются и для создания областей с числом нодов более 2000.
Vovanium
>Vovanium, о каких трех полигонах вы говорите? На картинке OverQuantum один bbox и один полигон — до и после разрушающего валидность изменения.
Ivan, на *картинке* явно видно три полигона с общими точками. То, что они представлены одной цепочкой вершин без пересечений — «особенность реализации». Inkscape (а наверное и сам стандарт SVG) например вполне считает подобные фигуры валидными.
>Но не надо забывать о том, что мультиполигоны применяются и для создания областей с числом нодов более 2000.
Да в общем-то пора бы научить API отдавать линии кусками и снять ограничение на их длину.
Ivan
>Ivan, на *картинке* явно видно три полигона с общими точками
OverQuantum, расскажите пожалуйста, что же все-таки на картинке. Мнения разделились :)