위도 / 경도로 여러 레이어의 경계 상자를 계산하는 방법은 무엇입니까?


11

모든 종류의지도 서비스 (주로 AGS 9.x, AGS 10 및 WMS 1.x)의 성능을 테스트하는 응용 프로그램을 작성 중입니다.

응용 프로그램의 일부에는 서비스 전체 범위 내에서 개별 요청에 대한 임의의 경계 상자를 생성하는 작업이 포함됩니다. 이 부분은 서비스의 전체 범위를 알고있을 때 (예 : AGS 서비스의 fullExtent 속성을 통해) 지리적 및 투영 된 좌표계에 적합합니다.

내 문제는 WMS에 관한 것입니다. GetCapabilities 응답의 각 계층은> = 1 CRS에서 경계 영역을 정의 할 수 있습니다. 응용 프로그램의 일부 부분은 서비스의 CRS가 지리적이거나 투영되어 있는지 알아야하므로 WMS에서 모호성을 제거하기 위해 항상 정의되고 EPSG : 4326으로 ​​레이어의 LatLonBoundingBox를 사용하고 있습니다. 그런 다음 개별 요청에 속하는 모든 계층 (랜덤 화됨)을 기반으로 전체 서비스 경계 상자를 계산해야합니다. 이것은 까다로운 곳입니다.

각 위도 / 경도 경계 상자마다 LLx (왼쪽 경도)가 자오선에 따라 URx (오른쪽 위 경도)보다 크거나 작을 수 있기 때문에 길을 잃었습니다. 정사각형이나 원형 다이어그램을 그리기 시작할 때마다 나는 접근 방법이 있다고 생각하고 그것을 파멸시키는 사례를 찾으면 뇌가 흐릿 해집니다.

나는 그것이 작동 할 때까지 계속해서 쓰러 뜨리고 여기에 솔루션을 게시하면 내 인생을 더 편하게 할 수있는 완전히 테스트 된 접근 방식이 있어야한다고 확신합니다. 나는 지금 그것을 찾을 수 없습니다.


이 글에서 stonybrook.edu/libmap/coordinates/seriesa/no2/a2.htm (글로벌 곤차 섹션)을 읽었습니다. 불행히도, 글로벌 곤차 를 해결하기위한 간단하고 우아한 해결책은 없습니다. 모든 레이어 범위를 스캔하고 URx <LLx 인 경우 단순히 범위를 -180 +180으로 설정하려고합니다. 같은 기사에서 대부분의 GIS는 이러한 좌표를 가진 다각형을 두 개의 개별 피처로 나눕니다.
tomfumb

검색 엔진에 대한 몇 가지 키워드가 있습니다. 최소 경계 상자, 여러 경계 상자 병합, 국제 날짜 줄, 불연속, 최소 원 세그먼트
letmaik

답변:


6

참조 된 기사는 신중합니다. 그러나 "단순하고 우아한"솔루션 있다고 생각 합니다. 지리 데이터 세트에는 두 가지 종류의 경계 상자가 있습니다. + -180 자오선에 걸 치지 않는 사람은 항상 저장하고 검색 할 수 있습니다. + -180 자오선을 차지하는 자들은 반 보완 형태 로 저장 될 수 있습니다 . 즉, 평소와 같이 위도 범위를 저장하지만 대신 상자에 포함 되지 않은 경도 범위를 저장하고 비트를 토글하여 어떤 형태를 나타냅니다 저장 용량이 사용되고 있습니다). 기본적으로 지리 색인이나 검색 트리 구조를 수정할 필요는 없습니다. 검색 알고리즘에는 약간의 수정 만 필요합니다.

여하튼, 질문 자체에 대한 해결책이 있습니다.


입력이 일련의 경계 상자 설명자 ((LLx, LLy), (URx, URy)) 일 것으로 예상합니다.

  • -540 <= LLx, -180 <= URx, LLx <= 180 및 URx <= 180. 또한 -90 <= LLy <= URy <= 90.

  • (경도, 위도) = (x, y)의 지점은 다음과 같은 경우에만 BB 내에있는 것으로 간주됩니다.

    1. LLy <= y <= URy 및

    2. 어느 LLX <= X <= URX 또는 LLX - 360 <= X <= URX.

출력의 경우 모든 입력의 합집합을 포함하는 가장 작은 경계 상자의 매개 변수를 원합니다.

분명히 최소 경계 상자 (MBR)의 y- 제한은 y- 값의 최소 및 최대가됩니다. x- 제한의 경우 라인 스윕을 사용하여 가장 큰 간격 을 찾으십시오 .

