墨卡托影像 转 等经纬度影像,墨卡托图片 转 等经纬度图片
之前写了等经纬度影像 转 墨卡托影像的代码,后来有朋友问墨卡托影像 转 等经纬度影像要怎么做,于是今天花了点时间写了这个转换代码。
package main;import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;/*** 墨卡托影像 转 等经纬度影像* 基本思路:* 1、赤道上经度跨越1度,其代表的距离恒定不变。* 2、(经纬度影像)由起止经纬度可以计算出径向距离,得到径向有多少像素,从而可以计算出一像素代表多少米;* 3、纬度到赤道的距离有公式可以计算出,再由第2步得到的一像素代表多少米,就可以知道纬度需要多少像素填充。* 4、最后将墨卡托影像对应纬度的像素拷贝到等经纬度影像中* @author RainingTime**/
public class MercatorImage2LonLatImage {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();//原始数据起止经纬度{{开始纬度、开始经度}、{结束纬度、结束经度}},左上角开始,右下角结束Double[][] sourceRange = {{53.817,60.2}, {4.83,138.78}};//裁剪区域起止经纬度{{开始纬度、开始经度}、{结束纬度、结束经度}},左上角开始,右下角结束。//若不需要裁剪,则令cutRange = sourceRangeDouble[][] cutRange = {{53.817,60.2}, {4.83,138.78}};String imageType = "jpg";//可选png、jpgString source = "C:/Users/RainingTime/Desktop/FY4影像/FY4A_20210421074900000-mkt.png";String outPut = "C:/Users/RainingTime/Desktop/FY4影像/FY4A_20210421074900000-mkt2lonlat." + imageType;BufferedImage sourceImage = ImageIO.read(new File(source));BufferedImage mercator = imageToLonLat(sourceImage, sourceRange, cutRange, imageType);ImageIO.write(mercator, imageType, new File(outPut));long end = System.currentTimeMillis();System.out.println("转换完成,用时:"+(end-start)+"ms");}/*** png、jpg影像转等经纬度投影* @param sourcePath 原始影像* @param outPutPath 输出影像* @param sourceRange 原始影像经纬度范围,要求左上角开始,右下角结束:{{开始纬度、开始经度}、{结束纬度、结束经度}}* @param cutRange 裁剪区域经纬度范围,要求左上角开始,右下角结束:{{开始纬度、开始经度}、{结束纬度、结束经度}},为null时默认不裁剪* @param imageType png、jpg* @throws IOException*/public static BufferedImage imageToLonLat(BufferedImage sourceImage, Double[][] sourceRange, Double[][] cutRange, String imageType) throws IOException {double sourceStartLat = sourceRange[0][0];double sourceStartLon = sourceRange[0][1];double sourceEndLat = sourceRange[1][0];double sourceEndLon = sourceRange[1][1];double cutStartLat = sourceStartLat;double cutStartLon = sourceStartLon;double cutEndLat = sourceEndLat;double cutEndLon = sourceEndLon;if(cutRange != null){cutStartLat = cutRange[0][0];cutStartLon = cutRange[0][1];cutEndLat = cutRange[1][0];cutEndLon = cutRange[1][1];}if(sourceEndLat>sourceStartLat || sourceStartLon>sourceEndLon){System.out.println("数据源经纬度坐标从左上角开始,右下角结束!");return null;}if(cutEndLat>cutStartLat || cutStartLon>cutEndLon){System.out.println("裁剪区域经纬度坐标从左上角开始,右下角结束!");return null;}/*** earthRadius = 6378137;//地球赤道半径6378137米* 20037508.3427892 = earthRadius * (math.pi - 0);//赤道周长的一半* 85.05112877980659 = (math.atan(math.exp(aa / earthRadius))-math.pi/4)*2 * 180 / math.pi;//墨卡托最大有效纬度*/if(cutStartLat > 85.051128){System.out.println("墨卡托投影起始纬度最大为:85.051128,裁剪区域将被限定。");cutStartLat = 85.051128;}if(cutEndLat <- 85.051128){System.out.println("墨卡托投影终止纬度最小为:-85.051128,裁剪区域将被限定。");cutEndLat = -85.051128;}int sourceWidth = sourceImage.getWidth();double lonStep = (cutEndLon-cutStartLon)/(sourceWidth-1);double latStep = 0 - lonStep;//等经纬度投影下,经度间隔与纬度间隔绝对值相等。从左上角开始,右下角结束,负值。System.out.println("sourceWidth: " + sourceWidth + ", latStep: " + latStep + ", lonStep: " + lonStep);int cutWidth = (int)((cutEndLon - cutStartLon)/lonStep + 0.5) + 1;int cutHeight = (int)((cutEndLat - cutStartLat)/latStep + 0.5) + 1;System.out.println("cutWidth: "+cutWidth+", cutHeight: "+cutHeight);//截止纬度与赤道之间有多少个点,北半球为正值int start = (int)((Math.log(Math.tan((90 + cutStartLat) * Math.PI / 360)) / (Math.PI / 180))/ lonStep + 0.5);//起始纬度与赤道之间有多少个点,南半球为负值int end = (int)((Math.log(Math.tan((90 + cutEndLat) * Math.PI / 360)) / (Math.PI / 180))/ lonStep + 0.5);int lwidth = cutWidth;//等经纬度投影宽度,应该是与墨卡托投影宽度一致int lheight = cutHeight;//等经纬度投影高度System.out.println("lwidth: "+lwidth+", lheight: "+lheight);//填充真实数据int equator = -1;//赤道的像素y轴坐标BufferedImage outImage = null;if("png".equals(imageType)){outImage = new BufferedImage(lwidth, lheight, BufferedImage.TYPE_INT_ARGB);}else{outImage = new BufferedImage(lwidth, lheight, BufferedImage.TYPE_INT_RGB);}for(int y=0; y<lheight; y++){double lat = cutStartLat + (y * latStep);//截止纬度 减 当前纬度,得到纬度差if(-85.051128 <= lat && lat <= 85.051128){int oy = start - (int)((Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180)) / lonStep + 0.5);if(lat == 0.0 || (lat>0.0 && (lat+0.5*latStep)<0.0) || (lat<0.0 && (lat-0.5*latStep)>0.0)){//赤道equator = oy;}for(int x=0; x<lwidth; x++){int px = (int)((cutStartLon+x*lonStep-sourceStartLon)/lonStep + 0.5);int rgb = sourceImage.getRGB(px, oy);outImage.setRGB(x, y, rgb);}}}System.out.println("赤道的像素y轴坐标:"+equator);return outImage;}}
效果图:转换前:墨卡托影像
效果图:转换后:等经纬度影像
传送门:等经纬度影像 转 墨卡托影像,等经纬度图片 转 墨卡托图片
墨卡托影像 转 等经纬度影像,墨卡托图片 转 等经纬度图片相关推荐
- 等经纬度影像 转 墨卡托影像,等经纬度图片 转 墨卡托图片
前段时间做了气象方面的工作,要在gis地图上叠加卫星影像. gis地图是墨卡托投影,卫星影像是等经纬度投影,不能直接叠加. 于是整出了这个等经纬度影像 转 墨卡托影像的程序. 上代码: import ...
- 经纬度,墨卡托等坐标转换
1.经纬度转墨卡托 1.1Java: 1.2Scala: 2.墨卡托转经纬度 3.proj4方式 1.经纬度转墨卡托 1.1Java: public static double[] lngLat2Me ...
- java 墨卡托转经纬度_经纬度,墨卡托等坐标转换
1.经纬度转墨卡托 1.1Java: public static double[] lngLat2Mercator(double lng, double lat) { double[] xy = ne ...
- java 墨卡托 经纬度_Web墨卡托坐标与WGS84经纬度互转 java代码
Web墨卡托坐标与WGS84经纬度互转 java代码 时间:5年前 浏览:2309 [网络转载] package com.util; public class Coordinate { static ...
- 基于MATALB的多光谱影像与全色影像(高分辨率)的融合的几种方法
基于MATALB的多光谱影像与全色影像(高分辨率)的融合的几种方法 数据: 链接:Sichuan.mat 1.HIS方法 clear ;close ;clc; %加载图片 load Sichuan;% ...
- 影像组学ibex_影像组学的基本概念与临床应用
近年来大数据技术与医学影像辅助诊断的有机融合产生了新的影像组学方法,其通过从影像中提取海量特征来量化肿瘤等重大疾病,可以有效解决肿瘤异质性难以定量评估的问题,具有重要的临床价值.影像组学技术来源于计算 ...
- 去除影像黑边-修改影像背景值-比Envi影像去除黑边-ArcGIS去除影像黑边-好用
目录 去除黑边 一.可视化显示时去除黑边 二.输出去除黑边的影像 每一景去除黑边分别输出-操作方法 多个影像去除黑边镶嵌输出-操作方法 软件下载地址: https://pan.baidu.com/s/ ...
- 【影像配准】遥感影像配准结果输出tif影像(附有完整代码)
遥感影像经过配准后会输出两幅影像:配准后的参考影像和待配准影像: 注:png 转 tif 因为两幅多时像影像在拍摄时即便是同源也无法保证拍摄到的景象完全 ...
- 影像组学ibex_影像组学学习笔记
题外话 这仍然是一篇学习笔记.近期在不同的学术会议上,有幸聆听学习了几位影像组学的大咖做报告,受益匪浅.以大咖们的报告为指导,自己也学习查找了一些文献,加入了一点点自己的理解和想法,整理成一篇笔记,与 ...
最新文章
- 首个内河无人驾驶数据集公布!清华大学等高校联合AI公司开发
- automake使用说明
- eBay数据科学家李睿:自然语言处理在eBay的技术实践 数据 网络 类别 技术 分类器 阅读1593 近日,在飞马网主办的“FMI人工智能大数据高峰论坛”上,来自eBay的数据科学家李睿
- Android 编程规范与常用技巧
- trackby_使用trackBy启动流程
- CvMat与LIplmage之间的相互转换__cvConvert()
- Windows下Java调用BAT批处理不弹出cmd窗口
- Unicode – CSS中文字体转编码
- 安卓学习笔记31:使用自定义视图绘制文本、图形与图像
- 十二个月内 仅仅依靠Google打造成功网站
- mysql之查询最近7天的数据
- C语言三位数的整数立方和,c语言求一个三位数正整数n各个数位上数据的立方和...
- matlab矩阵对角线上下加减,matlab – 如何在相关矩阵中移动靠近矩阵对角线的较大值...
- Java【递归及过滤器】
- 【极简笔记】VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition
- python还款程序_python 之简单模拟银行系统功能(卡号申请、还款、支付、取现)...
- 苹果怎样用小米云服务器,苹果换华为/小米,怎么同步数据?教程来了!
- 逻辑学自然科学教育计算机,科学网—【逻辑学知识】自然推理系统 - 黄荣彬的博文...
- Java语言规格说明
- L1-012. 计算指数