JAVA代码根据经纬度范围计算WGS84与谷歌全球墨卡托包含的切片数目与拼接图像像素尺寸
根据项目需求编写的代码。
适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐标的tif图像。
那么在下载瓦片与拼接瓦片之前,用户希望能看到待下载的瓦片数量与待拼接图像的像素尺寸,再决定是否拼接。
该java代码根据该矩形框的经纬度范围与用户指定的瓦片层级,计算需要下载的瓦片数量与待拼接结果图像的像素尺寸。
支持EPSG4326经纬度与EPSG3857谷歌全球墨卡托投影。经纬度瓦片切图规则与天地图相同,从第一层开始切,第一层包含两个瓦片。谷歌全球墨卡托从第0层开始切,第0层一个瓦片。
public class Main {
private void LonLatToTile(double lon,double lat,int zoom,int[] txy)
{
double resFact = 180.0 / 256.0;
double[] pxy = new double[]{0.0,0.0};
double res = resFact / Math.pow(2,(double)zoom);
pxy[0] = (180.0 + lon) / res;
pxy[1] = (90.0 - lat) / res;
txy[0] = (int)(Math.ceil(pxy[0]/256.0) - 1);
txy[1] = (int)(Math.ceil(pxy[1]/256.0) - 1);
}
private void LatLonToMeters(double lon, double lat,double[] mxy)
{
double m_originShift = 2 * 3.141592653589793 * 6378137 / 2.0;
mxy[0] = lon * m_originShift / 180.0;
mxy[1] = Math.log( Math.tan((90 + lat) * 3.141592653589793 / 360.0 )) / (3.141592653589793 / 180.0);
mxy[1] = mxy[1] * m_originShift / 180.0;
}
private void MetersToTile(double mx, double my, int zoom, int[] txy)
{
double m_initialResolution = 2 * 3.141592653589793 * 6378137 / 256;
double m_originShift = 2 * 3.141592653589793 * 6378137 / 2.0;
double res = m_initialResolution / Math.pow(2,(double)zoom);
double px = (mx + m_originShift) / res;
double py = (m_originShift - my) / res;
txy[0] = (int)( Math.ceil( px / (float)(256) ) - 1 );
txy[1] = (int)( Math.ceil( py / (float)(256) ) - 1 );
}
// 计算经纬度输出瓦片数量与待拼接图像像素尺寸
public int getGeodeticSize(double minLon, double maxLon, double minLat, double maxLat, int zoom, int[] pixSize){
int[] tminxy = new int[]{0,0};
int[] tmaxxy = new int[]{0,0};
LonLatToTile(minLon,minLat,zoom-1,tminxy);
LonLatToTile(maxLon,maxLat,zoom-1,tmaxxy);
pixSize[0] = (1+Math.abs(tmaxxy[0]-tminxy[0])) * 256;
pixSize[1] = (1+Math.abs(tmaxxy[1]-tminxy[1])) * 256;
int tnum = (1+Math.abs(tmaxxy[0]-tminxy[0])) * (1+Math.abs(tmaxxy[1]-tminxy[1]));
return tnum;
}
// 计算谷歌投影输出瓦片数量与待拼接图像像素尺寸
public int getMercatorSize(double minLon, double maxLon, double minLat, double maxLat, int zoom, int[] pixSize){
double[] oULxy = new double[]{0,0};
double[] oDRxy = new double[]{0,0};
LatLonToMeters(minLon,maxLat,oULxy);
LatLonToMeters(maxLon,minLat,oDRxy);
double ominx = oULxy[0];
double omaxx = oDRxy[0];
double ominy = oDRxy[1];
double omaxy = oULxy[1];
int[] tminxy= new int[]{0,0};
int[] tmaxxy = new int[]{0,0};
MetersToTile(ominx,ominy, zoom, tminxy);
MetersToTile(omaxx,omaxy, zoom, tmaxxy);
pixSize[0] = (1+Math.abs(tmaxxy[0]-tminxy[0])) * 256;
pixSize[1] = (1+Math.abs(tmaxxy[1]-tminxy[1])) * 256;
int tnum = (1+Math.abs(tmaxxy[0]-tminxy[0])) * (1+Math.abs(tmaxxy[1]-tminxy[1]));
return tnum;
}
public static void main(String[] args) {
System.out.println("Hello World!");
double minLon = 119.54384371341310;
double maxLon = 119.93413672204591;
double minLat = 33.068895415323247;
double maxLat = 33.433168890047206;
int zoom = 13;
Main e=new Main();
int[] pixSize= new int[]{0,0};
int tnum;
tnum = e.getGeodeticSize(minLon, maxLon, minLat, maxLat, zoom, pixSize);
System.out.println("经纬度数据瓦片数:" + tnum + " 图像尺寸:" + pixSize[0] + "*" + pixSize[1]);
tnum = e.getMercatorSize(minLon, maxLon, minLat, maxLat, zoom, pixSize);
System.out.println("谷歌数据瓦片数:" + tnum + " 图像尺寸:" + pixSize[0] + "*" + pixSize[1]);
}
}
运行结果:

