Java 处理地理信息数据[DEM TIF文件数据获取高程]

目录

1、导入依赖包

2、读取方法

3、其他相关地理信息相关内容:

1️⃣常用的坐标系

1、GIS 中的坐标系一般分为两大类:

2. ✅常见的地理坐标系

2.0 CGCS2000(EPSG:4490)

2.1 WGS84 (World Geodetic System 1984) (EPSG:4326)

2.2 GCJ-02 (中国国家测绘局坐标系 火星坐标系)

2.3 BD-09 (百度坐标系)

2.4 UTM (Universal Transverse Mercator)

2.5 Lambert Conformal Conic (LCC)

3. ✅常见的投影坐标系

3.1 Web Mercator (EPSG:3857 / EPSG:900913)

3.2 State Plane Coordinate System (SPCS)

2️⃣常用的坐标拾取器


使用GADL处理dem TIF 文件获取坐标点的高程值,具体如下:

1、导入依赖包

<!-- GDAL 包引入 https://mvnrepository.com/artifact/org.gdal/gdal -->
<dependency>
    <groupId>org.gdal</groupId>
    <artifactId>gdal</artifactId>
    <version>3.8.0</version>
    <type>pom</type>
</dependency>

此外,最好使用还有GDAL的JDK进行处理!

含有GDAL3.8 的JDK 17https://download.csdn.net/download/qq_43544074/90890314

2、读取方法

代码如下:

import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.osr.CoordinateTransformation;
import org.gdal.osr.SpatialReference;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author ATB
 * &#064;date  2025/05
 */
public class ElevationCalculator {


    static {
        // 初始化GDAL
        gdal.AllRegister();
    }

    public static List<Map<String, Object>> extractElevations(String tifPath, String coordString) {
        // 初始化GDAL
        gdal.AllRegister();
        List<Map<String, Object>> results = new ArrayList<>();

        Dataset dataset = gdal.Open(tifPath, gdalconst.GA_ReadOnly);
        if (dataset == null) {
            throw new RuntimeException("无法打开TIF文件: " + tifPath);
        }

        // 仿射变换参数
        double[] geoTransform = dataset.GetGeoTransform();
        // 第一个波段
        Band band = dataset.GetRasterBand(1);
        int rasterXSize = dataset.getRasterXSize();
        int rasterYSize = dataset.getRasterYSize();

        // 获取投影信息 // WGS84
        SpatialReference srcSRS = new SpatialReference();
        srcSRS.ImportFromEPSG(4326);
        SpatialReference dstSRS = new SpatialReference(dataset.GetProjection());
        CoordinateTransformation transform = new CoordinateTransformation(srcSRS, dstSRS);

        // 提取字符串中的坐标对
        Pattern pattern = Pattern.compile("\\[([0-9\\.\\-]+),([0-9\\.\\-]+)\\]");
        Matcher matcher = pattern.matcher(coordString);

        while (matcher.find()) {
            double lon = Double.parseDouble(matcher.group(1));
            double lat = Double.parseDouble(matcher.group(2));

            try {
                // 经纬度转换为投影坐标
                double[] proj = transform.TransformPoint(lon, lat);
                if (proj == null || proj.length < 2) {
                    System.err.println("⚠️ 坐标转换失败: " + lon + "," + lat);
                    continue;
                }

                // 计算像素坐标(列、行)
                double x = proj[0];
                double y = proj[1];

                int pixel = (int) ((x - geoTransform[0]) / geoTransform[1]);
                int line = (int) ((y - geoTransform[3]) / geoTransform[5]);

                if (pixel < 0 || pixel >= rasterXSize || line < 0 || line >= rasterYSize) {
                    System.err.println("⚠️ 像素越界: (" + pixel + ", " + line + ")");
                    continue;
                }

                float[] buffer = new float[1];
                band.ReadRaster(pixel, line, 1, 1, buffer);

                Map<String, Object> point = new LinkedHashMap<>();
                point.put("longitude", String.valueOf(lon));
                point.put("latitude", String.valueOf(lat));
                point.put("elevation", String.valueOf(buffer[0]));
                results.add(point);

            } catch (Exception ex) {
                System.err.println("❌ 处理失败: " + lon + ", " + lat + ",错误: " + ex.getMessage());
            }
        }

        dataset.delete(); // 关闭数据集
        return results;
    }

    public static void main(String[] args) {
        String tifPath = "E:\\geodata\\tif\\ASTGTMV003_N45E127\\ASTGTMV003_N45E127_dem.tif";
        String coordinates = "[127.560434,45.480452] [127.547397,45.470760] [127.543923,45.466362] [127.535613,45.462715]";
        List<Map<String, Object>> elevations = extractElevations(tifPath, coordinates);
        System.out.println(elevations);
    }
}

运行后打印内容如下:

[{longitude=127.560434, latitude=45.480452, elevation=355.0}, {longitude=127.547397, latitude=45.47076, elevation=369.0}, {longitude=127.543923, latitude=45.466362, elevation=425.0}, {longitude=127.535613, latitude=45.462715, elevation=447.0}]

获取TIF文件内容信息:


    public static void main(String[] args) {
        // 注册所有的GDAL驱动
        gdal.AllRegister();
        String tifPath = "E:\\geodata\\tif\\ASTGTMV003_N45E127\\ASTGTMV003_N45E127_dem.tif";
        getDemTifInfo(tifPath);
    }


    public static void getDemTifInfo(String tifPath) {
        Dataset dataset = null;

        try {
            dataset = gdal.Open(tifPath, gdalconstConstants.GA_ReadOnly);
            if (dataset == null) {
                throw new RuntimeException("❌ 无法打开文件: " + tifPath);
            }

            System.out.println("📂 文件信息 ========================");
            System.out.println("路径: " + tifPath);
            System.out.printf("尺寸: %d x %d\n", dataset.GetRasterXSize(), dataset.GetRasterYSize());
            System.out.println("波段数: " + dataset.GetRasterCount());

            Band band = dataset.GetRasterBand(1);
            if (band == null) {
                throw new RuntimeException("❌ 无法获取波段信息!");
            }

            System.out.println("\n📈 波段信息 ========================");
            System.out.println("数据类型: " + gdal.GetDataTypeName(band.getDataType()));

            int xSize = band.getXSize();
            int ySize = band.getYSize();
            System.out.printf("像素大小: %d x %d\n", xSize, ySize);

            System.out.println("\n📐 仿射变换参数(GeoTransform) =====");
            double[] geoTransform = dataset.GetGeoTransform();
            System.out.printf("左上角经度 (OriginX): %.6f\n", geoTransform[0]);
            System.out.printf("像素宽度 (PixelSizeX): %.6f\n", geoTransform[1]);
            System.out.printf("X方向旋转: %.6f\n", geoTransform[2]);
            System.out.printf("左上角纬度 (OriginY): %.6f\n", geoTransform[3]);
            System.out.printf("Y方向旋转: %.6f\n", geoTransform[4]);
            System.out.printf("像素高度 (PixelSizeY): %.6f\n", geoTransform[5]);

            System.out.println("\n🌍 投影信息 ========================");
            String projectionWKT = dataset.GetProjectionRef();
            System.out.println("WKT:\n" + projectionWKT);

            SpatialReference srs = new SpatialReference(projectionWKT);
            srs.AutoIdentifyEPSG();

            String authorityName = srs.GetAuthorityName(null);
            String authorityCode = srs.GetAuthorityCode(null);

            if (authorityCode != null) {
                System.out.printf("坐标系来源: %s\n", authorityName);
                System.out.printf("EPSG Code: %s\n", authorityCode);
            } else {
                System.out.println("⚠️ 未能识别 EPSG 编码!");
            }

            String projType = srs.GetAttrValue("PROJCS");
            String geoType = srs.GetAttrValue("GEOGCS");
            System.out.println("地理坐标系: " + geoType);
            System.out.println("投影坐标系: " + projType);

        } catch (Exception e) {
            System.err.println("❌ 处理失败: " + e.getMessage());
        } finally {
            // 释放资源
            if (dataset != null) {
                dataset.delete();
                System.out.println("\n✅ 资源已释放。");
            }
        }
    }

 哈尔滨附近的dem tif文件

哈尔滨附近的30米的DEMhttps://download.csdn.net/download/qq_43544074/90890376

至此,就可以计算出来坐标点的高程了!


3、其他相关地理信息相关内容:

1️⃣常用的坐标系

1、GIS 中的坐标系一般分为两大类:

