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

news2025/5/24 16:26:22

目录

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/

👏欢迎留言补充!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈谈对dubbo的广播机制的理解

目录 1、介绍 1.1、广播调用 1、工作原理 1.2、调用方式 1、Reference 注解 2、XML 配置 3、全局配置 1.3、 广播机制的特性 2、重试机制 2.1、默认行为 2.2、自定义逻辑 1、在业务层封装重试逻辑 2、使用 Reference 3、广播调用的实践 3.1、常用参数 1.…

003-类和对象(二)

类和对象&#xff08;二&#xff09; 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff…

Linux火墙管理及优化

网络环境配置 使用3个新的虚拟机【配置好软件仓库和网络的】 F1 192.168.150.133 NAT F2 192.168.150.134 192.168.10.20 NAT HOST-ONLY 网络适配仅主机 F3 192.168.10.30 HOST-ONLY 网络适配仅主机 1 ~]# hostnamectl hostname double1.timinglee.org 【更…

Visual Studio 制作msi文件环境搭建

一、插件安装 a. 插件寻找 在 Visual Studio 2017 中&#xff0c;如果你希望安装用于创建 MSI 安装包的插件&#xff0c;第一步是&#xff1a;打开 Visual Studio 后&#xff0c;点击顶部菜单栏中的 “工具”&#xff08;Tools&#xff09;&#xff0c;然后选择下拉菜单中的 “…

鸿蒙进阶——Framework之Want 隐式匹配机制概述

文章大纲 引言一、Want概述二、Want的类型1、显式Want2、隐式Want3、隐式Want的匹配 三、隐式启动Want 源码概述1、有且仅有一个Ability匹配2、有多个Ability 匹配需要弹出选择对话框3、ImplicitStartProcessor::ImplicitStartAbility3.1、GenerateAbilityRequestByAction3.1.1…

antv/g6 图谱封装配置(二)

继上次实现图谱后&#xff0c;后续发现如果要继续加入不同样式的图谱实现起来太过麻烦&#xff0c;因此考虑将配置项全部提取封装到js文件中&#xff0c;图谱组件只专注于实现各种不同的组件&#xff0c;其中主要封装的点就是各个节点的横坐标&#xff08;x&#xff09;,纵坐标…

OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建的是一个 最小值滤波器&#xff08;Minimum Filter&#xff09;&#xff0c;它对图像中每个像素邻域内的像素值取最小值。常用于&…

网络抓包命令tcpdump及分析工具wireshark使用

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 8,Linux x86-64 Red Hat Enterprise Linux 7,Linux x86-64 SLES 12,银河麒麟 &#xff08;鲲鹏&#xff09;,银河麒麟 &#xff08;X86_64&#xff09;,银河麒麟&#xff08;龙…

车载诊断架构 --- 车载诊断有那些内容(上)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

【Hadoop】大数据技术之 HDFS

目录 一、HDFS 概述 1.1 HDFS 产出背景及定义 1.2 HDFS 优缺点 1.3 HDFS 组成架构 1.4 HDFS 文件块大小 二、HDFS 的Shell 操作 三、HDFS 的读写流程&#xff08;面试重点&#xff09; 3.1 HDFS 写数据流程 3.2 HDFS 读数据流程 四、DataNode 4.1 DataNode 的工作机制…

聊一下CSS中的标准流,浮动流,文本流,文档流

在网络上关于CSS的文章中&#xff0c;有时候能听到“标准流”&#xff0c;“浮动流”&#xff0c;“定位流”等等词语&#xff0c;还有像“文档流”&#xff0c;“文本流”等词&#xff0c;这些流是什么意思&#xff1f;它们是CSS中的一些布局方案和特性。今天我们就来聊一下CS…

ATGM332D-F8N22单北斗多频定位导航模块

ATGM332D-F8N 系列模块是 12.216mm 尺寸的高性能单北斗多频定位导航模块。该系列模块产品基于中科微新一代 SOC 单北斗多频芯片 AT9880B&#xff0c;支持北斗二号和北斗三号的 B1I、B1C、B2I、B3I、B2a 和 B2b 频点信号。 主要特征 多频点单北斗接收机 支持北斗二号、北斗三号…

2024年热门AI趋势及回顾

人工智能的崛起 2024 年可能会被铭记为人工智能不再是一种技术新奇事物&#xff0c;而是成为现实的一年。微软、Salesforce 和 Intuit 等巨头将人工智能融入主流企业解决方案&#xff1b;从文案写作到数据分析&#xff0c;专门的人工智能应用程序和服务如雨后春笋般涌现&#…

3. OpenManus-RL中使用AgentGym建立强化学习环境

AgentGym概述 AgentGym是为评估和开发大模型agent而设计的支持多环境和多任务的框架。该框架统一采用ReAct格式&#xff0c;提供多样化的交互环境和任务&#xff0c;支持实时反馈和并发操作。 What is Ai Agent&#xff08;基于大模型的智能体&#xff09;? 首先是人造实体&…

C++性能测试工具——sysprof的使用

一、sysprof sysprof相对于前面的一些性能测试工具来说&#xff0c;要简单不少。特别是其图形界面的操作&#xff0c;非常容易上手&#xff0c;它还支持分析文件的保存和导入功能&#xff0c;这是一个非常不错的功能。做为一款系统性能测试工具&#xff0c;它支持多种硬件平台…

树莓派内核源码的下载,配置,编译和替换

共享文件夹的创建 ubuntu创建共享文件夹可以实现和本地windows跨系统文件共享 下面是创建步骤 先在windows准备一个文件夹来当做共享文件夹 树莓派内核源码下载 1.在树莓派终端输入以下指令查看内核版本 uname -r我这里是已经编译替换过后的版本 2.选择树莓派对应的版本号下…

CentOS停止维护了,解决yum不能安装软件的问题

最近在使用CentOS的yum命令安装软件时&#xff0c;出现了如下错误&#xff1a; 原因&#xff1a; 这是因为CentOS在2024 年 6 月 30 日停止维护了&#xff0c;同时也移除了相关的软件镜像仓库&#xff0c;导致网站地址访问不了&#xff0c;从而下载不了软件。 解决方法&#xf…

过压保护电路设计和计算

设备供电电压因各种原因变得过高会烧坏设备,因此可以在前级加过压保护电路。 稳压二极管+PMOS 电路分析 1、当输入电压 Vin < 5.1V 时:(下图以输入电压 Vin = 5V 举例) D1是5.1V稳压管,此时输入电压Vin才5V,小于5.1V,所以稳压管D1未进入稳压状态,不导通。 5.1V稳…

20250523-BUG:无法加载“GameLib/Framework.h“头文件(已解决)

BUG&#xff1a;无法加载"GameLib/Framework.h"头文件&#xff08;已解决&#xff09; 最近在打开新的C项目时报了这个错&#xff0c;我是按照以下步骤来排除的BUG&#xff0c;希望对您有所帮助~ 检查【C/C】-【附加包含目录】中的路径有无问题&#xff0c;一般需要加…

OpenCv高阶(8.0)——答题卡识别自动判分

文章目录 前言一、代码分析及流程讲解&#xff08;一&#xff09;初始化模块正确答案映射字典&#xff08;题目序号: 正确选项索引&#xff09;图像显示工具函数 &#xff08;二&#xff09;轮廓处理工具模块&#xff08;三&#xff09;几何变换核心模块 二、主处理流程图像读取…