Geographic coordinate system和projected coordinate system

本文深入探讨了地理坐标系统和投影坐标系统的基本概念及应用。地理坐标系统以经纬度为单位,基于特定椭球体和大地基准面,用于描述地球表面的位置。投影坐标系统则是将球面坐标转换为平面坐标的过程,适用于地图制作和地理信息系统,涉及多种参数如投影类型、中央经线等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Geographic coordinate system和projected coordinate system

经常碰到这两个概念:Geographic coordinate system和projected coordinate sys
tem

1、首先理解Geographic coordinate system,Geographic coordinate system直译为
地理坐标系统,是以经纬度为地图的存储单位的。很明显,Geographic coordinate syst
em是球面坐标系统。我们要将地球上的数字化信息存放到球面坐标系统上,如何进行操作
呢?地球是一个不规则的椭球,如何将数据信息以科学的方法存放到椭球上?这必然要求
我们找到这样的一个椭球体。这样的椭球体具有特点:可以量化计算的。具有长半轴,短
半轴,偏心率。以下几行便是Krasovsky_1940椭球及其相应参数。

Spheroid: Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse Flattening: 298.300000000000010000

然而有了这个椭球体以后还不够,还需要一个大地基准面将这个椭球定位。在坐标系统描
述中,可以看到有这么一行:

Datum: D_Beijing_1954

表示,大地基准面是D_Beijing_1954。



--------------------------------------------------------------------------------
以下内容为需要回复才能浏览

有了Spheroid和Datum两个基本条件,地理坐标系统便可以使用。
完整参数:
Alias:
Abbreviation:
Remarks:
Angular Unit: Degree (0.017453292519943299)
Prime Meridian: Greenwich (0.000000000000000000)
Datum: D_Beijing_1954
Spheroid: Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse Flattening: 298.300000000000010000


2、接下来便是Projection coordinate system(投影坐标系统),首先看看投影坐
标系统中的一些参数。

Projection: Gauss_Kruger
Parameters:
False_Easting: 500000.000000
False_Northing: 0.000000
Central_Meridian: 117.000000
Scale_Factor: 1.000000
Latitude_Of_Origin: 0.000000
Linear Unit: Meter (1.000000)
Geographic Coordinate System:
Name: GCS_Beijing_1954
Alias:
Abbreviation:
Remarks:
Angular Unit: Degree (0.017453292519943299)
Prime Meridian: Greenwich (0.000000000000000000)
Datum: D_Beijing_1954
Spheroid: Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse Flattening: 298.300000000000010000


从参数中可以看出,每一个投影坐标系统都必定会有Geographic Coordinate System。


投影坐标系统,实质上便是平面坐标系统,其地图单位通常为米。
那么为什么投影坐标系统中要存在坐标系统的参数呢?
这时候,又要说明一下投影的意义:将球面坐标转化为平面坐标的过程便称为投影。
好了,投影的条件就出来了:
a、球面坐标
b、转化过程(也就是算法)

也就是说,要得到投影坐标就必须得有一个“拿来”投影的球面坐标,然后才能使用算法
去投影!
即每一个投影坐标系统都必须要求有Geographic Coordinate System参数。

