Tạo DEM kích thước nano với GDAL


14

Một chút câu hỏi kỳ lạ có lẽ, nhưng hãy để tôi cung cấp cho bạn một lời giải thích ngắn gọn về nền tảng trước câu hỏi thực tế của tôi:

Kính hiển vi lực nguyên tử (AFM) là một phương pháp mà nói ngắn gọn (và theo hiểu biết hạn chế của tôi) cho phép các nhà nghiên cứu quét các khu vực ở cấp độ vi mô và nano. Nó hoạt động bằng cách "quét" một khu vực bằng cách sử dụng đầu dò các loại. Nhiều hơn đó là khó khăn cho tôi để giải thích, vì tôi không có hiểu biết thực sự về nó. Những gì tôi biết, và điều gây ra sự tò mò của tôi là kết quả thực tế là một "lưới" các giá trị "chiều cao" (một ma trận nói các giá trị 512x512 mô tả chiều cao của đầu dò tại điểm đó).

Sau đó tôi nghĩ: Chà, ngoài quy mô, trên thực tế đây là một mô hình độ cao kỹ thuật số! Và, điều này có nghĩa là nếu tôi có thể quản lý để tạo tệp DEM theo cách hiểu của các công cụ GIS, tôi có thể áp dụng phân tích GIS cho nó!

Như vậy, ý nghĩa khác của tôi là làm việc tại một phòng thí nghiệm có máy AFM và đang sử dụng nó trong một trong các dự án của cô ấy. Tôi đã nhận được một số tệp quét từ cô ấy và đã quản lý, sử dụng Python (struct và numpy), để phân tích các tệp nhị phân này và cái tôi có bây giờ là một mảng có kích thước 512x512 chứa đầy giá trị int16.

Điều tôi dự định tiếp theo, và điều tôi cần giúp đỡ là "ánh xạ tới một DEM thích hợp". Tôi có một số kiến ​​thức về DEMS, nhưng khi nói đến thế hệ thực tế của chúng, tôi khá mới.

Điều tôi đang nghĩ là tôi phải định vị dữ liệu của mình theo một cách nào đó và để làm được điều này, tôi cần một hệ tọa độ (mặt phẳng) tùy chỉnh. Tôi hình dung hệ thống tọa độ của mình sẽ sử dụng micro-hoặc nano mét làm đơn vị. Sau đó, vấn đề chỉ là tìm kích thước của khu vực được quét bằng AFM (điều này tôi tin là ở đâu đó trong tệp nhị phân, giả sử điều này đã biết).

cập nhật : Tôi cũng có một số lần quét ở các độ phân giải khác nhau, nhưng trong cùng một khu vực. Ví dụ tôi có thông tin này về hai lần quét:

hình ảnh lớn hơn:

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

hình ảnh nhỏ hơn (chi tiết):

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

Điều tôi nghĩ là hệ thống tọa độ tùy chỉnh của tôi phải có gốc tọa độ 0,0 và đối với hình ảnh lớn hơn tôi cam gán pixel 0,0 giá trị tọa độ của (0,0) và pixel 512,512 giá trị tọa độ (51443,5, 51443,5 ) (Đoán bạn có được hình ảnh cho các điểm khác cần thiết).

Sau đó, hình ảnh lớn hơn sẽ ánh xạ pixel (0,0) thành (8776,47, 1486,78) và (512,512) thành (8776,47 + 5907,44, 1486,78 + 5907,44)

Câu hỏi thứ nhất là : Làm thế nào để tôi tạo một proj4 def cho một hệ tọa độ như vậy? Tức là: làm cách nào để gán các "tọa độ trong thế giới thực" này cho hệ tọa độ tùy chỉnh của tôi (hoặc, nếu tôi làm theo gợi ý của người sử dụng và sử dụng hệ tọa độ cục bộ và nói dối về các đơn vị (ví dụ: nanomet của tôi là km)

Sau đó, tôi phải chuyển Mảng 2 chiều lộn xộn của mình sang định dạng tệp DEM Georeferenced. Tôi đã nghĩ đến việc sử dụng GDAL (hay, đúng hơn là các ràng buộc Python).

Câu hỏi thứ hai là : Làm thế nào để tôi tạo một DEM tham chiếu địa lý từ dữ liệu "tùy ý" như của tôi? Tốt nhất là trong Python và sử dụng các thư viện nguồn mở.

Phần còn lại sau đó sẽ khá dễ dàng, chỉ là vấn đề sử dụng các công cụ phân tích phù hợp. Vấn đề là, nhiệm vụ này được thúc đẩy bởi sự tò mò của chính tôi, vì vậy tôi không chắc chắn những gì tôi thực sự nên làm với một DEM có kích thước nano. Điều này cầu xin

Câu hỏi thứ 3 : Phải làm gì với DEM có kích thước nano? Loại phân tích nào có thể được thực hiện, các công cụ thích hợp để phân tích DEM là gì và cuối cùng: có khả thi để tạo một bản đồ với các đường đồi và đường viền từ dữ liệu này không? :)

