GDAL로 나노 스케일 DEM 생성


14

아마도 조금 이상한 질문이지만, 실제 질문 전에 배경에 대한 간단한 설명을 해 드리겠습니다.

원자력 현미경 (AFM) 은 간단히 말해서 (그리고 나의 제한된 지식으로) 연구원들이 마이크로 및 나노 스케일로 영역을 스캔 할 수있게하는 방법입니다. 프로브를 사용하여 영역을 "스캔"하여 작동합니다. 나는 그것을 이해하지 못하기 때문에 설명하기가 더 어렵습니다. 내가 아는 것과 나의 호기심을 유발 한 것은 결과가 실제로 "높이"값의 "그리드"(그 시점에서 프로브의 높이를 나타내는 512x512 값의 행렬)라는 것이 었습니다.

나는 다음과 같이 생각했다 : 음, 스케일과는 별도로, 이것은 실제로 디지털 고도 모델입니다! 즉, GIS 도구로 이해되는 DEM 파일을 만들 수 있다면 GIS 분석을 적용 할 수 있습니다!

AFM- 머신이있는 실험실에서 다른 중요한 일을하고 있으며 그녀의 프로젝트 중 하나에서 사용하고 있습니다. 나는 그녀로부터 스캔 파일을 얻었고 파이썬 (struct와 numpy)을 사용 하여이 바이너리 파일을 구문 분석하고 관리했습니다. 내가 가지고있는 것은 int16 값으로 채워진 512x512 크기의 numpy 배열입니다.

다음에 계획하고있는 것과 도움이 필요한 것은 "적절한 DEM으로의 매핑"부분입니다. DEMS에 대한 지식이 있지만 실제 세대와 관련하여 나는 매우 새롭습니다.

내가 생각하는 것은 데이터를 어떤 식 으로든 지리 참조해야한다는 것입니다.이를 위해 사용자 정의 (평면) 좌표계가 필요합니다. 좌표계가 마이크로 미터 나 나노 미터를 단위로 사용할 것이라고 생각합니다. 그런 다음 AFM으로 스캔 한 영역의 크기를 찾는 것입니다 (이것은 바이너리 파일의 어딘가에 있다고 생각합니다).

업데이트 : 또한 다른 해상도에서 같은 영역에 대한 여러 스캔이 있습니다. 예를 들어 두 스캔에 대한이 정보가 있습니다.

큰 이미지 :

Scan Size: 51443.5 nm
X Offset: 0 nm
Y Offset: 0 nm

더 작은 (세부 사항) 이미지 :

Scan Size: 5907.44 nm
X Offset: 8776.47 nm
Y Offset: 1486.78 nm

내 생각에, 내 사용자 지정 좌표계는 0,0의 원점을 가져야하며 더 큰 이미지의 경우 픽셀 0,0에 좌표 값 (0,0) 및 픽셀 512,512에 좌표 값 (51443.5, 51443.5)을 할당해야합니다. ) (필요한 다른 지점에 대한 그림을 얻습니다).

그러면 더 큰 이미지는 픽셀 (0,0)을 (8776.47, 1486.78)에 (512,512)를 (8776.47 + 5907.44, 1486.78 + 5907.44)에 매핑합니다.

첫 번째 질문입니다 : 그런 좌표계에 대한 proj4 def를 어떻게 만듭니 까? 즉,이 "실제 좌표"를 사용자 지정 좌표계에 지정하는 방법 (또는 whubers 제안을 따르고 로컬 좌표계를 사용하고 단위에 대해 거짓말하는 경우 (예 : 나노 미터를 킬로미터로 처리)

그런 다음 numpy 2 차원 배열을 Georeferenced DEM 파일 형식으로 전송해야합니다. GDAL (또는 Python 바인딩)을 사용하려고했습니다.

두 번째 질문은 다음과 같습니다. "임의"데이터와 같은 지리 참조 된 DEM을 어떻게 만들 수 있습니까? 파이썬과 오픈 소스 라이브러리를 사용하는 것이 좋습니다.

나머지는 올바른 분석 도구를 사용하는 것만으로도 상당히 쉬워야합니다. 문제는이 작업이 내 자신의 호기심에 의한 것이므로 실제로 나노 스케일 DEM으로 무엇을 해야하는지 잘 모르겠습니다. 이것은 구걸

세 번째 질문 : 나노 스케일 DEM으로 무엇을해야합니까? 어떤 종류의 분석을 수행 할 수 있고, DEM 분석을위한 적절한 도구는 무엇이며, 마지막으로이 데이터에서 언덕과 등고선으로지도를 만드는 것이 가능합니까? :)

나는 모든 제안과 조언을 환영하지만 예산이나 자금이없는 엄격하게 취미 기반의 프로젝트이므로 무료 대안을 찾고 있음을 명심하십시오. 또한 이러한 AFM 기계를 판매하는 회사 인 Bruker는 일부 소프트웨어를 제공하지만이 소프트웨어를 사용하는 것은 재미가 없다는 것을 알고 있습니다.


재미 있고 흥미로운! 샘플 데이터를 게시 할 수 있습니까? 프로젝션에 나노 미터 스케일이 필요합니까? 생각하기에 약간의 "속임수"가 있지만 더 쉽게 확장 할 수 있습니다. Btw 나는 투영 문제를 여전히 해결해야하지만 GDAL / ogr로 먼 길을 갈 수 있다고 생각합니다. gdal.org/gdal_grid.html
alexanno

