Я хочу рассчитать угол между двумя линиями, где они пересекаются в PostGIS.
Начальная точка для расчета угла в PostGIS, кажется, ST_Azimuth - но она принимает точки в качестве входных данных. Моей первой мыслью было взять конечные точки пересекающихся линий и выполнить для них азимутальные вычисления. Это недостаточно хорошо, потому что большинство линейных объектов не прямые, и меня интересует угол на пересечении. Итак, я придумал вложенную операцию, которая проходит следующие шаги:
- Определите все пересечения между двумя таблицами линейных объектов.
- Создайте очень маленький буфер вокруг точки пересечения
- Определите точки, где линейные объекты пересекают внешнюю часть буфера (беря первую точку, если их больше одной - меня действительно интересует только, близок ли угол к 0, 90 или 180 градусам)
- Рассчитайте ST_Azimuth для этих двух точек.
Полный SQL довольно долго размещать здесь, но я привел его здесь, если вам интересно. (Кстати, есть ли лучший способ, чем перенести все поля, идущие вниз по операторам WITH?)
Результаты выглядят неправильно, поэтому я явно делаю что-то не так:
РЕДАКТИРОВАТЬ Я переделал расчеты в EPSG: 3785, и результаты немного отличаются, но все еще не правильно:
Мой вопрос, где недостатки в этом процессе. Я неправильно понимаю, что делает ST_Azimuth? Есть ли проблема с CRS? Что-то еще вообще? Или, может быть, есть гораздо более простой способ сделать это?