curves (splines) for drawing in OSM

В несколько раз реже. Лень - двигатель прогресса :slight_smile:

:slight_smile: что есть прямая на геоиде? А вы уверены, что даже на плоскости просто умножая и деля вы не потеряете точность и не получите неправильный ответ на вопрос лежит ли точка на прямой?

Задача - поиск пересечений. Сейчас эта задачка решается аналитически без приближений. Хорошо, допустим метр между ломаной и кривой, для границы РФ идущей по речке осмосис у вас наестся памяти и скажет JavaHeapSpace дальше без меня ребята. Выставите 100 метров - памяти хватит а домикам и речкам нет.

trollmode
Вы же говорили что кривую задаем в координатах широта/долгота, а точность в метрах предлагаете считать, это как? Конечные разности тут не помогут :slight_smile:
/trollmode

В общем то да. Дергаете /dirty для тайла получаете новую версию - я бы сказал вполне себе на лету :slight_smile:

Посмотрел в вики вроде как то что я описал в первом примере называют просто сплайном, а то что во втором - кривыми Безье, дальше я такого деления и буду придерживаться. Собственно чем мне сплайны нравятся больше чем кривые Безье:
Рисуя сплайном вы точно знаете как будет выглядеть худший случай и можете вручную проконтролировать отсутсвие грубых ошибок.
Легко работать с уже созданной геометрией: вам достаточно задать точкам параметр что их стоит сгладить, не надо задавать доп. параметры.

Ну и всетаки нарисуйте пример как по вашему стоит кривые Безье задавать не удобно обсуждать в слепую. Спрашиваю потому, что их по разному задают. Иногда кусочками между точками с дополнительными 2мя точками иногда просто как огибающую для большого набора точек. Вот вы какой вариант подразумеваете.

Если сейчас придет толпа энтузиастов и нарисует все домики и все речки частыми-частыми точками (за что вы агитируете) - то осмосис наестся памяти точно также. Ибо хорошо настроенная интерполяция сплайна новые отрезки будет генерировать экономно. Далее, если я ставлю точность 100 метров, то я соглашаюсь, что судьба домиков в 100 метровой приграничной полосе меня мало волнует - они могут попасть в выборку, а могут и нет. Ну и хрен с ними, это нормально. Если же мне именно эти домики столь важны - иду покупаю память, курю даташиты виртуальной памяти ява-машины, пересекаю с запасом наружу. Не вижу проблем.

Если габариты сплайна ограничены 20 километрами и сам он далеко от полюса, то физические метры легко пересчитываются в доли градуса (типа один градус широты - 110 километров), и дальше приближающая ломаная не должна уклоняться от идеального сплайна на столько-то долей градуса по долготе и столько-то по широте.

Именно что нет, на лету это при каждом запросе картинки слипимэпом. Знаете как php на лету генерится?

Нет, не так. Сплайн - это что-то из кусочков. В качестве кусочка может выступать например полином какой-то степени, экспонента, кривая Безье. В последнем случае получаем сплайн Безье. NURBS это когда кусочками выступают дроби из полиномов.

Кривая Безье состоит из двух конечных точек и 1-2-…-N управляющих. И тогда называется кривой N+1 порядка, т.к. аналитически описывается полиномом N+1 порядка. Для всех практических целей достаточно второго или третьего порядка. Более сложные линии делаются склейкой нескольких кривых безье подряд концевыми точками - сплайн безье. Хорошие картинки кривых разного порядка с анимацией здесь:
http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D0%91%D0%B5%D0%B7%D1%8C%D0%B5

В связи с вышенаписанным я вот это:

не очень понял.

Mir76, я не хочу спорить по куче мелких пунктов, это скучно и в общем мало влияет на обсуждение в целом. Если вы хотите, чтобы что то новое было принято, мало найти изьяны в текущем положении дел и в словах оппонентов. Надо дать целостное видение того как вы себе представляете правильный результат. Потратьте 5 минут времени нарисуйте тот же коллизей. Я в общем то не противник кривых (правда с оговорками) но вы пока и меня не убедили, что это должны быть именно кривые Безье и что… Я даже адекватно ответить вам не могу, тупо из за того что вы не описали решения которое вам кажется верным полностью, не описали используете ли вы текущий набор типов геометрии из осма или добавляете новый тип. Времени на описание потратите меньше чем на споры со мной, а пользы точно больше чем от обсуждения что считать “на лету” и как там похапэ на лету исполняется.

Кривые Безье 2 порядка сами себя не пересекают

отличная опечатка