Tôi hoan nghênh tất cả các đề xuất và gợi ý, nhưng hãy nhớ rằng tôi đang tìm kiếm các lựa chọn thay thế miễn phí, vì đây là một dự án hoàn toàn dựa trên sở thích không có ngân sách hoặc tài trợ (và tôi không có quyền truy cập vào bất kỳ ứng dụng GIS nào bị cấm). Ngoài ra, tôi biết rằng Bruker, công ty bán các máy AFM này, cung cấp một số phần mềm, nhưng sử dụng nó sẽ không vui chút nào.


Vui và thú vị! Bạn có thể gửi một số dữ liệu mẫu? Đây có phải là một yêu cầu để có một thang đo nanomet trên hình chiếu? Suy nghĩ có thể dễ dàng mở rộng quy mô hơn, mặc dù nó "gian lận" một chút. Btw Tôi đoán bạn có thể đi một chặng đường dài với GDAL / ogr, mặc dù vấn đề trình chiếu vẫn sẽ cần được giải quyết. gdal.org/gdal_grid.html
alexanno

Cảm ơn! Đoán đây là một nhận xét nhiều hơn là một câu trả lời. Theo như quy mô nanomet, tôi muốn nói rằng bất cứ thứ gì hoạt động đều tuyệt vời, nhưng một sự phóng xạ nano thực sự sẽ là tuyệt vời nhất. Khi nói đến dữ liệu mẫu, tôi sẽ phải kiểm tra xem có một số hạn chế hay không, nhưng về cơ bản, đó là một ma trận 2 mờ của các giá trị int16.
atlefren

3
Tại sao bạn cần tham số proj4? Bạn sẽ không chuyển dữ liệu này sang hệ thống tọa độ khác (đặc biệt là địa lý). Imho bạn sẽ có thể thực hiện tất cả các phân tích của bạn mà không cần bất kỳ hệ thống tọa độ. Bạn hiểu gì về một DEM? Có một số loại như bề mặt tam giác (ví dụ: thực hiện tam giác delauny) hoặc bản đồ raster (bạn đã có cái này rồi). Điều này tất nhiên phụ thuộc nhiều vào phần mềm phân tích. Tất nhiên bạn có thể tạo các bản đồ khác nếu chúng là đầu ra để hiểu đầu dò. Bạn có thể xem code.google.com/p/mtex để tìm hạt anlysis.
Mistapink

3
Lý do tôi (nghĩ) tôi cần CRS là vì: nếu tôi chỉ tạo, giả sử GeoTIFF mà không gán CRS, đơn vị đo sẽ là pixel. Nếu tôi muốn đo khoảng cách thì sao? Và, điều gì sẽ xảy ra nếu tôi có hai lần quét AFM và biết chúng liên quan với nhau như thế nào (về quy mô và độ lệch từ một số điểm). Có CRS được chỉ định sẽ tạo điều kiện cho việc xem nhiều lần quét cùng một lúc
atlefren

1
Tôi thường đối phó với dữ liệu đó bằng cách đặt một hệ tọa độ cục bộ (với sự trùng khớp gốc với nguồn gốc hình ảnh) và "nói dối" về các đơn vị. Ví dụ, bạn có thể quy định rằng các đơn vị là km khi chúng thực sự là nanomet, điều này giúp dễ dàng chuyển đổi qua lại về mặt tinh thần. Tất nhiên bạn sẽ không thực hiện bất kỳ lời từ chối nào, vì vậy đó không phải là vấn đề. Thiết lập hệ tọa độ này giống như hội thảo địa lý bất kỳ DEM nào; nó có thể đơn giản như việc tạo một tệp thế giới không được bảo vệ.
ai

Câu trả lời:


4

Chà, có vẻ như tôi đã giải quyết vấn đề 1 & 2 ít nhất. Mã nguồn đầy đủ tại github , nhưng một số giải thích ở đây:

Đối với một CRS tùy chỉnh, tôi đã quyết định (theo gợi ý của Whubers) để "gian lận" và sử dụng đồng hồ làm đơn vị. Tôi đã tìm thấy một "crs địa phương" tại apatialreference.org ( SR-ORG: 6707 ):

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

Sử dụng Python và GDAL, điều này khá dễ đọc:

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

Ngoài ra, việc tạo ra một DEM với GDAL thực sự khá đơn giản (tôi đã kết thúc với một địa lý băng tần đơn). Dòng Parser.read_layer (0) trả về ma trận 512x512 được mô tả trước đây của tôi.

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

Phần triockiest là tìm ra cách "georeference" đúng cách cho tập tin của tôi, cuối cùng tôi đã sử dụng SetGeoTransform , nhận các tham số như vậy:

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]

Phần cuối cùng này có lẽ là phần tôi không chắc chắn nhất, điều tôi thực sự đang tìm kiếm là một dòng nào đó * gdal_transform -ullr *, nhưng tôi không thể tìm cách làm điều này theo chương trình.

Tôi có thể mở GeoTIFF của mình trong Qgis và xem nó (và so sánh trực quan với kết quả từ chương trình Bruker có vẻ đúng), nhưng tôi chưa thực sự trả lời câu hỏi 3 của mình; Phải làm gì với dữ liệu này. Vì vậy, ở đây tôi mở cho các đề xuất!


Một thách thức thú vị có thể là so sánh khoảng cách trên DEM với khoảng cách giữa các địa điểm trên toàn cầu để cung cấp cho người xem ý tưởng về mức độ nano nhỏ. Ví dụ: htwins.net/scale2
blah238
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.