利用Geotools来转换影像的坐标系

背景

若有一幅航拍的原始影像,需要自动产品化,那就必须要在后端进行坐标系的统一转换,这时用到开源的Geotools就很简单了。

处理

使用Operations类下的resample方法(重采样)可以解决这个问题,它的方法定义如下:

 Coverage org.geotools.coverage.processing.Operations.resample(Coverage source, CoordinateReferenceSystem crs) throws CoverageProcessingException

所以我们可以利用它实现栅格影像的坐标变换,例如下面代码将xxxx.tif的坐标系转换为3857坐标系。

File file = new File("xxxx.tif");
        	if(file.exists()){
	        	Reader br = new Reader();
	        	GridCoverage2D old2D = br.getGridCoverage2D(file);
	        	final CoordinateReferenceSystem WGS = CRS.decode("EPSG:3857");
	    		final CoordinateReferenceSystem sourceCRS = old2D.getCoordinateReferenceSystem();
	    		System.out.println(String.format("源坐标系为: %s", sourceCRS.getName()));
	    		GridCoverage2D new2D = (GridCoverage2D) Operations.DEFAULT.resample(old2D, WGS);
	        	System.err.println(String.format("目标坐标系为: %s", new2D.getCoordinateReferenceSystem().getName()));	
        	}

控制台打印结果如下:

源坐标系为: EPSG:WGS 84 / UTM zone 48N
目标坐标系为: EPSG:WGS 84 / Pseudo-Mercator

可见resample方法切实有效。

Tips

若涉及到4326坐标系的转换,要注意坐标轴的顺序是不固定的,需要限制顺序,否则很多后续工作会出乱子,参考Axis Order

//resample参数修改
Hints hints = new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE);
CRSAuthorityFactory factory = ReferencingFactoryFinder.getCRSAuthorityFactory("EPSG", hints);
CoordinateReferenceSystem crs = factory.createCoordinateReferenceSystem("EPSG:4326");
Operations.DEFAULT.resample(xxx,crs);


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
非常抱歉,我之前的回答有误。Geotools确实不支持直接的投影转换到EPSG:4479坐标系。 EPSG:4479代表了ETRS89地理坐标系,它使用欧洲地面参考系统1989(ETRS89)作为基准。在Geotools中,大多数投影转换都是基于投影坐标系,而不是地理坐标系。 如果你希望进行与EPSG:4479相关的操作,可能需要考虑以下两种方式: 1. 将你的数据从投影坐标系转换到EPSG:4326(WGS84)地理坐标系,然后再进行与EPSG:4479的转换。这可以通过使用Geotools中的投影转换工具来实现。 2. 考虑使用其他的GIS库或工具,如GDAL(Geospatial Data Abstraction Library),它提供了更广泛的坐标系支持,包括对EPSG:4479的转换。 请注意,无论你选择哪种方式,确保你有正确的Bursa-Wolf参数(七参数或三参数)用于进行转换。这些参数通常用于处理不同基准之间的差异。 对于EPSG:4479,下面是一个示例使用Geotools进行从投影坐标系(如EPSG:3857)到EPSG:4479地理坐标系转换代码: ```java CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:3857"); CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4479"); MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true); DirectPosition2D sourcePos = new DirectPosition2D(sourceCRS, x, y); DirectPosition2D targetPos = new DirectPosition2D(); transform.transform(sourcePos, targetPos); double targetX = targetPos.getX(); double targetY = targetPos.getY(); ``` 请注意,以上示例中的转换是从EPSG:3857投影坐标系到EPSG:4479地理坐标系。确保你根据实际情况调整源和目标坐标系的EPSG代码。 希望这可以帮助到你。再次对之前的回答错误表示抱歉。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值