А существуют ли вообще ГИС, которые используют кривые вместо прямых?

Так в чём проблема? Рисуешь, локально рассчитываешь достаточную аппроксимацию ломаной, загружаешь её на сервер.

Во всех реально применяемых моделях, будь то равно промежуточная проекция (aka +longlat) или любая другая, либо эллипсоид с эллиптическими же дугами, задача решаемая аналитически и если не пытаться засунуть координаты в один байт, решаемая очень точно, возможно даже абсолютно точно (см. например CGAL). Задача о принадлежности точки прямой кстати решается вообще без делений.

Зато могут сами на себя накладываться. Например (0 0), (0 1), (0 0)

p. s. Кривые Безье второго порядка суть квадратные параболы. Чем они лучше тех же дуг, построенных по тем же трём точкам, убейте, ума не приложу.

Я говорил о кривых 3 порядка, которые де факто стали стандартом в векторной графике, что 2D, что 3D. Да даже в MS Paint кривые третьего порядка.

Второго, конечно, проще для понимания юзеров.

Но у всех кривых Безье есть проблема в том, что они задаются точками, через часть из которых кривая в общем случае не проходит. Как следствие, софт, не понимающий предлагаемых тегов, будет чертить ломаную, проходящую через эти точки. А другие варианты приведут к нагромождению лишних объектов. Про введение нового типа объектов я вообще молчу, мы area-то не можем добиться.

Mir76 во я как раз об этом и говорил критикуя кривые Безье. О том что они не проходят через все точки. Т.е. софт не поддерживающий кривые, софт поддерживающий их полностью и софт апроксимирующий кривую ломанной нарисуют 3 разных варианта.

Только если задаватьдля каждой точки 2 управляющие точки в полярной системе координат через теги, но это муторно, и нужно в 3х случаях из ста, когда не хватает просто указания для точки что кривая проходящая через нее должна быть сглажена.

Давайте проще.

  1. образец схемы тегирования;
  2. пример того, как это можно организовать в PostGIS (ST_LinueToCurve “в лоб” сглаживаний не делает, проверено).

Без этих двух пунктов не надейтесь на поддержку сплайнов в мапнике. А не будет в мапнике - будет очередной местячковой схемой.

Сам лично сплайны не хочу, но от сглаживания круговых движений, например, не отказался бы.
http://openstreetmap.by/?zoom=18&lat=53.907022&lon=27.630604

Я не то, чтобы сильно хочу. Я больше за разумность, продуманность и логическую непротиворечивость аргументов, по которым оно будет отвергнуто. Когда я слышу “не надо сплайнов, т.к. у сллайна нельзя посчитать точки пересечения или его поведение зависит от проекции” - меня коробит. А когда слышу “Безье лучше сплайнов”, то это все равно, что автомеханику сказать “мерседесы гораздо лучше автомобилей”.

Кстати, самая разумная мысль во всем топике :slight_smile:

Кривые Безье в коммандлайне именно так и работают :3

Кто-то 200-метровый раундэбаут рисует 8 точками, а кто-то тропинку вокруг фонтана 64 точками. Кривыми в обоих случаях обошлись бы 4—8 точками точно.

А всё равно, кто-то бы нарисовал 3 сплайна, кто-то 15, а кто-то всё равно бы ломаными.

p. s. /me бы предпочёл одну окружность вместо 8 сплайно-точек.

К этой окружности всё равно 8 радиальных дорожек надо приделать, так что это будет 8 дуг, а не одна окружность.

^^ Кстати концептуальный вопрос … предположим мы идеально нарисовали кривую дорогу каким-то сплайном … и потом пришёл пользователь с потлачем, разбил на несколько сегментов так как нужно повесить ограничения на повороты, поставить теги покрытия, класса и т.п. Останется ли этот объект сплайном как и был при таком дроблении, разобьётся на кучу новых сплайнов или упростится в отрезки?

§

§

Взаимоисключающие параграфы детектед!

А почему не оставить сплайнами? Это задача решаемая, больше того, уже решенная, в том числе в свободных пакетах векторной графики (в том же Inkscape можно добавить в кривую Безье точку в любом её участке, и кривая сохранит свою форму)

Наверное я не совсем чётко выскзал мысль, но здесь важнее примеры.

Суть в том что процедура “разделения” и “объединения” линий (way) очень распространённая. Добавляя отрезки к сплайну получим сплайн а разделяя сплайны получим несколько сплайнов. Соответсвенно в какой-то момент получим сплошную сплайнизацию ОСМ :slight_smile: Вспомните историю с отношениями :slight_smile: