【Python&RS】遙感影像的像素坐標轉地理坐標(仿射變換)

来源:https://www.cnblogs.com/RSran/archive/2023/06/07/17464171.html
-Advertisement-
Play Games

​ GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。 Python的GDAL庫作為柵格數據的處理轉換庫,其支持幾百種柵格數 ...


        GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。

        Python的GDAL庫作為柵格數據的處理轉換庫,其支持幾百種柵格數據格式,如常見的TIFF、ENVI、HFA、HDF4等。因為遙感影像大部分都是柵格數據,所以GDAL庫非常適合處理遙感影像、如光譜指數計算、波段合成、批量下載、柵格轉面等。

        本次介紹如何通過遙感影像的仿射地理變換參數將像素坐標轉為地理/投影坐標,在ENVI或者ArcGIS中都是自動轉換,所以你在點擊影像的某一像元時,它就會顯示對應的地理/投影坐標。但如果你想用Python去實現,就需要使用影像的放射地理參數。

一、獲取仿射地理變換參數

        之前發佈【Python&RS】GDAL計算遙感影像光譜指數(如NDVI、NDWI、EVI等)時就已經用過這部分代碼,沒啥好說的,就是獲取影像的基本參數。代碼中除了仿射地理變換參數其他沒啥用,但我習慣全部輸出。

def Get_data(filepath):
    """
    :param filepath: 輸入影像的路徑
    :return: 返回仿射地理變換參數
    """
    ds = gdal.Open(filepath)  # 打開數據集dataset
    ds_width = ds.RasterXSize  # 獲取數據寬度
    ds_height = ds.RasterYSize  # 獲取數據高度
    ds_bands = ds.RasterCount  # 獲取波段數
    ds_geo = ds.GetGeoTransform()  # 獲取仿射地理變換參數
    ds_prj = ds.GetProjection()  # 獲取投影信息
    print("影像的寬度為:" + str(ds_width))
    print("影像的高度為:" + str(ds_height))
    print("仿射地理變換參數為:" + str(ds_geo))
    print("投影坐標係為:" + str(ds_prj))
    return ds_geo
    # data = ds.ReadAsArray(0, 0, ds_width, ds_height)  # 以數組的形式讀取整個數據集

二、像素坐標轉地理/投影坐標

        這裡先介紹一下仿射地理變換參數(3497294, 0.1, 0.0, 3438148, 0.0, -0.1),這樣大家可以更直觀的明白代碼的意思。

        0:圖像左上角的X坐標
        1:圖像東西方向解析度
        2:旋轉角度,如果圖像北方朝上,該值為0
        3:圖像左上角的Y坐標
        4:旋轉角度,如果圖像北方朝上,該值為0
        5:圖像南北方向解析度

def Pixel_Coordinate(x, y, ds_geo):
    """
    :param x: 輸入x像素坐標
    :param y: 輸入y像素坐標
    :param ds_geo: 輸入仿射地理變換參數
    :return: 返回x,y的地理/投影坐標
    """
    x_geo = ds_geo[0]+ds_geo[1]*x + y*ds_geo[2]
    y_geo = ds_geo[3]+ds_geo[4]*x + y*ds_geo[5]
    print(x_geo, y_geo)
    return x_geo, y_geo

        從代碼中我們可以看到使用仿射地理變換參數將像素坐標轉成地理坐標時,就是將左上角的x,y值加上x,y的像素坐標乘以解析度(即實際距離),然後再加上偏轉就行了。這和我之前寫的通過圖片中心點地理坐標推算整張圖片所有像素點地理坐標的原理是一樣的,只不過這裡的仿射地理變換參數是影像自帶的,而之前寫的【Python&GIS】根據像素坐標計算圖片某點的地理/投影坐標中的偏轉角度是自己算出來的。

三、地理/投影坐標轉像素坐標

def Coordinate_Pixel(x_geo, y_geo, ds_geo):
    """
    :param x_geo: 輸入x地理坐標
    :param y_geo: 輸入y地理坐標
    :param ds_geo: 輸入仿射地理變換參數
    :return: 返回x,y像素坐標
    """
    y = ((y_geo - ds_geo[3] - ds_geo[4] / ds_geo[1] * x_geo + ds_geo[4] / ds_geo[1] * ds_geo[
        0]) / (ds_geo[5] - ds_geo[4] / ds_geo[1] * ds_geo[2]))
    x = ((x_geo - ds_geo[0] - y * ds_geo[2]) / ds_geo[1])
    return int(x), int(y)

 

 本文章主要是分享個人在學習Python過程中寫過的一些代碼。有些部分借鑒了前人以及官網的教程,如有侵權請聯繫作者刪除,大家有問題可以隨時留言交流,博主會及時回覆。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • //個人學習筆記用 - 題目: 給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。如果目標值不存在於數組中,返回它將會被按順序插入的位置。 請必須使用時間複雜度為 O(log n) 的演算法。 參考題解--代碼隨想錄 - 暴力解法: ~~~c++ class Solution { pub ...
  • # 數據結構 in Golang:Hash Tables(哈希表) ### 場景 - 水果店的價格表: - 蘋果 Apple:3元 - 香蕉 Banana:4元 - 桃子 Peach:2元 - 梨 Pear:3元 - 找到一種水果的價格: - 可以使用 binary search,通過名稱來查找,耗 ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第8面: > 面試官:C++中,函數的參數應該傳值還是傳引用? > > 二師兄:要看參數的用途。如果是出參,必須傳引用。如果是入參,主要考慮參數類型的大小,來決定傳值還是傳引用。 > > 面試官:為什麼不使用指針? > > 二師兄:傳指針也稱之為傳引 ...
  • **# Properties類** - **基本介紹** ![](https://img2023.cnblogs.com/blog/3008601/202306/3008601-20230604103622859-1793594469.png) 1. 專門用於讀寫配置文件的集合類 配置文件的格式: ...
  • ## SpringMVC如何接受請求參數(普通類型參數/對象類型參數/數組/json數據等) 1、普通類型參數 (1)在可以在方法參數上使用@RequestParam註解來綁定請求參數,此註解允許指定請求參數的名稱,以及是否是必須傳的參數。 ~~~java @RequestMapping("/exa ...
  • # 安裝 略 # hello world > 1. 文檔地址: [https://marketplace.visualstudio.com/items?itemName=humao.rest-client](https://marketplace.visualstudio.com/items?ite ...
  • 在數據結構中,我們已經學習到了簡單的靜態鏈表以及單鏈表和雙鏈表,它們各有優缺點,但是有個共同的問題是他們呢無法存儲不同的數據。下麵提供了一種方法,可以將不同節點的數據鏈接起來。 下麵的代碼都是基礎的C語言代碼,涉及到的知識點基本覆蓋到C語言學習的所有知識面,尤其是使用了巨集,減少了重覆的代碼。 無論是 ...
  • # 引入 在使用SpringBoot開發時,最常用的註解有@Component、@Service、@Controller、@Configuration等。當類使用這些註解標記時,類會被Spring IOC容器管理,包括創建,填充屬性和實例化。 但是Spring容器如何發現並將這些類放到容器進行管理呢 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...