1. 地理坐标系(Geographic Coordinate System, GCS)

  • 基于地球椭球体模型(椭球参考面)

  • 使用经度(longitude)和纬度(latitude)来表示位置(单位为

  • 常用于全球范围的数据采集、定位和导航

2. 投影坐标系(Projected Coordinate System, PCS)

  • 将三维地球投影到二维平面

  • 使用X(东向)和 Y(北向)坐标表示位置,通常单位为

名称EPSG类型常见应用
WGS844326地理坐标系GPS/卫星定位、原始坐标采集
CGCS20004490地理坐标系中国测绘标准
GCJ-02N/A地理坐标系高德、腾讯地图(加密)
BD-09N/A地理坐标系百度地图(二次加密)
Web Mercator3857投影坐标系地图展示(Google/OSM)
UTM326xx投影坐标系DEM 处理、空间分析

EPSG 编码

  • 定义:EPSG 是一个国际标准,用于唯一标识地理坐标系和投影坐标系。

  • 应用场景:GIS 数据交换、API 接口调用。


2. ✅常见的地理坐标系

2.0 CGCS2000(EPSG:4490)

  • 名称: China Geodetic Coordinate System 2000

  • 类型: 地理坐标系(GCS)

  • 单位:

  • 用途: 中国国家测绘数据(相当于中国版的 WGS84)

  • 说明: 和 WGS84 非常接近,但更精确地匹配中国大地测量需求。


2.1 WGS84 (World Geodetic System 1984) (EPSG:4326)

  • 定义:WGS84 是全球最常用的地理坐标系之一,由美国国防部制定。
  • 椭球体:基于克拉索夫斯基椭球体。
  • 用途:GPS 系统默认使用此坐标系。
  • 特点
    • 经纬度范围:纬度 [-90°, 90°],经度 [-180°, 180°]。
    • 应用场景:全球导航、航空、航海等领域。
  • 示例51.5074° N, 0.1278° W(伦敦的 WGS84 坐标)。
  • 单位: 十进制度(degrees)

2.2 GCJ-02 (中国国家测绘局坐标系 火星坐标系)

  • 定义:GCJ-02 是中国特有的加密坐标系,又称“火星坐标”。 
  • 背景:由于国家安全考虑,中国对公开的地理坐标进行了加密处理。是对 WGS84 加密后的结果,存在偏移。
  • 特点
    • 经纬度范围与 WGS84 相同,但实际位置会偏移。
    • 加密算法复杂,无法直接从 WGS84 转换。
  • 应用场景:中国地图服务(如百度地图、高德地图)。
  • 示例39.9096° N, 116.3972° E(北京天安门广场的 GCJ-02 坐标)。

2.3 BD-09 (百度坐标系)

  • 定义:BD-09 是百度基于 GCJ-02 的进一步加密坐标系。
  • 背景:百度地图在 GCJ-02 的基础上增加了额外的偏移量。(偏移更大)
  • 特点
    • 更加偏离 WGS84 的真实位置。
    • 百度地图的默认坐标系。
  • 应用场景:百度地图服务。
  • 示例39.915° N, 116.404° E(北京天安门广场的 BD-09 坐标)。

2.4 UTM (Universal Transverse Mercator)

  • 定义:UTM 是一种基于墨卡托投影的全球投影坐标系。
  • 分区:将地球划分为 60 个带(每个带 6° 宽),每个带独立计算坐标。
  • 特点
    • 横轴为经度,纵轴为纬度。
    • 坐标单位为米。
    • 区分东西半球。
  • 应用场景:军事、工程、地形图绘制。
  • 示例33N 530000 4830000(第 33 带的 UTM 坐标)。
EPSG代码描述
32652WGS84 / UTM zone 52N(适用于中国东北部)
32650WGS84 / UTM zone 50N(华东)

2.5 Lambert Conformal Conic (LCC)

  • 定义:LCC 是一种圆锥投影坐标系,常用于中纬度地区的地图。
  • 特点
    • 投影中心为两个标准纬线。
    • 保持角度不变形。
    • 适合描述中纬度区域的地图。
  • 应用场景:气象、航空、交通等领域。
  • 示例NAD83 / New York Long Island(美国纽约长岛的 LCC 坐标)。

3. ✅常见的投影坐标系

3.1 Web Mercator (EPSG:3857 / EPSG:900913)

  • 定义:Web Mercator 是互联网地图服务中最常用的投影坐标系。
  • 特点
    • 将地球表面投影到平面。
    • 纬度范围:[-85.0511°, 85.0511°]。
    • 经度范围:[-180°, 180°]。
    • 单位为米。
  • 应用场景:使用墨卡托投影将球面地图映射成二维平面,适合切图瓦片地图展示。Google Maps、Bing Maps、OpenStreetMap。
  • 示例-8528596 4647530(伦敦的 Web Mercator 坐标)。

3.2 State Plane Coordinate System (SPCS)

  • 定义:SPCS 是美国各州使用的投影坐标系。
  • 特点
    • 每个州有独立的投影方式。
    • 坐标单位为英尺或米。
  • 应用场景:美国土地管理、城市规划。
  • 示例2967 123456 456789(纽约州的 SPCS 坐标)。

2️⃣常用的坐标拾取器

腾讯的坐标拾取器:精度是6位

访问地址:坐标拾取器 - 腾讯地图

百度的坐标拾取器:精度是6位

访问地址:拾取坐标系统 

谷歌的坐标拾取器:

访问地址:https://www.google.com/maps/

👏欢迎留言补充!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值