<think>我们正在解决一个关于GeoTiffReader异常的问题,该异常提示“Only Geographic & Projected Systems are supported”。这意味着我们尝试读取的TIFF文件可能包含一个不受支持的坐标系(例如,可能是工程坐标系或者自定义坐标系,而库只支持地理坐标系投影坐标系)。 首先,我们需要了解GeoTiffReader通常是地理空间库(如GeoTools)的一部分。这个异常表明,该TIFF文件的坐标系不是标准的地理坐标系(如WGS84)或投影坐标系(如UTM),而是可能使用了本地坐标系(工程坐标系)或者一个未定义的坐标系。 解决方案步骤: 1. 检查坐标系:首先确认TIFF文件的坐标系信息。可以使用GDAL的gdalinfo命令来查看TIFF文件的详细信息。 命令示例:`gdalinfo your_file.tif` 在输出中查找“Coordinate System is:”部分,确认坐标系定义。 2. 如果坐标系是工程坐标系(例如,单位是米,但未关联任何地理参考),则需要将其转换为一个标准的投影坐标系或地理坐标系。这可以通过重新投影(reproject)来实现。 3. 使用GDAL进行转换:如果确认坐标系不受支持,可以使用GDAL的gdalwarp命令重新投影到支持的坐标系。 例如,将文件重新投影到WGS84(EPSG:4326): `gdalwarp -t_srs EPSG:4326 input.tif output.tif` 4. 在代码中处理:如果希望在代码中处理,可以使用GeoTools等库来读取并重新投影。但注意,GeoTiffReader本身可能不支持,所以我们可以先读取为栅格,然后重新投影。 5. 另一种情况:有时TIFF文件可能没有嵌入坐标系信息,但实际使用的是标准坐标系。这时,我们可以手动设置坐标系(使用GeoTools的CoordinateReferenceSystem对象)然后进行重新投影。 6. 如果以上方法不可行,可能需要检查TIFF文件是否损坏,或者尝试使用其他工具(如QGIS)打开并重新保存为支持的坐标系。 由于问题中提到了GeoTiffReader,我们假设使用的是JavaGeoTools库。下面是一个示例代码,展示如何读取一个TIFF文件并处理可能的坐标系问题: ```java import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.io.AbstractGridFormat; import org.geotools.coverage.grid.io.GridFormatFinder; import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.gce.geotiff.GeoTiffReader; import org.geotools.referencing.CRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform; public class ReadGeoTiff { public static void main(String[] args) { try { // 1. 读取原始文件 File file = new File("path/to/your/file.tif"); GeoTiffReader reader = new GeoTiffReader(file); // 2. 尝试获取坐标系 GridCoverage2D coverage = reader.read(null); CoordinateReferenceSystem sourceCRS = coverage.getCoordinateReferenceSystem(); // 3. 检查坐标系是否受支持:这里我们只检查是否为地理或投影坐标系 // 实际上,GeoTiffReader在读取时如果发现不是这两种坐标系就会抛出异常,所以下面代码可能执行不到 // 因此,我们可能需要捕获异常然后进行重新投影 } catch (Exception e) { e.printStackTrace(); // 如果捕获到异常,说明坐标系可能不受支持,我们需要重新投影 // 重新投影需要目标CRS,例如WGS84 try { CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326"); // 重新打开文件,使用更通用的读取方式,然后重新投影 // 因为GeoTiffReader在构造时可能已经失败,我们使用GridFormatFinder AbstractGridFormat format = GridFormatFinder.findFormat(file); GridCoverage2DReader reader = format.getReader(file); GridCoverage2D coverage = reader.read(null); // 获取原始CRS(可能为null或不受支持) CoordinateReferenceSystem sourceCRS = coverage.getCoordinateReferenceSystem(); // 如果原始CRS不为空,我们可以尝试重新投影 if (sourceCRS != null) { // 创建转换 MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true); // 使用org.geotools.coverage.processing.Operations进行重新投影 GridCoverage2D reprojected = (GridCoverage2D) Operations.DEFAULT.resample(coverage, targetCRS); // 现在reprojected就是目标坐标系的数据 } else { // 如果没有CRS,我们可以假设原始数据是WGS84?但最好根据实际情况处理 // 或者手动设置CRS(如果知道的话) coverage = coverage.view(ViewType.GEOPHYSICS); // 可能需要调整 // 然后设置CRS // coverage = CoverageUtilities.setCoordinateReferenceSystem(coverage, targetCRS); // 注意:这个方法在CoverageUtilities中,但GeoTools版本不同可能不同 // 或者重新保存为新的GeoTIFF并指定CRS } } catch (Exception ex) { ex.printStackTrace(); } } } } ``` 注意:上述代码只是一个示例,实际处理中可能会遇到各种问题,比如原始CRS无法确定,需要手动指定。另外,重新投影是一个计算密集型操作,需要谨慎处理。 7. 如果TIFF文件没有坐标系信息,但你知道它是什么坐标系,可以在读取后手动设置: ```java // 假设已知坐标系为EPSG:32610 (UTM zone 10N) CoordinateReferenceSystem knownCRS = CRS.decode("EPSG:32610"); // 然后设置到coverage中(注意:GridCoverage2D是不可变的,通常需要创建一个新的) // 可以使用org.geotools.coverage.grid.Views.setCoordinateReferenceSystem(coverage, knownCRS) // 或者使用org.geotools.coverage.processing.Operations中的方法 ``` 8. 如果以上方法都不行,可能需要检查GeoTools的版本,或者考虑使用GDAL的Java绑定(GDAL Java bindings)来读取并转换。 总结:解决这个异常的关键是确保TIFF文件使用地理坐标系或投影坐标系,并且坐标系信息正确。如果原始文件不符合要求,则需要转换到支持的坐标系。 参考文献: [^1]: 在空间数据处理中,坐标系问题是一个常见问题。GeoTools文档中提到了对坐标系的支持限制。 [^2]: GDAL文档(https://gdal.org/)提供了关于gdalinfogdalwarp的详细信息。 §§相关问题§§ 1. 如何检查TIFF文件的坐标系信息? 2. 如何使用GDAL工具转换TIFF文件的坐标系? 3. 在Java中如何使用GeoTools库重新投影栅格数据? 4. 如何处理没有坐标系信息的TIFF文件? 5. GeoTiffReader支持哪些坐标系?</think>### GeoTiffReader异常:仅支持地理与投影坐标系解决方案 当使用GeoTiffReader读取TIFF文件时出现"Only Geographic & Projected Systems are supported"异常,通常是因为文件包含**工程坐标系**(Engineering CRS)或不支持的坐标系类型。以下是系统解决方案: #### 1. **检查坐标系类型** 使用GDAL工具验证坐标系: ```bash gdalinfo your_file.tif ``` 在输出中查找: - ✅ 支持:`GEOGCS[...]`(地理坐标系)或 `PROJCS[...]`(投影坐标系) - ❌ 不支持:`ENGINEERING[...]`(工程坐标系)或缺失坐标系信息 #### 2. **强制转换坐标系(推荐)** 使用GDAL进行坐标系转换: ```bash gdalwarp -t_srs EPSG:4326 input.tif output.tif ``` 这将: 1. 将数据重新投影到WGS84坐标系(EPSG:4326) 2. 自动移除工程坐标系标记 3. 生成标准地理坐标系文件 #### 3. **代码解决方案(Java/GeoTools)** ```java // 1. 读取时忽略CRS验证 GeoTiffReader reader = new GeoTiffReader(file, new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, true)); // 2. 手动指定CRS(若已知实际坐标系) GridCoverage2D coverage = reader.read(null); CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:32650"); // UTM Zone 50N MathTransform transform = CRS.findMathTransform(coverage.getCoordinateReferenceSystem(), targetCRS); GridCoverage2D reprojected = (GridCoverage2D) Operations.DEFAULT.resample(coverage, targetCRS); ``` #### 4. **常见根本原因** - **工程坐标系**:测量/CAD软件生成的非地理坐标系 - **坐标系缺失**:文件未嵌入CRS信息 - **非常规投影**:自定义或过时的投影参数 - **坐标轴顺序错误**:X/Y轴顺序不符合GIS标准 #### 5. **预防措施** 1. 数据生成阶段:在GIS软件(QGIS/ArcGIS)中明确指定坐标系 2. 转换工具验证: ```bash gdal_translate -a_srs EPSG:3857 input.tif output.tif ``` 3. 代码健壮性处理: ```java try (GridCoverage2DReader reader = new GeoTiffReader(file)) { // 读取操作 } catch (UnsupportedOperationException e) { // 触发坐标系转换流程 convertCRS(file, targetEPSG); } ``` > **关键提示**:工程坐标系常见于CAD设计图、工程测量数据等非地理空间应用场景。地理信息系统(GIS)通常要求数据必须具有真实地理参考[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值