目录
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
* @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 | 类型 | 常见应用 |
---|---|---|---|
WGS84 | 4326 | 地理坐标系 | GPS/卫星定位、原始坐标采集 |
CGCS2000 | 4490 | 地理坐标系 | 中国测绘标准 |
GCJ-02 | N/A | 地理坐标系 | 高德、腾讯地图(加密) |
BD-09 | N/A | 地理坐标系 | 百度地图(二次加密) |
Web Mercator | 3857 | 投影坐标系 | 地图展示(Google/OSM) |
UTM | 326xx | 投影坐标系 | 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代码 | 描述 |
---|---|
32652 | WGS84 / UTM zone 52N(适用于中国东北部) |
32650 | WGS84 / 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/
👏欢迎留言补充!