이번에 시스템상에서 shp파일로 레이어를 하나 생성해서, 라벨을 표출하였는데
이상하게 라벨링이 여러개 뜨는 현상이 발생하였다..
라벨이 여러개 뜨는 현상 발생
분명 같은 하나의 레이어 속성정보를 바라보고 있기 때문에 하나에만 떠야하는데.. 각 폴리곤마다 라벨이 뜨는 상황..
그래서 해당 shp파일을 QGIS에 올리고 라벨링을 해보니 아래와 같이 나왔다.
시스템과 달리 라벨이 하나만 떴다. 그래서 시스템상 에러는 아니지만 코드를 수정해야 겠다는 확신이 들었다.
원인파악
우선 레이어의 feature을 보았다. 예전에 멀티폴리곤은 아니지만 다중 라인스트링(multilinestring)에서도 비슷한
문제가 발생한 적이 있어서 그것과 비슷하게 접근해보려고 했다.
(다중 라인스트링에서 멀티 라벨링 해결방법은 나중에 시간이 되면 정리해보겠다..)
feature에서 지오메트리를 뜯어보니 아래와 같았다.
지오메트리의 endss_ 개수가 13개, 지오메트리의 폴리곤의 개수가 13개였다.
실제 표출되는 라벨의 개수 13개와 동일하였다. 그래서 여기가 문제라는 생각이 들었다.
실제 다중 라인스트링에서는 저기 있는 endss_와 simplifiedGeometryCache의 캐시값을 수정하여 해결하였었다.
(나중에 보니, 라벨을 하나만 생성되는데, 라인이 망가져 필요 없는 라인이 생기는 문제가 발생..)
하지만 멀티폴리곤은 그렇게 해도 해결이 안되어서 구글링을 해본 결과, 지오메트리를 수정해야 한다는 사실을 알았다.
우선 13개의 폴리곤 중 가장 큰 면적을 가진 폴리곤을 구하는 함수를 사용하였다.
문제해결
getMaxPoly 메서드
function getMaxPoly(polys) {
var polyObj = [];
//now need to find which one is the greater and so label only this
for (var b = 0; b < polys.length; b++) {
polyObj.push({ poly: polys[b], area: polys[b].getArea() });
}
polyObj.sort(function (a, b) { return a.area - b.area });
return polyObj[polyObj.length - 1].poly;
}
getMaxPoly 메서드를 통해 구한 면적이 가장 큰 폴리곤을 지오메트리에 set해줌
feature.setGeometry(getMaxPoly(feature.getGeometry().getPolygons()));
이렇게 하고 다시 해당 feature의 Geometry를 보면..
이런식으로 endss_에서 ends_로 바뀌면서 여러개의 배열이 아닌, 한개의 배열값만 갖게 된다.
이 상태로 라벨을 표출해보면 정상적으로 하나의 라벨만 표출된다.
저번에 해결한 다중 라인스트링도 그렇고 이번에 한 멀티폴리곤도 그렇고 결국에는
저 feature.getGeometry()에 있는 ends_에 맞춰 라벨을 생성하는 것 같다. ( 내 생각 )
feature.getGeometry().getPolygons의 개수만큼 라벨을 생성하는 것 같다.
만약 이상하게 라벨이 여러개 생성된다고 한다면 feature.getGeometry().getPolygons를 먼저 보면 좋을 것 같다.
'GIS' 카테고리의 다른 글
[GIS] 지오서버에 설치되어 있는 폰트 확인하는 방법 (0) | 2022.11.12 |
---|---|
[GIS] 멀티 폴리곤에서 가장 큰 면적을 가진 폴리곤을 가져오는 메서드 (0) | 2022.08.16 |
[GIS] 지오서버(GeoServer) 타일링에 대한 이야기 및 타일링 결과 확인하는 방법 (2) | 2022.07.22 |
[GIS] 지오서버(Geoserver)에서 레이어 발행시 생기는 에러에 대한 이야기.. ( Failed to locate the input fi (0) | 2022.07.21 |
[GIS] QGIS툴을 활용하여 여러개의 SHP파일을 합쳐보자. (0) | 2022.07.05 |