GDAL ile nano ölçekli DEM oluşturma


14

Belki biraz garip bir soru, ama gerçek sorularımdan önce size arka plan hakkında bir açıklama vereyim:

Atomik kuvvet mikroskopisi (AFM) kısaca (ve sınırlı bilgime göre) araştırmacıların mikro ve nano ölçekli alanları taramasına izin veren bir yöntemdir. Bir alanı bir çeşit prob kullanarak "tarayarak" çalışır. Daha fazla açıklamak benim için zor, çünkü gerçek bir anlayışım yok. Bildiğim ve merakımı tetikleyen şey, sonucun aslında "yükseklik" değerlerinden oluşan bir "ızgara" olmasıydı (o noktada probun yüksekliğini açıklayan 512x512 değerlerden oluşan bir matris).

Sonra düşündüm: Şey, ölçek dışında, bu aslında bir dijital yükseklik modeli! Ve bu, GIS araçları tarafından anlaşıldığı gibi bir DEM dosyası oluşturmayı başarabilirsem CBS analizini ona uygulayabileceğim anlamına gelir!

Olduğu gibi, diğer önemli noktam AFM makinesine sahip bir laboratuvarda çalışıyor ve projelerinden birinde kullanıyor. Ben ondan bazı tarama dosyaları var ve bu ikili dosyaları ayrıştırmak için Python (struct ve numpy) kullanarak ve şimdi var ne int16-değerleri ile dolu 512x512 boyutunda bir numpy dizi başardık.

Şimdi ne planlıyorum ve biraz yardıma ihtiyacım var "uygun bir DEM eşleme" bölüm. DEMS hakkında biraz bilgim var, ancak bunların gerçek nesli söz konusu olduğunda oldukça yeniyim.

Düşündüğüm, verilerimi bir şekilde jeoreferans yapmak zorunda olduğum ve bunun için özel (düzlemsel) bir koordinat sistemine ihtiyacım var. Koordinat sistemimin birim olarak mikro veya nano-metre kullanacağını düşünüyorum. O zaman sadece AFM ile taranan alanın boyutunu bulma meselesidir (bu ikili dosyada bir yerde olduğuna inanıyorum, bunu biliyoruz.

güncelleme : Farklı çözünürlüklerde, ancak aynı alanda birkaç taramam var. Örneğin, iki tarama hakkında bu bilgilere sahibim:

büyük resim:

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

daha küçük (ayrıntılı) resim:

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

Benim 'düşünce', özel koordinat sistemimin 0,05 menşeine sahip olması ve daha büyük görüntü I cam piksel 0,0 değerini (0,0) koordinat değerini ve 512,512 piksel koordinat değerini (51443,5, 51443,5) atamasıdır. ) (Sanırım gerekli diğer noktalar için resim olsun).

Daha sonra, daha büyük resim piksel (0,0) ile (8776,47, 1486,78) ve (512,512) ile (8776,47 + 5907,44, 1486,78 + 5907,44) eşlenir.

1. Soru şu : Böyle bir koordinat sistemi için nasıl proj4 def oluşturabilirim? Yani: bu "gerçek dünya koordinatlarını" özel koordinat sistemime nasıl atayabilirim (ya da eğer fıkra önerisini takip edip yerel bir koordinat sistemi kullanarak ve birimler hakkında yalan söylersem (yani nanometrelerime kilometre olarak davranırsam)

Sonra benim numpy 2 boyutlu Array Georeferenced DEM dosya formatına aktarmak zorunda. GDAL (veya daha ziyade Python bağları) kullanmayı düşünüyordum.

2. Soru şu : Benimki gibi "keyfi" verilerden nasıl coğrafi referanslı bir DEM oluşturabilirim? Tercihen Python'da ve açık kaynak kütüphaneleri kullanmak.

O zaman gerisi oldukça kolay olmalı, sadece doğru analiz araçlarını kullanma meselesi. Sorun şu ki, bu görev kendi merakımdan kaynaklanıyor, bu yüzden nano ölçekli bir DEM ile gerçekten ne yapmam gerektiğinden emin değilim. Bu yalvarır

3. soru : Nano ölçekli bir DEM ile ne yapmalı? Ne tür analizler yapılabilir, DEM analizi için uygun araçlar nelerdir ve nihayet: bu verilerden yamaç çizgisi ve kontur çizgileri ile bir harita yapmak mümkün müdür? :)

Tüm önerileri ve göstergeleri memnuniyetle karşılıyorum, ancak ücretsiz alternatifler aradığımı aklınızda bulundurun, çünkü bu bütçe veya fon içermeyen kesinlikle hobi tabanlı bir proje (ve herhangi bir lisanslı GIS başvurusuna erişimim yok). Ayrıca, bu AFM makinelerini satan şirket olan Bruker'in bazı yazılımlar gönderdiğini biliyorum, ancak bunu kullanmak hiç de eğlenceli olmayacak.


