curves (splines) for drawing in OSM

Пример релейшенов как раз и показывает, что лучше 10 раз подумать прежде чем революционно расширять возможности. “Немного затянувшееся” перелицензирование ещё один грустный пример.

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

Ну хорошо рассмотрим пример, сплайн около экватора, экватор - прямая. Я в математике не силен, не помню как называются такие кривые, которые проходят через все заданные точки плавненько изгибаясь от одной к другой. (У кривых Безье 2 точки вспомогательные и через них прямая не обязанна проходить - это все из воспоминаний по 3d максу там есть 2 вида сплайнов Безье и т о которых я сейчас говорю).

Допустим у нас кривая проходит через 4 точки. Обозначил их звездочками.

  •                *
    
    \ /
    * *
    +

Надеюсь вы узнаете в моих псевдографических каракулях - подобие параболы.

Теперь вы перепроецировали кривую. Допустим что при перепроецировании у вас точки по вертикали сдвигаются тем сильнее чем дальше они от экватора. Это вполне реальная ситуация только не заканчивая профильный вуз по именам я вам эти проекции не назову. sim думаю сможет :slight_smile:

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

Как-то так. :slight_smile:

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

Эти рассуждения можно проводить не обязательно с линией экватора, все будет так же. Просто с экватором проще и нагляднее.

Между двумя точками в географических координатах можно провести разные линии - дугу большого круга (Great Circle), просто прямую при небольших расстояниях, локсодрому (Rhumb Line), прямую в прямоугольных проекциях (Grid Azimuth). В зависимости от крутизны редактора/рендера может импользоваться разная математика, и если в одном редакторе две прямые не пересекаются, в другом редакторе/проекции они запросто пересекутся. Про сплайны даже думать страшно, как собираются считать их на эллипсоиде :slight_smile:

А выбрали ли «каноническую» кривую? Мне всё время чудится, что это дуга большого круга…

А мне подумалось про чуть более сложные алгоритмы, типа Point Location на Trapezoidal Map. Кажется, что со сплайнами будет полный мрак.

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

Кстати, очень простой пример.
Рисуем две геодезические линии (по дуге большого круга на сфере или эллипсоиде, т.е. кратчайшей прямой) с азимутом отличным от 0°, параллельные, отстоящие на десяток метров. Естественно они не пересекаются.
Одну из линий делим на отрезки (также по кратчайшей прямой, т.е. дуге большого круга) через 1-10 км и ставим на ней промежуточные точки. Линии по-прежнему не пересекаются (на эллипсоиде).
Переводим массивы координат в меркатор и любуемся результатом. А ведь это типичный результат, например, для протяженных административных границ.

PS: границы с тегом source=www.eastgeology.com имеют много промежуточных точек на “прямых” участках. Неспроста :wink:

Вы собираетесь проецировать кривые третьего порядка на геоид. Может, не надо? Одумайтесь! :3

как альтернативный вариант - может делать тегами подсказки для рендера? типа geo=smoothed или geo=arc на отрезках way’ев?

Я видимо, совсем тупой, плохо объясняю. Есть два принципиально разных способа прикрутить сплайн, пусть какую-то кривую Безье, на геоид.

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

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

Это как это не пересекаются??? Вы нашли два непересекающихся больших круга на сфере?

Это называется - была векторная карта, а стала растровая :slight_smile:

Массовый проект должен быть простым, а сплайны/Безье это слишком сложно.

Возникает несколько ненавязчивых вопросов:
а) То есть, помимо прямого расчёта полинома 3-й степени (быстрые алгоритмы отрисовки вроде брезенхема уже ушли лесом) предлагается считать тригонометрические функции в каждой точке?
б) Что насчёт 180 меридиана?
в) Как быть с вычислением длины, площади и пр. аналитикой? Считать приближенно в лоб?

Две непересекающиеся дуги (отрезка). Я этого хлебнул по горло когда рисуешь планшеты в UTM. Это совсем нетривиальная задача.

PS: Zverik очень точно подметил про растр.

И вообще что такое сплайн в картографии и ГИС-съемке…
Отрезок я могу измерить физическими методами, проверить рулеткой. Окружность тоже измеряется. А как в поле измеряется сплайн, какой строитель, станок или прибор способен его изготовить - я не знаю. ИМХО максимум какую кривую можно поддерживать в базе - дугу окружности. Хотя даже с ней возникнут проблемы.

Не, не стала :slight_smile: Я написал математическую абстракцию про каждую точку, чтобы понятней было. В реальности сплайн все равно заменится на ломаную (векторную!) и потом она спроецируется в нечто многозвенное на геоиде. Проектирование отрезка ломаной отторжения не вызывает?

Это уже другой вопрос - “нужны ли сплайны”. Я пока говорю про “возможны ли” :slight_smile:

а) сплайн пересчитывается в ломаную, она уже по одному звену проецируется стандартными, работающими сейчас методами проецирования отрезков. Кроме того, тригонометрия считается сопроцессором очень быстро, быстрее полиномов на самом деле. Для совсем критичных приложений можно и предвычисленные тригтаблицы задействовать и даже целочисленную арифметику.
б) не вижу особых проблем. Гораздо страшнее полюса, от них лучше отрезаться, хотя бы по 80 градусу. И есть четкое желание ограничить область применения сплайнов объектами меньше 20 километров в диаметре. Берег озера, поворот дороги - что-нибудь такое.
в) способ из пункта а) сводит все эти задачи к уже решенным. Кроме того, в каждой конкретной задаче можно подумать над аналитическим решением, ускоряющим вычисления. Оно будет сильно зависеть от исходного определения сплайна.

А ведь здесь проблема в том, что нет четкой договоренности как именно проводить даже не сплайн - а отрезок прямой по двум концевым точкам. Даже что вообще такое - отрезок прямой на эллипсоиде. В принципе даже в меркаторе можно потребовать, чтобы отрезок соединял две точки по дуге большого круга. Тогда он выглядеть на карте будет совсем не прямым, зато с пересечениями будет более адекватно.

То есть, насколько я понимаю, приходим к следующему:
Решение не даёт преимущества, которые могли бы дать сплайны (гладкость), так как любую ломаную и так можно уже строить.
Решение создаёт дополнительные сложности в реализации.

Из сплайна можно получить ломанную с любой точностью. А из ломанной сплайн — нельзя.