감사! 이것이 답변보다 더 많은 의견이라고 생각합니다. 나노 미터 스케일에 관한 한, 나는 어떤 것이 든 훌륭하지만 진정한 나노 스케일 피오 젝션이 가장 시원하다고 말할 것입니다. 샘플 데이터와 관련하여 몇 가지 제한 사항이 있는지 확인해야하지만 기본적으로 int16 값의 2 차원 행렬입니다.
atlefren

3
왜 proj4 매개 변수가 필요합니까? 이 데이터는 다른 좌표계 (예 : 지리적)로 전송되지 않습니다. Imho는 좌표계없이 모든 분석을 수행 할 수 있어야합니다. DEM은 무엇을 이해합니까? 삼각 측량 표면 (예 : 딜 로니 삼각 측량 수행) 또는 래스터 맵 (이미 가지고 있음)과 같은 여러 유형이 있습니다. 이것은 물론 분석 소프트웨어에 크게 의존합니다. 물론 프로브를 이해하기 위해 출력으로 필요한 다른 맵을 만들 수 있습니다. 곡물 분석을 위해 code.google.com/p/mtex 를 살펴볼 수 있습니다 .
mistapink 2016 년

3
CRS가 필요한 이유는 다음과 같습니다. CRS를 할당하지 않고 GeoTIFF라고 말하면 측정 단위는 픽셀이됩니다. 거리를 측정하려면 어떻게해야합니까? 그리고 두 개의 AFM 스캔이 있고 서로 어떻게 관련되어 있는지 (어떻게 스케일 및 오프셋과 관련하여) 알면 어떻게 될까요? 할당 된 CRS를 갖는 것은 한 번에 보는 여러 스캔 촉진 것
atlefren

1
나는 일반적으로 로컬 좌표계 (이미지 원점과 일치하는 원점 포함)를 설정하고 단위에 대해 "거짓말"함으로써 그러한 데이터에 대처합니다. 예를 들어, 단위가 실제로 나노 미터 인 경우 킬로미터 (km)로 지정할 수 있으므로 정신적으로 쉽게 변환 할 수 있습니다. 물론 재 투영을하지 않으므로 문제가되지 않습니다. 이 좌표계를 설정하는 것은 DEM을 지리 참조하는 것과 같습니다. 회전되지 않은 월드 파일을 만드는 것만 큼 간단 할 수 있습니다.
whuber

답변:


4

글쎄, 적어도 1 & 2 문제를 해결 한 것 같습니다. github의 전체 소스 코드 이지만 여기에 대한 설명이 있습니다.

사용자 정의 CRS의 경우 (Whubers 제안에 따라) 미터를 "치트"하고 미터를 단위로 사용하기로 결정했습니다. apatialreference.org ( SR-ORG : 6707 ) 에서 "local crs"를 찾았습니다 .

LOCAL_CS["Non-Earth (Meter)",
    LOCAL_DATUM["Local Datum",0],
    UNIT["Meter",1.0],
    AXIS["X",NORTH],
    AXIS["Y",EAST]]

파이썬과 GDAL을 사용하면 이것을 쉽게 읽을 수 있습니다.

def get_coordsys():
    #load our custom crs
    prj_text = open("coordsys.wkt", 'r').read()
    srs = osr.SpatialReference()
    if srs.ImportFromWkt(prj_text):
        raise ValueError("Error importing PRJ information" )

    return srs

또한 GDAL로 DEM을 향상시키는 것은 실제로 간단했습니다 (단일 대역 지오 틱으로 끝났습니다). parser.read_layer (0) 줄은 앞에서 설명한 512x512 매트릭스를 반환합니다.

def create_dem(afmfile, outfile):

    #parse the afm data
    parser = AFMParser(afmfile)

    #flip to account for the fact that the matrix is top-left, but gdal is bottom-left
    data = flipud(parser.read_layer(0))

    driver = gdal.GetDriverByName("GTiff")
    dst_ds = driver.Create(
        outfile,
        data.shape[1],
        data.shape[0],
        1 ,
        gdal.GDT_Int16 ,
    )

    dst_ds.SetGeoTransform(get_transform(parser, data))
    dst_ds.SetProjection(get_coordsys().ExportToWkt())
    dst_ds.GetRasterBand(1).WriteArray(data)
    dst_ds = None

triockiest 부분은 내 파일을 올바르게 "지리 참조"하는 방법을 알아 내고 SetGeoTransform 을 사용 하여 매개 변수 를 얻었 습니다 .

def get_transform(parser, data):
    #calculate dims
    scan_size, x_offset, y_offset = parser.get_size()
    x_size = data.shape[0]
    y_size = data.shape[1]
    x_res = scan_size / x_size
    y_res = scan_size / y_size

    #set the transform (offsets doesn't seem to work the way I think)
    #top left x, w-e pixel resolution, rotation, 0 if image is "north up", top left y, rotation, 0 if image is "north up", n-s pixel resolution
    return [0, x_res, 0, 0, 0, y_res]

이 마지막 부분은 아마도 내가 가장 확신하지 못하는 부분 일 것입니다. 실제로 찾고 있던 것은 * gdal_transform -ullr * 줄이지 만 프로그래밍 방식 으로이 작업을 수행 할 수있는 방법을 찾지 못했습니다.

Qgis에서 GeoTIFF를 열어서 볼 수 있지만 (Bruker 프로그램의 결과와 시각적으로 비교할 수는 있지만) 실제로 3 번 질문에 대한 답변은하지 않았습니다. 이 데이터로해야 할 일. 그래서, 나는 제안을 위해 열려 있습니다!


흥미로운 도전 과제 중 하나는 DEM의 거리와 지구상의 거리를 비교하여 시청자에게 나노 크기가 얼마나 작은 지에 대한 아이디어를 제공하는 것입니다. 예 : htwins.net/scale2
blah238
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.