Створення нанорозмірних DEM за допомогою GDAL


14

Можливо, трохи дивного запитання, але дозвольте дати коротке пояснення передумови перед моїми актуальними питаннями:

Атомно-силова мікроскопія (AFM) - це метод, який, коротко кажучи (і наскільки мені відомо), дозволяє дослідникам сканувати ділянки на мікро- та нанорозмірних системах. Це працює за допомогою "сканування" області за допомогою сортування зондів. Більше того мені важко пояснити, оскільки я не маю цього реального розуміння. Що я знаю, і що викликало мою цікавість, це те, що насправді результат є "сіткою" значень "висоти" (матриця значень 512x512, що описує висоту зонда в цій точці).

Тоді я подумав: ну, крім масштабу, це насправді цифрова модель висоти! А це означає, що якщо мені вдасться створити файл DEM, як він розуміється під інструментами GIS, я можу застосувати до нього аналіз GIS!

Як це є, моя значна частина інших працює в лабораторії, яка має AFM-машину, і використовує її в одному зі своїх проектів. Я отримав від неї декілька файлів сканування і встиг за допомогою Python (структура та numpy) проаналізувати ці бінарні файли, і тепер у мене є масивний масив розміром 512x512, заповнений значеннями int16.

Що я планую далі, і для чого мені потрібна допомога, це "відображення належної 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 для такої системи координат? Тобто: як я призначу ці "координати реального світу" моїй спеціальній системі координат (або, якщо я дотримуюсь пропозицій про камери та використовую локальну систему координат і брешу про одиниці (тобто розглядаю мої нанометри як кілометри)

Тоді я повинен перенести свій нумерований двовимірний масив у формат файлу Georeferenced DEM. Я думав використовувати GDAL (а точніше, прив'язки Python).

Тоді друге питання : Як створити геореференційну DEM з "довільних" даних, таких як моя? Переважно в Python та з використанням бібліотек з відкритим кодом.

Решта повинна бути досить простою, лише питання використання правильних інструментів аналізу. Проблема полягає в тому, що це завдання визначається моєю власною цікавістю, тому я не зовсім впевнений, що я насправді повинен робити з нанорозмірною DEM. Це напрошується

3-е питання : Що робити з нанорозмірною DEM? Який аналіз можна зробити, які підходящі інструменти для аналізу DEM і нарешті: чи можливо з цих даних зробити карту із загір'ями та контурними лініями? :)

Я вітаю всі пропозиції та вказівки, але майте на увазі, що я шукаю безкоштовні альтернативи, оскільки це суворо орієнтований на хобі проект, який не має бюджету чи фінансування (і не маю доступу до жодних опублікованих GIS-додатків). Крім того, я знаю, що Bruker, компанія, що продає ці машини AFM, постачає якесь програмне забезпечення, але використовувати це не було б весело.


Весело та цікаво! Чи можете ви розмістити деякі зразкові дані? Чи є вимога мати нанометрову шкалу на проекції? Подумавши, можливо, простіше масштабувати, хоча це трохи "обманює". До речі, я думаю, ви можете пройти довгий шлях з GDAL / ogr, хоча проблему прогнозування все ж потрібно буде вирішити. gdal.org/gdal_grid.html
alexanno

Спасибі! Здогадайтесь, це скоріше коментар, ніж відповідь. Що стосується нанометрової шкали, я б сказав, що все, що працює, є чудовим, але справжній нанорозмірний пеоекція був би найкрутішим. Що стосується зразкових даних, то мені доведеться перевірити, чи є якісь обмеження, але це в основному 2-х димна матриця значень int16.
атлефрен

3
Навіщо вам потрібні параметри proj4? Ви не перенесете ці дані в іншу систему координат (особливо географічну). Імхо, ви повинні мати можливість робити весь аналіз без будь-якої системи координат. Що ви розумієте під DEM? Існує декілька типів, таких як трикутна поверхня (наприклад, робіть тривалість зворотної триангуляції) або растрові карти (у вас це вже є). Це, звичайно, дуже залежить від програмного забезпечення для аналізу. Звичайно, ви можете створити інші карти, якщо вони потрібні як вихід для розуміння зонда. Ви можете подивитися code.google.com/p/mtex для аналізу зерна.
помилково

3
Причиною, що мені здається, що мені потрібна CRS, є така: якщо я просто створюю, скажімо GeoTIFF, не призначаючи CRS, одиницею виміру будуть пікселі. Що робити, якщо я хочу виміряти відстані? А що робити, якщо у мене є два сканування AFM і я знаю, як вони співвідносяться один з одним (з точки зору масштабу та зміщення від певної точки). Призначення CRS сприяло б перегляду декількох сканів одночасно
atlefren

1
Зазвичай я справляюся з такими даними, встановивши локальну систему координат (з початком, що збігається з початком зображення) і "брешу" про одиниці. Наприклад, ви можете встановити, що одиниці - це кілометри, коли вони дійсно є нанометрами, що полегшує подумки перетворення назад і назад. Звичайно, ви не будете робити повторного спроектування, тому це не проблема. Налаштування цієї системи координат те саме, що геореференція будь-якої DEM; це може бути настільки ж просто, як створити неробований світовий файл.
whuber

Відповіді:


4

Ну, схоже, я вирішив проблеми 1 і 2 принаймні. Повний вихідний код у github , але деякі пояснення тут:

Для спеціальної CRS я вирішив (за пропозицією Whubers) "обдурити" і використовувати лічильники як одиницю. Я знайшов "локальний crs" на 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]]

За допомогою Python та 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

Крім того, велике значення DEM з GDAL було насправді просте (я закінчився однодіапазонним гео-тифом). Рядок 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

Тріокісткіша частина з'ясовувала, як правильно "геореферувати" мій файл, і в кінцевому підсумку використовую 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 *, але я не міг знайти способу зробити це програмно.

Я в змозі відкрити свій GeoTIFF в Qgis і переглянути його (і візуально порівнювати його з результатом програми Bruker, що це виглядає правильно), але я не дуже відповів на моє запитання 3; що робити з цими даними. Отже, тут я відкритий для пропозицій!


Одним із цікавих завдань може бути порівняння відстаней на DEM та відстані між місцями на земній кулі, щоб дати глядачам уявлення про те, наскільки маленький нанорозмір. Напр. Htwins.net/scale2
blah238
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.