Нарисуйте диапазон камеры с Postgis - PullRequest
6 голосов
/ 07 октября 2011

Я работаю над некоторыми данными камеры. У меня есть несколько точек, которые состоят из атрибутов азимута, угла, расстояния и, конечно, координатного поля. В postgresql postgis я хочу рисовать подобные фигуры с помощью функций.

как я могу нарисовать эту розовую форму диапазона? сначала я должен нарисовать круг на 360 градусов, а затем извлечь из моей фигуры ... я не знаю как?

enter image description here

Ответы [ 2 ]

4 голосов
/ 31 декабря 2011

Я бы создал бы круг вокруг точки (x, y) с вашим радиусом расстояния, а затем использовал приведенную ниже информацию для создания треугольника, высота которого больше радиуса.

Затем, используя эти два многоугольника, выполните ST_Intersection между двумя геометриями.

ПРИМЕЧАНИЕ: Этот метод работает, только если угол меньше 180 градусов.

Обратите внимание, чтоесли вы вытянете внешние края и встретите его под углом 90 градусов от средней точки вашей дуги, у вас есть угол и соседняя сторона.Теперь вы можете SOH CAH TOA!

Extend and make right triangles

Получить очки B и C

Пусть точка A = (x, y)

Получитьверхняя точка:

точка B = (x + радиус, y + (r * tan (угол)))

, чтобы получить нижнюю точку:

точка C =(x + радиус, y - (r * tan (угол)))

Поверните свой треугольник к себе по азимуту

Теперь, когда у вас есть треугольник, вам нужно повернуть его к своему азимуту,с точкой поворота A. Это означает, что вам нужна точка A в начале координат, когда вы делаете вращение.Вращение - самая сложная часть.Его используют в компьютерной графике все время.(На самом деле, если вы знаете OpenGL, вы можете заставить его выполнять вращение за вас.)

ПРИМЕЧАНИЕ: Этот метод вращается против часовой стрелки на угол (тета) вокруг начала координат.Возможно, вам придется соответствующим образом изменить свой азимут.

Первый шаг: перевести ваш треугольник так, чтобы A (ваш исходный x, y) был в 0,0.Что бы вы ни добавили / вычли из x и y, сделайте то же самое для двух других точек.

(вам нужно перевести это, потому что вам нужно, чтобы точка A находилась в начале координат)

Второй шаг: Затем поверните точки B и C, используя матрицу вращения.Больше информации здесь , но я дам вам формулу:

Rotation matrix

Your new point is (x', y')

Сделайте это для точек B и C.

Третий шаг: Переведите их обратно в исходное место путем сложения или вычитания.Если вы вычли x в прошлый раз, добавьте его на этот раз.

Наконец, используйте точки {A, B, C} для создания треугольника.

И затем выполните ST_Intersection (geom_circle, geom_triangle);

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

0 голосов
/ 20 марта 2018

PostGIS поддерживает кривые, поэтому одним из способов достижения этого, который может потребовать меньше математики от вашего имени, было бы сделать что-то вроде:

SELECT ST_GeomFromText('COMPOUNDCURVE((0 0, 0 10), CIRCULARSTRING(0 10, 7.071 7.071, 10 0), (10 0, 0 0))')

Это описывает сектор с источником в 0,0, aрадиус 10 градусов (географические координаты) и угол раскрытия 45 °.

Обтекание этого дополнительными функциями для преобразования его из истинной кривой в LINESTRING, уменьшения точности координат и ее преобразованияв WKT:

SELECT ST_AsText(ST_SnapToGrid(ST_CurveToLine(ST_GeomFromText('COMPOUNDCURVE((0 0, 0 10), CIRCULARSTRING(0 10, 7.071 7.071, 10 0), (10 0, 0 0))')), 0.01))

Дает:

enter image description here

Для этого требуется несколько частей предварительно вычисленной информации (положениецентр, и две смежные вершины, и еще одна точка на краю сегмента), но у него есть явное преимущество в создании действительно изогнутой геометрии.Он также работает с сегментами с углами открытия более 180 °.

Совет: позиции 7.071 x и y, использованные в примере, можно вычислить следующим образом:

  • x = {radius} cos {angle} = 10 cos 45 ≈ 7.0171
  • y = {radius} sin {angle} = 10 sin 45 ≈ 7.0171

Угловые случаи: на антимеридиане и на полюсах.

...