😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
這篇文章主要介紹地圖投影和坐標轉換proj庫配置使用。
無專精則不能成,無涉獵則不能通。——梁啟超
歡迎來到我的博客,一起學習,共同進步。
喜歡的朋友可以關注一下,下次更新不迷路🥞
文章目錄
- :smirk:1. 項目介紹
- :blush:2. 環境配置
- :satisfied:3. 使用說明
😏1. 項目介紹
官網:https://proj.org/en/9.4/
項目Github地址:https://github.com/OSGeo/PROJ
proj
庫是一個開源的庫,主要用于地理坐標系之間的轉換和地圖投影。它被廣泛應用于地理信息系統(GIS)和其他需要坐標轉換和地圖投影的應用中。
基本概念:
1.坐標系:地球上的位置可以用不同的坐標系表示,如經緯度(WGS84)和投影坐標系(如UTM)。
2.地圖投影:將地球的三維表面映射到二維平面上(如地圖)的方法。不同的投影方法適用于不同的應用場景。
3.坐標轉換:將一種坐標系中的點轉換到另一種坐標系中,通常涉及復雜的數學計算。
主要功能:
1.坐標轉換:支持多種地理坐標系之間的轉換,如從WGS84到UTM,或者從地理坐標系到地心坐標系。
2.地圖投影:支持多種地圖投影方式,如墨卡托投影、蘭伯特正形投影等。
3.坐標操作:支持各種坐標操作,如偏移、旋轉等。
😊2. 環境配置
Ubuntu上使用可以直接apt安裝:
sudo apt install libproj-dev
程序g++編譯:
g++ -o main main.cpp -lproj
😆3. 使用說明
WGS84轉UTM示例:
#include <proj.h>
#include <iostream>int main() {// 創建坐標轉換上下文PJ_CONTEXT *ctx = proj_context_create();// 定義源和目標坐標系PJ *source_crs = proj_create(ctx, "EPSG:4326"); // WGS84PJ *target_crs = proj_create(ctx, "EPSG:32633"); // UTM zone 33N// 創建坐標轉換對象PJ *transformation = proj_create_crs_to_crs_from_pj(ctx, source_crs, target_crs, nullptr, nullptr);if (transformation == nullptr) {std::cerr << "Failed to create transformation object." << std::endl;proj_context_destroy(ctx);return 1;}// 坐標轉換前,需要將坐標轉換對象轉為度量型PJ *transform = proj_normalize_for_visualization(ctx, transformation);proj_destroy(transformation);if (transform == nullptr) {std::cerr << "Failed to normalize transformation." << std::endl;proj_context_destroy(ctx);return 1;}// 輸入經緯度坐標 (經度, 緯度)PJ_COORD input = proj_coord(12.0, 55.0, 0, 0); // (Longitude, Latitude)PJ_COORD output;// 執行坐標轉換output = proj_trans(transform, PJ_FWD, input);// 輸出轉換后的坐標 (東, 北)std::cout << "Easting: " << output.xy.x << " Northing: " << output.xy.y << std::endl;// 清理資源proj_destroy(transform);proj_context_destroy(ctx);return 0;
}
UTM轉WGS84示例:
#include <proj.h>
#include <iostream>int main() {// 創建PROJ上下文PJ_CONTEXT *ctx = proj_context_create();// 定義UTM坐標系 (EPSG:32633 - UTM zone 33N) 和 WGS84坐標系 (EPSG:4326)PJ *utm_crs = proj_create(ctx, "EPSG:32633"); // UTM zone 33NPJ *wgs84_crs = proj_create(ctx, "EPSG:4326"); // WGS84// 創建坐標轉換對象PJ *transformation = proj_create_crs_to_crs_from_pj(ctx, utm_crs, wgs84_crs, nullptr, nullptr);if (transformation == nullptr) {std::cerr << "Failed to create transformation object." << std::endl;proj_context_destroy(ctx);return 1;}// 將轉換對象規范化為視覺化使用PJ *transform = proj_normalize_for_visualization(ctx, transformation);proj_destroy(transformation);if (transform == nullptr) {std::cerr << "Failed to normalize transformation." << std::endl;proj_context_destroy(ctx);return 1;}// 輸入UTM坐標 (Easting, Northing)double utm_easting = 500000.0; // 例如: 500000米double utm_northing = 4649776.22482; // 例如: 4649776.22482米PJ_COORD input = proj_coord(utm_easting, utm_northing, 0, 0);// 執行坐標轉換PJ_COORD output = proj_trans(transform, PJ_INV, input); // PJ_INV 表示逆轉換(UTM -> WGS84)// 輸出轉換后的WGS84坐標 (經度, 緯度)std::cout << "Longitude: " << output.lp.lam << " Latitude: " << output.lp.phi << std::endl;// 清理資源proj_destroy(transform);proj_context_destroy(ctx);return 0;
}
以上。