สร้าง DEM ระดับนาโนด้วย GDAL


14

อาจมีคำถามแปลก ๆ เล็กน้อย แต่ขอให้ฉันให้คำอธิบายพื้นหลังแก่คุณก่อนคำถามจริงของฉัน:

กล้องจุลทรรศน์แรงอะตอม (AFM)เป็นวิธีการที่ในระยะสั้น (และความรู้ จำกัด ของฉัน) ช่วยให้นักวิจัยสแกนพื้นที่ที่ไมโครและระดับนาโน มันทำงานโดย "สแกน" พื้นที่โดยใช้โพรบที่แปลก ๆ ยิ่งยากที่จะอธิบายเพราะฉันไม่มีความเข้าใจที่แท้จริง สิ่งที่ฉันรู้และสิ่งที่กระตุ้นความอยากรู้ของฉันก็คือผลลัพธ์ที่ได้คือค่า "กริด" ของ "ความสูง" (เมทริกซ์ของค่า 512x512 ที่อธิบายความสูงของโพรบ ณ จุดนั้น)

ฉันคิดว่า: นอกเหนือจากสเกลแล้วนี่เป็นแบบจำลองระดับความสูงแบบดิจิตอล! และนี่หมายความว่าถ้าฉันสามารถจัดการเพื่อสร้างไฟล์ DEM ตามที่เข้าใจโดยเครื่องมือ GIS ฉันสามารถใช้การวิเคราะห์ GIS กับมันได้!

ความสำคัญของฉันคืองานอื่น ๆ ในห้องแล็บที่มีเครื่อง AFM และใช้มันในโครงการหนึ่งของเธอ ฉันได้รับไฟล์สแกนจากเธอและมีการจัดการโดยใช้ Python (struct และ numpy) เพื่อแยกวิเคราะห์ไฟล์ไบนารีเหล่านี้และสิ่งที่ฉันมีตอนนี้คืออาร์เรย์ขนาด 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)

คำถามที่ 1 คือ : ฉันจะสร้าง proj4 def สำหรับระบบพิกัดได้อย่างไร Ie: ฉันจะกำหนด "พิกัดโลกแห่งความจริง" เหล่านี้ให้กับระบบพิกัดที่กำหนดเองของฉันได้อย่างไร (หรือถ้าฉันทำตามคำแนะนำของ whubers และการใช้ระบบพิกัดท้องถิ่นและการโกหกเกี่ยวกับหน่วย (เช่นการรักษานาโนเมตรเป็นกิโลเมตร)

จากนั้นฉันต้องถ่ายโอนอาเรย์ 2 มิติแบบ numpy ไปเป็นรูปแบบไฟล์ DEM ของ Georeferenced ฉันคิดว่าจะใช้ GDAL (หรือค่อนข้างผูก Python)

คำถามที่ 2 คือฉันจะสร้าง DEM ที่อ้างอิงทางภูมิศาสตร์จากข้อมูล "โดยพลการ" เช่นของฉันได้อย่างไร โดยเฉพาะอย่างยิ่งใน Python และใช้ไลบรารีโอเพ่นซอร์ส

ส่วนที่เหลือควรจะค่อนข้างง่ายเพียงแค่ใช้เครื่องมือการวิเคราะห์ที่ถูกต้อง ปัญหาคืองานนี้ขับเคลื่อนด้วยความอยากรู้ของฉันดังนั้นฉันไม่แน่ใจว่าสิ่งที่ฉันควรทำกับ DEM ระดับนาโน สิ่งนี้ขอให้

คำถามที่ 3 : ทำอย่างไรกับ DEM ระดับนาโน การวิเคราะห์ประเภทใดที่สามารถทำได้เครื่องมือที่เหมาะสมสำหรับการวิเคราะห์ DEM คืออะไรและในที่สุด: เป็นไปได้ไหมที่จะสร้างแผนที่ที่มีแนวฮิลเดเคดและเส้นชั้นความสูงจากข้อมูลนี้ :)

ฉันยินดีรับข้อเสนอแนะและตัวชี้ทั้งหมด แต่โปรดจำไว้ว่าฉันกำลังมองหาทางเลือกฟรีเนื่องจากเป็นโครงการที่เน้นงานอดิเรกอย่างเคร่งครัดโดยไม่มีงบประมาณหรือเงินทุน นอกจากนี้ฉันรู้ว่า Bruker บริษัท ที่ขายเครื่อง AFM เหล่านี้จัดส่งซอฟต์แวร์บางอย่าง แต่ใช้งานที่จะไม่สนุก


