2023년 7월 11일 화요일

엔트와인 EPT 포인트 클라우드 타일 데이터 포맷 분석

EPT(Entwine Point Tile)는 포인트 클라우드 데이터를 위한 간단하고 유연한 옥트리 기반 저장 형식이다. 이 글은 포인트 클라우드 타일 데이터 포맷(EPT)을 분석한다.

EPT 이용한 포인트 클라우드 처리 예시

구조
EPT는 JSON 메타데이터와 바이너리 PCD(Point Cloud Data)를 포함한 파일 형식이다. 구조는 다음과 같다. 
├── ept.json
├── ept-data
│   └── 0-0-0-0.laz
├── ept-hierarchy
│   └── 0-0-0-0.json
└── ept-sources
    ├── list.json
    └── 0.json

ept.json은 메타데이터를 정의한다. 구성요소는 다음과 같다.

bounds는 옥트리의 경계를 표현한다. 
boundsConforming은 데이터의 경계를 표현하는 최소 영역을 정의한다.
dataType은 PCD파일 형식을 지정한다.
points는 포인트 개수를 의미한다.
schema는 포인트의 형식을 정의한다. x, y, z, 반사강도와 같은 데이터 유형을 정의한다. 
span은 옥트리의 각 x, y, z차원의 복셀 큐브 갯수를 정의한다. 이 값이 높을수록, 좀 더 정밀한 옥트리를 표현하지만, 사용 용량은 커진다. 
srs는 좌표계를 정의한다. 

다음은 메타데이터 예시이다. 
{
    "bounds": [634962.0, 848881.0, -1818.0, 639620.0, 853539.0, 2840.0],
    "boundsConforming": [635577.0, 848882.0, 406.0, 639004.0, 853538.0, 616.0],
    "dataType": "laszip",
    "hierarchyType": "json",
    "points": 10653336,
    "schema": [
        { "name": "X", "type": "signed", "size": 4, "scale": 0.01, "offset": 637291.0 },
        { "name": "Y", "type": "signed", "size": 4, "scale": 0.01, "offset": 851210.0 },
        { "name": "Z", "type": "signed", "size": 4, "scale": 0.01, "offset": 511.0 },
        { "name": "Intensity", "type": "unsigned", "size": 2 },
        { "name": "ReturnNumber", "type": "unsigned", "size": 1 },
        { "name": "NumberOfReturns", "type": "unsigned", "size": 1 },
        { "name": "ScanDirectionFlag", "type": "unsigned", "size": 1 },
        { "name": "EdgeOfFlightLine", "type": "unsigned", "size": 1 },
        { "name": "Classification", "type": "unsigned", "size": 1 },
        { "name": "ScanAngleRank", "type": "float", "size": 4 },
        { "name": "UserData", "type": "unsigned", "size": 1 },
        { "name": "PointSourceId", "type": "unsigned", "size": 2 },
        { "name": "GpsTime", "type": "float", "size": 8 },
        { "name": "Red", "type": "unsigned", "size": 2 },
        { "name": "Green", "type": "unsigned", "size": 2 },
        { "name": "Blue", "type": "unsigned", "size": 2 },
        { "name": "OriginId", "type": "unsigned", "size": 4 }
    ],
    "span" : 256,
    "srs": {
        "authority": "EPSG",
        "horizontal": "3857",
        "vertical": "5703",
        "wkt": "PROJCS[\"WGS 84 ... AUTHORITY[\"EPSG\",\"3857\"]]"
    },
    "version" : "1.1.0"
}

ept파일의 계층은 파일이름 형식에 표현된다. 
D-X-Y-Z 파일 이름 형식은 옥트리의 특정 큐브를 의미한다. 예를 들어, 0-0-0-0.json 파일 내용은 다음과 같다. 여기서, 2-0-1-0 옥트리 큐브는 322 포인트들이 포함된다.

{
    "0-0-0-0": 65341,
        "1-0-0-0": 438,
            "2-0-1-0": 322,
        "1-0-0-1": 56209,
            "2-0-1-2": 4332,
            "2-1-1-2": 20300,
            "2-1-1-3": 64020,
                "3-2-3-6": 32004,
                    "4-4-6-12": -1,
                    "4-5-6-13": -1,
                "3-3-3-7": 542,
        "1-0-1-0": 30390,
            "2-1-2-0": 2300,
        "1-1-1-1": 2303
}

포인트갯수 값이 -1일 경우, 별도의 해당 json파일 안에 옥트리 큐브 점 갯수가 정의되어 있다는 것을 의미한다 (예. 4-4-6-12.json).

PCD 파일 소스는 ept-sources/manifest.json 파일에 다음과 같이 저장된다. 
[
    {
        "path": "autzen-low.laz",
        "bounds": [635577.0, 848882.0, 406.0, 639004.0, 853538.0, 511.0],
        "inserted": true,
        "points": 6000 ,
        "metadataPath": "autzen-low.json"
    },
    {
        "path": "autzen-high.laz",
        "bounds": [635577.0, 848882.0, 511.0, 639004.0, 853538.0, 616.0],
        "inserted": true,
        "points": 4000,
        "metadataPath": "autzen-high.json"
    }
]

ept-sources 에 지정된 PCD 소스 파일 경로는 URL이 될 수 있다.

마무리
EPT 파일을 이용하면, 대용량 PCD를 표현하고 서비스하기 좋다. 확장성있는 구조를 가지고 있어, 다양한 스캔 분야에 활용할 수 있다.

레퍼런스

댓글 없음:

댓글 쓰기