다음은 알고리즘에 대한 설명입니다. 설명을 위해 입력이 네 개의 상자로 구성되어 있다고 가정합니다.

((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))

다음은 첫 번째 상자, 첫 번째 두 개, 첫 번째 세 개, 모든 상자의 상자 (빨간색)와 MBR (검은 색)의 다이어그램입니다.

여기에 이미지 설명을 입력하십시오

두 번째 단계에서 동부와 서반구의 상자는 + -180도 자오선을 가로 지르는 MBR로 둘러싸여이지도에서 두 개의 별도 상자로 표시됩니다. 마지막 단계에서 남미와 남극 대륙 사이의 작은 상자를 수용하기 위해 MBR을 동쪽으로 확장해야합니다.

  1. 상자의 모든 x 좌표를 추출하고 모듈러스 360 (-180..180 범위에 배치)을 계산하고 오름차순으로 정렬 한 다음 첫 번째 값 (360 도씩 증가)을 끝에 추가하여 줄 바꿈합니다. 주위에:

    -149, -90, -81, -77, -69, -36, 77, 156, 211
    

    211과 -149는 동일한 자오선입니다.

  2. 각 x 좌표는 선행 좌표 (이전 값은 제외)와 그 사이의 간격을 나타내는 것으로 생각하십시오. 예를 들어, -77은 -81에서 -77까지의 모든 값을 나타내지 만 -81은 포함하지 않습니다. 첫 번째 이후의 각 항목에 대해 해당 간격이 포함 된 상자 수를 계산하십시오.

    1, 0, 1, 0, 1, 0, 1, 0
    

    예를 들어, 첫 번째 "1"은 하나의 상자가 -149에서 -90 사이의 간격을 포함 함을 의미합니다. (세번째 상자입니다.)

    당신이 찾아로 최적화, 당신은 빨리 계산을 중지 할 수 있는 다음 X-간격에 X-간격과 이동을 포함하는 상자. 우리는 어떤 상자에 포함 되지 않는 간격을 결정하려고합니다 .

  3. (1)에서 정렬 된 x 좌표의 첫 번째 차이점을 계산합니다.

     59, 9, 4, 8, 33, 113, 79, 55
    

    이를 (2)의 적용 범위 수와 일치시킵니다. 적용 횟수가 0 인 가장 큰 차이를 찾으십시오. 여기서는 113이전 배열의 6 번째 요소 와 같습니다 . 이것은 상자 모음이 남긴 경도의 가장 큰 간격입니다.

    (흥미롭게도, 하나 이상의 위치에서 최대 값이 발생할 가능성은 솔루션이 반드시 고유하지는 않다는 것을 보여줍니다! 상자 세트에 대해 둘 이상의 MBR이있을 수 있습니다. MBR 내에서 + -180 자오선까지의 평균 거리는 가능한 한 커야합니다. 동점을 해결하려면 가장 동쪽에있는 솔루션을 선택하십시오.)

  4. 해당 간격을 찾으십시오. 여기에서 -36에서 77 사이입니다. 이것은 MBR에 없는 경도의 범위입니다 . 따라서 보수는 -180에서 180 사이의 보수를 취하십시오. 여기서 보수는 -180에서 -36과 77에서 180 사이의 두 개의 분리 간격입니다. -180도 자오선 : 여기에서 -283에서 -36까지 (또는 77에서 324까지)

  5. MBR의 모서리에 대해 y 값의 최소값과 최대 값을 사용하십시오.

    ((-283, -85), (-36, 81))
    

포인트 4의 마지막 문장에서 왜 "-283부터 -36까지"라고 쓰십니까? 왜 77에서 -36이 아닌가?
letmaik

1
@neo "77 ~ -36"은 비어있는 간격이므로 (정의 적으로, 간격 [a, b]는 모든 숫자 x 로 구성되어 a <= x <= b입니다. a = 77 및 b = -36의 경우 그러한 숫자가 없습니다.) "잘 말하면 경도가 올라가는 한 77에서 -36까지는 완벽합니다. " 문제는 그렇지 않다는 것입니다 .77에서 180 = -180까지 올라가서 -36까지 계속 하겠습니까, 아니면 77에서 -36 으로 내려 갑니까 ? 이러한 모호성을 피하기 위해 나는 신중하게 선택했습니다.
whuber

나는 당신의 답변을 빠르게 구현했습니다 ( gist 참조 ). 상자에 간격이 포함되어 있는지 확인하려면 상자 경도를 풀어야했습니다. 그렇지 않으면 불연속을 가로 지르는 상자에는 효과가 없었습니다. 초보자이기 때문에 이것이 완전히 명확하지 않았습니다. :)
letmaik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.