สนุกและน่าสนใจ! คุณสามารถโพสต์ข้อมูลตัวอย่างบางส่วนได้หรือไม่ จำเป็นต้องมีมาตราส่วนนาโนเมตรในการฉายภาพหรือไม่? คิดว่าอาจจะง่ายกว่าที่จะขยายขนาดแม้ว่ามันจะ "โกง" เล็กน้อย Btw ฉันคิดว่าคุณสามารถมาทางไกลกับ GDAL / ogr แม้ว่าปัญหาการฉายจะยังคงต้องได้รับการแก้ไข gdal.org/gdal_grid.html
alexanno

ขอบคุณ! เดาว่านี่เป็นความคิดเห็นมากกว่าคำตอบ เท่าที่ระดับนาโนเมตรเป็นไปฉันก็บอกได้ว่างานอะไรก็ตามที่ยอดเยี่ยม แต่การศึกษาระดับปริญญาที่แท้จริงจะเป็นสิ่งที่ยอดเยี่ยมที่สุด เมื่อมาถึงข้อมูลตัวอย่างฉันจะต้องตรวจสอบว่ามีข้อ จำกัด บางอย่างหรือไม่ แต่โดยทั่วไปแล้วมันคือเมทริกซ์ 2 มิติของค่า int16
atlefren

3
ทำไมคุณต้องมีพารามิเตอร์ proj4 คุณจะไม่ถ่ายโอนข้อมูลนี้ไปยังระบบพิกัดอื่น (โดยเฉพาะทางภูมิศาสตร์) ฉันควรจะทำการวิเคราะห์ทั้งหมดของคุณโดยไม่มีระบบพิกัดใด ๆ คุณเข้าใจอะไรจาก DEM มีหลายประเภทเช่นพื้นผิวสามเหลี่ยม (เช่นทำสามเหลี่ยม delauny) หรือแผนที่แรสเตอร์ (คุณมีสิ่งนี้อยู่แล้ว) หลักสูตรนี้ขึ้นอยู่กับซอฟต์แวร์การวิเคราะห์เป็นอย่างมาก แน่นอนคุณสามารถสร้างแผนที่อื่น ๆ ได้หากจำเป็นต้องใช้เป็นเอาต์พุตเพื่อทำความเข้าใจกับโพรบ คุณอาจดูcode.google.com/p/mtexเพื่อหาเม็ดแอนทีลิส
mistapink

3
เหตุผลที่ฉันคิดว่าฉันต้องการ CRS คือ: ถ้าฉันเพิ่งสร้างพูด GeoTIFF โดยไม่ต้องกำหนด CRS หน่วยการวัดจะเป็นพิกเซล ถ้าฉันต้องการวัดระยะทางล่ะ และถ้าฉันมีการสแกน AFM สองครั้งและรู้ว่าพวกเขาเกี่ยวข้องกันอย่างไร (ในแง่ของขนาดและออฟเซ็ตจากบางจุด) การกำหนดซีอาร์เอสจะช่วยอำนวยความสะดวกในการดูการสแกนหลายรายการในครั้งเดียว
atlefren

1
ฉันมักจะรับมือกับข้อมูลดังกล่าวโดยการตั้งค่าระบบพิกัดท้องถิ่น (โดยมีจุดกำเนิดกำเนิดพร้อมกับจุดกำเนิดภาพ) และ "โกหก" เกี่ยวกับหน่วย ตัวอย่างเช่นคุณสามารถกำหนดว่าหน่วยเป็นกิโลเมตรเมื่อพวกมันเป็นนาโนเมตรจริง ๆ ซึ่งทำให้จิตใจง่ายต่อการแปลงไปมา แน่นอนคุณจะไม่ทำสิ่งที่น่าตำหนิดังนั้นจึงไม่ใช่ปัญหา การตั้งค่าระบบพิกัดนี้เหมือนกับการอ้างอิงทางภูมิศาสตร์ DEM ใด ๆ มันสามารถทำได้ง่ายเพียงแค่สร้างไฟล์โลกที่ไม่ได้ทำการหมุน
whuber

คำตอบ:


4

ดูเหมือนว่าฉันจะแก้ไขปัญหาที่ 1 และ 2 อย่างน้อย รหัสที่มาแบบเต็มรูปแบบที่GitHubแต่คำอธิบายบางอย่างที่นี่:

สำหรับ CRS ที่กำหนดเองฉันตัดสินใจ (ตามคำแนะนำของ Whubers) เพื่อ "โกง" และใช้เมตรเป็นหน่วย ฉันพบ "local 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 นั้นค่อนข้างตรงไปตรงมา (ฉันลงเอยด้วย 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 ถูกหาวิธี "georeference" ไฟล์ของฉันอย่างถูกต้องฉันลงเอยด้วยการใช้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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.