Eğlenceli ve ilgi çekici! Bazı örnek veriler gönderebilir misiniz? Projeksiyonda nanometre ölçeği olması şart mıdır? Düşünmek belki biraz "hile" olsa da, ölçek büyütmek daha kolaydır. Ancak, projeksiyon sorununun hala ele alınması gerekmesine rağmen, GDAL / ogr ile uzun bir yol kat edebileceğinizi tahmin ediyorum. gdal.org/gdal_grid.html
alexanno

Teşekkürler! Sanırım bu bir cevaptan çok bir yorum. Nanometre ölçeğine göre, işe yarayan her şeyin harika olduğunu söyleyebilirim, ancak gerçek bir nano ölçekli peojeksiyon en havalı olurdu. Örnek veriler söz konusu olduğunda, bazı kısıtlamalar olup olmadığını kontrol etmem gerekecek, ancak temel olarak int16 değerlerinin 2 dim matrisidir.
atlefren

3
Neden proj4 parametrelerine ihtiyacınız var? Bu verileri başka bir koordinat sistemine (özellikle coğrafi) aktarmazsınız. Tüm analizlerinizi herhangi bir koordinat sistemi olmadan yapabilmeniz gerekir. Bir DEM tarafından ne anlıyorsunuz? Üçgensel yüzeyler (örneğin bir gecikme üçgenlemesi yapın) veya raster haritaları (buna zaten sahipsiniz) gibi çeşitli türler vardır. Bu elbette büyük oranda analiz yazılımına bağlıdır. Elbette, probu anlamak için çıktı olarak ihtiyaç duyulursa başka haritalar da oluşturabilirsiniz. Tahıl analizi için code.google.com/p/mtex adresine bakabilirsiniz .
13'te

3
I (düşünüyorum) i bir CRS gerek nedeni: ben sadece oluşturmak, bir CRS atamadan bir GeoTIFF demek, ölçü birimi piksel olacaktır. Mesafeleri ölçmek istersem ne olur? Ve iki AFM taramam varsa ve birbirleriyle nasıl ilişkilendiklerini biliyorsam (ölçek ve ofset açısından). Bir CRS atanması aynı anda birkaç
taramayı

1
Genellikle bu tür verilerle (görüntü kökeni ile çakışan bir kökene sahip) yerel bir koordinat sistemi kurarak ve birimler hakkında "yalan söyleyerek" başa çıkarım. Örneğin, birimlerin gerçekten nanometre olduklarında kilometre olduklarını belirtebilirsiniz, bu da zihinsel olarak ileri geri dönüşü kolaylaştırır. Tabii ki herhangi bir yeniden enjeksiyon yapmayacaksınız, bu yüzden bu bir sorun değil. Bu koordinat sisteminin kurulması, herhangi bir DEM'in coğrafi referansı ile aynıdır; döndürülmemiş bir dünya dosyası oluşturmak kadar basit olabilir.
whuber

Yanıtlar:


4

Görünüşe göre en azından 1 ve 2 problemlerini çözdüm. Github'da tam kaynak kodu , ancak burada bazı açıklamalar:

Özel bir CRS için (Whubers önerisi uyarınca) "aldatmaya" ve sayaçları birim olarak kullanmaya karar verdim. Apatialreference.org'da bir "yerel crs" buldum ( SR-ORG: 6707 ):

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

Python ve GDAL kullanarak bunu okumak oldukça kolaydır:

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

Ayrıca, bir DEM'i GDAL ile büyütmek aslında oldukça basitti (tek bantlı bir coğrafi tiff ile sonuçlandım). Parser.read_layer (0) satırı daha önce tarif ettiğim 512x512 matrisimi döndürüyor.

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 bölümü düzgün benim dosya "georeference" nasıl anlamaya oldu, ben parametreleri almak gibi SetGeoTransform kullanarak sona erdi :

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]

Bu son bölüm muhtemelen en emin olduğum bölüm, gerçekten aradığım şey çizgi * gdal_transform -ullr *, ama bunu programlı olarak yapmanın bir yolunu bulamadım.

GeoTIFF'imi Qgis'te açıp görüntüleyebiliyorum (ve görsel olarak Bruker programının sonucuyla doğru görünüyor) karşılaştırıyorum, ancak 3. soruma gerçekten cevap vermedim; bu verilerle ne yapılacağı. Burada önerilere açığım!


İlginç bir zorluk, görüntüleyenlere nano ölçeğin ne kadar küçük olduğu hakkında bir fikir vermek için DEM'deki mesafeleri dünyadaki yerler arasındaki mesafelerle karşılaştırmak olabilir. Örneğin, htwins.net/scale2
blah238 4:13
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.