728x90

 


문제 요약

GeojsonDataSource.load()로 데이터를 불러와 polygon과 그 경계선을 그리려고 한다.

1. 3D 지형 위에 경계선을 그려야 함
2. 경계선이 가끔 사라지는 오류가 있음

 

해결 요약

1. Polygon을 그린 뒤, 그 위에 Polyline 타입으로 경계선을 그려준다.
2. Polyline(경계선)이 항상 카메라에 가깝도록 zIndex를 설정한다.

 

상세 설명

1. 3D 지형에 부착 가능한 면과 선 그리기

1
2
3
4
5
6
7
8
9
10
11
  viewer.dataSources.add(
    Cesium.GeoJsonDataSource.load(
      "../SampleData/ne_10m_us_states.topojson",
      {
        stroke: Cesium.Color.HOTPINK,
        fill: Cesium.Color.PINK.withAlpha(0.5),
        strokeWidth: 3,
        //clampToGround: true
      }
    )
  );
cs

GeojsonDataSource.load()로 데이터를 불러올 경우, 내부 색상과 경계선을 지정할 수 있다.

하지만 데이터를 3D 지형 위에 부착하게 되면 이런 옵션을 사용할 수 없다. 데이터를 3D 지형 위에 달라붙게 하는 옵션인 clampToGround를 사용(true)할 경우, stroke 옵션을 사용할 수 없는 현상에 관련된 깃허브 이슈 참고.

그래서 polygon타입과 polyline타입의 entity를 각각 추가해 주었다. json을 DataSource 타입으로 로드하고, 속성을 그대로 entity 생성 option에 넣어준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GeoJsonDataSource.load( "../SampleData/ne_10m_us_states.topojson")
.then(dataSource => { dataSource.entities.values.forEach(element => {
    const entity = viewer.entities.add({
            polygon: {
                hierarchy: element.polygon.hierarchy.getValue(),
                material: Cesium.Color.PINK.withAlpha(0.5),
            },
            polyline: {
                positions: element.polygon.hierarchy.getValue().positions,
                width: 2,
                material:  Cesium.Color.PINK.withAlpha(0.5),
                clampToGround: true,
            },
            properties: element.properties,
        })
    }
 
cs

 

2. 선이 사라지는 문제

업로드한 데이터가 생각보다 최적화하기 어려웠는지, 변환 과정에서 entity가 엉망으로 생성되었거나 렌더링에 최적화되지 못한 것 마냥 잔오류가 발생했다. 원인은 모르겠지만 상호작용할 때마다 polyline으로 만든 경계선이 희미해졌다. 오류 메시지도 없고 경계선 부분을 클릭하면 다시 선이 뚜렷하게 보인다. 아예 사라지는 문제는 아니고, polygon과 polyline이 카메라 방향에서 엎치락뒤치락하는 것 같다.

카메라에 누가 더 가깝게 보이는지 순서를 정해서, 가려지는 녀석을 지정해주기로 했다. 통상적으로 Z-Index에서 순서 정리라고 표현하나 보다. 다른 3D 개발을 할 때에도 같은 용어를 썼던 것 같다. 이름은 같아도 디테일한 부분에서 다를 수 있으므로 사용하는 개발 환경이나 엔진에 따라 용법을 찾아봐야 한다. (그래도 거의 비슷하긴 함) CesiumJS Forum의 Z-Index 질의글 참고

Polyline이 가려지는 것이 문제이므로, Polyline의 Z-Index 값을 크게 해서 카메라에 가장 가깝게 위치하도록 했다.

1
2
3
4
5
6
7
8
polyline: {
    positions: element.polygon.hierarchy.getValue().positions,
    width: 2,
    material:  Cesium.Color.PINK.withAlpha(0.5),
    clampToGround: true,
    zIndex: 10 // 클수록 카메라에 가깝다
}
 
cs

 

3. 일단 해결

여러 번 클릭해도 선이 지워지지 않고 잘 보임

 

728x90

'📗 학습과 개발 기록 > GIS' 카테고리의 다른 글

CesiumJS  (0) 2022.02.03
표준노드링크 컬럼 분석  (0) 2022.01.12
QGIS를 사용하여, 좌표계 정보를 포함한 데이터 내보내기  (0) 2022.01.07
[GIS] GeoCoding  (0) 2021.08.31
[GIS] 주요 좌표계  (0) 2021.08.12

+ Recent posts