PostGIS에서 두 선이 교차하는 각도를 계산하는 방법은 무엇입니까?


19

PostGIS에서 교차하는 두 선 사이의 각도를 계산하고 싶습니다.

PostGIS에서 각도 계산의 시작점은 ST_Azimuth 인 것처럼 보이지만 점을 입력으로 사용합니다. 나의 첫 번째 생각은 교차 선의 끝점을 취하고 그에 대한 방위각 계산을 수행하는 것이 었습니다. 대부분의 선 피쳐가 직선적이지 않기 때문에 충분하지 않으며 교차 각도에 관심이 있습니다. 그래서 내가 생각해 낸 것은 다음 단계를 거치는 중첩 된 작업입니다.

  1. 두 선 피쳐 테이블 간의 모든 교차점을 식별하십시오.
  2. 교차점 주위에 매우 작은 버퍼를 만듭니다.
  3. 라인 피처가 버퍼 외부와 교차하는 지점을 식별하십시오 (두 개 이상인 경우 첫 번째 점을 찍습니다-각도가 0, 90 또는 180도에 가까운 지 여부에만 관심이 있습니다)
  4. 이 두 점에 대한 ST_Azimuth를 계산하십시오.

전체 SQL은 여기에 게시하는 것이 길지만 관심이 있으시면 여기에 설명했습니다 . (그런데 WITH 문을 따르는 모든 필드를 처리하는 것보다 더 좋은 방법이 있습니까?)

결과가 올바르게 보이지 않으므로 분명히 뭔가 잘못하고 있습니다.

출력 예 1 출력 예 2

편집 EPSG : 3785에서 계산을 다시 실행했는데 결과가 약간 다르지만 여전히 올바르지 않습니다.

3785 # 1의 출력 3785 # 2의 출력

내 질문은 결함 이이 과정에서 어디에 있는지입니다. ST_Azimuth가하는 일을 오해하고 있습니까? CRS 문제가 있습니까? 다른 거 있어요? 아니면이 작업을 수행하는 훨씬 더 간단한 방법이 있습니까?


1
원래 CRS는 무엇입니까? 각도 계산은 투영되지 않은 위도 / 경도가 아닌 등각 투영을 사용하여 수행해야합니다 (SRID = 4326).
Mike T

EPSG : 4326 좌표는 원래 모든 처리가 동일한 CRS에서 수행 될 것임을 100 % 확신하기 위해 ST_Translate를 포함 시켰습니다. 감사합니다.
mvexel

계산을 EPSG : 3785로 다시 작성하여 차이를 만듭니다. 새 결과를 표시하도록 질문을 수정하지만 결과는 여전히 실제 각도를 반영하지 않습니다.
mvexel 2016 년

답변:


12

나는 주현절이 있었다. 오히려 평범합니다. PostGIS가 직각을 계산하는 데 필요한 정보를 하나 남기지 않았습니다.

내가 계산 한 것은 작은 버퍼 외부를 교차하는 두 지점만의 각도였습니다. 교차 각을 계산하려면 버퍼 외부의 두 점과 두 선 피쳐의 교차점 사이의 두 각도를 모두 계산하여 빼야합니다.

전체 SQL을 업데이트 했지만 두드러진 부분은 다음과 같습니다.

SELECT
    ...
    abs
    (
        round
        (
            degrees
            (
            ST_Azimuth
            (
                points.point2,
                points.intersection
            )
            -
            ST_Azimuth
            (
                points.point1,
                points.intersection
            )
        )::decimal % 180.0
        ,2
    )
)
AS angle
...
FROM
points 

1
나는 instersection에서 버퍼 포인트의 각도에 대해 생각하고 있었지만, 세부적으로 갈 시간이 없었습니다. 다른 측면은 각도 단위이다. 결과를도 단위로 가져 오려면 ST_Azimuth의 라디안 결과에 180.0 / pi ()를 곱해야합니다.
Mike T

네, 감사합니다. PostgreSQL degree () 함수를 사용합니다.
mvexel

고기 베는 큰 칼. (지금까지는 학위 함수가 있다는 것을 몰랐습니다.)이 모든 논리를 함수 호출로 마무리하는 것이 좋지만 작동 방식을 개념화하는 데 어려움을 겪고 있습니다 ST_IntersectionAngle(....
Mike T

실제로 PostGIS 기능이 아니라는 사실에 놀랐습니다. 이에 대한 의견을 보내 주셔서 감사합니다.
mvexel

2

나는 최근에 같은 것을 계산해야했지만 더 간단하고 빠른 접근법을 결정했습니다.

방위각 계산을위한 여분의 포인트를 찾으려면, 난 그냥 사용 (매우 라인의 시작에서 발생하는 드문 경우에 이후 나) 교차로 뒤에 길이의 permyriad을 확인 ST_Line_Locate_PointST_Line_Interpolate_Point를 :

abs(degrees( 
  ST_Azimuth (
    intersection, 
    ST_Line_Interpolate_Point(
      line1, 
      abs(ST_Line_Locate_Point(line1, intersection) - 0.0001)
    )
  )
  -
  ST_Azimuth (
    intersection, 
    ST_Line_Interpolate_Point(
      line2, 
      abs(ST_Line_Locate_Point(line2, intersection) - 0.0001)
    )
  )
))

Permyriad는 임의적이며보다 일관된 결과를 위해서는 절대 오프셋을 사용하는 것이 좋습니다. 사전에 예를 체크 20m에, 당신은 0.0001 변경 것 20/ST_Length(line1)하고 20/ST_Length(line2)각각을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.