JAVA代码根据经纬度范围计算WGS84与谷歌全球墨卡托包含的切片数目与拼接图像像素尺寸的更多相关文章
- 维吉尼亚密码java代码实现根据密钥长度计算IC值过程
package cn.longxuzi; import java.util.Scanner; import org.junit.Test; public class ICUtils { /** * @ ...
- 200行Java代码搞定计算器程序
发现了大学时候写的计算器小程序,还有个图形界面,能够图形化展示表达式语法树,哈哈;) 只有200行Java代码,不但能够计算加减乘除,还能够匹配小括号~ 代码点评: 从朴素的界面配色到简单易懂错误提示 ...
- 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果
今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...
- 【JAVA】两点经纬度直线距离的计算
来自谷歌地图的计算公式: 通过JAVA的Math类各种方法调用.实现上述公式 private static double EARTH_RADIUS = 6378.137;// 单位千米 /** * 角 ...
- Java代码计算运行时间
突然想准确的测试一下Java代码的执行时间,在网上找了一会.发现基本有以下两种方法:第一种是以毫秒为单位计算的. Java代码 //伪代码 long startTime=System.currentT ...
- java 根据经纬度坐标计算两点的距离算法
/** * @Desc 根据经纬度坐标计算两点的距离算法<br> * @Author yangzhenlong <br> * @Data 2018/5/9 18:38 */ p ...
- js代码--根据经纬度计算距离
原网页地址:http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html <!DOCTYPE html> < ...
- GeoHash核心原理解析及java代码实现(转)
原文链接:http://blog.jobbole.com/80633/ 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩,肚肚饿了,于是乎 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
随机推荐
- jQuery实现遮罩层
1.1 背景半透明遮罩层样式 需要一个黑色(当然也可以其他)背景,且须设置为绝对定位,以下是项目中用到的css样式: /* 半透明的遮罩层 */ #overlay { background: #000 ...
- Python的串口通信(pyserial)
串口通信是指外设和计算机间,通过数据信号线 .地线.控制线等,按位进行传输数据的一种通讯方式.这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低.串口是计算机上一种非 ...
- 一道题引出对LinkedList源码的研究
题目:打开一个文本文件,每次读取一行内容,将每行作为一个String读入,并将那个String对象置入一个LinkedList中,按照相反的顺序打印出LinkedList中的所有行. 解题代码: pu ...
- 转载 Flask中客户端 - 服务器 - web应用程序 是如何处理request生成response的?
文章转载自https://blog.csdn.net/weixin_37923128/article/details/80992645 , 感谢原作者 当客户端向服务器发送一个请求时,服务器会将请求转 ...
- [Leetcode]895.最大频率栈
Problem 实现 FreqStack,模拟类似栈的数据结构的操作的一个类. FreqStack 有两个函数: push(int x),将整数 x 推入栈中. pop(),它移除并返回栈中出现最频繁 ...
- Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程
Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...
- CentOS7.0小随笔——运行级别
一.Linux运行级别(通用) 0:关机(halt) 1:单用户模式(无需用户名和密码的登录,用于紧急维护系统时用,类似于Windows中的安全模式) 2:不启用网络功能的多用户模式 3:启用网络功能 ...
- 【转载】uCOS系统的思考
一: 世界潮流,浩浩汤汤,顺之者昌,逆之者亡---孙中山 从80X86到ARM9,再从ARM9到ARM7,平台是越做越简单,但是简单并不是意味着退步,反而是种潮流趋势... 在CISC道路上渐行渐远 ...
- Android AIDL 实例
为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface Def ...
- YARN集群的mapreduce测试(五)
将user表计算后的结果分区存储 测试准备: 首先同步时间,然后master先开启hdfs集群,再开启yarn集群:用jps查看: master上: 先有NameNode.SecondaryNameN ...