使用GDAL创建纳米DEM


14

也许是一个奇怪的问题,但是在我提出实际问题之前,让我先简单介绍一下背景知识:

简而言之(据我所知),原子力显微镜(AFM)使研究人员可以在微米和纳米级扫描区域。它通过使用各种探针“扫描”区域来工作。由于我对此没有真正的了解,因此我难以解释的更多内容。我所知道的,引起我好奇的是,结果实际上是“高度”值的“网格”(一个512x512值的矩阵,描述了该点的高度)。

然后我想:好吧,除了比例尺,这实际上是一个数字高程模型!而且,这意味着,如果我可以设法创建GIS工具所理解的DEM文件,则可以对其应用GIS分析!

实际上,我的其他重要工作是在拥有AFM机器的实验室中进行的,并且正在她的一个项目中使用它。我从她那里得到了一些扫描文件,并使用Python(struct和numpy)进行了管理,以解析这些二进制文件,而我现在得到的是一个numpy数组,大小为512x512,填充有int16值。

我下一步要计划的是什么,而我需要帮助的是“映射到适当的DEM”部分。我对DEMS有一些了解,但是当涉及到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?即:如何将这些“现实世界的坐标”分配给我的自定义坐标系统(或者,如果我遵循野蛮人的建议并使用局部坐标系统并围绕单位说谎(即,将纳米视为千米)

然后,我必须将我的numpy二维数组转换为地理参考DEM文件格式。我当时在考虑使用GDAL(或更确切地说是Python绑定)。

然后,第二个问题是:如何从诸如我的“任意”数据创建地理参考DEM?最好在Python中使用开放源代码库。

剩下的就应该相当容易了,只是使用正确的分析工具即可。问题是,这项任务是由我自己的好奇心驱动的,因此我不确定我应该对纳米级DEM实际做什么。这乞求

第三个问题:如何处理纳米DEM?可以进行什么样的分析,什么是进行DEM分析的合适工具,最后:根据该数据制作具有山体阴影和轮廓线的地图是否可行?

我欢迎所有建议和指示,但是请记住,我正在寻找免费替代方法,因为这是一个严格的基于兴趣的项目,没有预算或资金(而且我无法使用任何许可的GIS应用程序)。此外,我确实知道出售这些AFM机器的公司Bruker会提供一些软件,但是使用它不会很有趣。


有趣又有趣!您可以发布一些样本数据吗?投影上有纳米级的要求吗?尽管可能有点“作弊”,但认为可能更容易扩大规模。顺便说一句,我想您可以在GDAL / ogr方面走很长一段路,尽管仍然需要解决投影问题。gdal.org/gdal_grid.html
alexanno

谢谢!猜想这更多是评论而不是答案。就纳米尺度而言,我想说什么都行得通,但真正的纳米尺度将是最酷的。当涉及到样本数据时,我将不得不检查是否存在一些限制,但这基本上是一个由int16值组成的2暗矩阵。
atlefren

3
为什么需要proj4参数?您不会将此数据传输到另一个坐标系(尤其是地理坐标系)中。恕我直言,您应该能够在没有任何坐标系的情况下进行所有分析。您对DEM有什么了解?有几种类型,例如三角化的曲面(例如进行delauny三角剖分)或栅格地图(您已经拥有了)。当然,这在很大程度上取决于分析软件。当然,如果需要使用其他地图作为理解探针的输出,则可以创建其他地图。您可以查看code.google.com/p/mtex进行谷物分析。
mistapink

3
我(认为)我需要CRS的原因是:如果我只是创建一个GeoTIFF而未分配CRS,则度量单位将是像素。如果我要测量距离怎么办?而且,如果我进行了两次AFM扫描并且知道它们如何相互关联(就比例尺和某个点的偏移而言),该怎么办。分配了CRS将有助于一次查看多个扫描
atlefren 2013年

1
我通常通过设置局部坐标系(其原点与图像原点重合)并围绕这些单位“说谎”来处理此类数据。例如,您可以规定单位实际上是纳米时为千米,这使得在精神上来回转换变得容易。当然,您不会进行任何重新投影,所以这不是问题。设置此坐标系与对任何DEM进行地理配准相同;它可以像创建未旋转的世界文件一样简单。
Whuber

Answers:


4

好吧,看来我至少解决了问题1和2。完整的源代码位于github,但这里有一些解释:

对于定制的CRS,我决定(根据Whubers的建议)“作弊”并使用仪表作为单位。我在apatialreference.org(SR-ORG:6707)中找到了一个“本地crs” :

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

此外,使用GDAL扩展DEM实际上非常简单(我最终获得了单波段geo-tiff)。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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.