图幅与经纬度之间的换算
一、基本知识了解
/** * 根据图幅计算经纬度 * 1:100万 A 经6度,纬4度; 1:50万 B 经3度,纬2度; 1:25万 C 经1度30分,纬1度; 1:10万 D 经30分 纬20分; * 1:5万 E 经15分 纬10分; 1:2.5万 F 经3分45秒 纬2分30秒;1:1万 G 经1分52.5秒 纬1分15秒; * 1:5000 H; 1:2000 J; 1:1000 K; 1:500 L; 1:20万 R; * 1:150万 S; 1:250万 T; 1:400万 U; 1:500万 V; 1:600万 W; 1:800万 X;1:1000万 Y * mappableUnit=J50D002002 */ public static MappableUnitHelper doComputerByMappableUnit(String mappableUnitStr){ // 分步计算 // y=h*y1-(h1-1)*y2,x=(l-31)*x1+(l1-1)*x2 // ,y代表纬度,y1代表比例尺100万地图的纬差,x代表经度,y1代表纬差,x1代表经差,y2代表纬差,x2代表经差 //下代表比例尺100万地图的经差。[]为商取整符号,如9.3则取9,h代表图号行号,l代表图号列号,h1代表 // h1代表图号的地形图在基础图幅内所位于的行号,l1代表图号的地形图在基础图幅内所位于的列号 if(StringUtils.isBlank(mappableUnitStr) ||mappableUnitStr.length() != 10 ){ logger.info("GeotoolsUtil.doComputerByMappableUnit.mappableUnit is not valid"); return null ; } //图号行号 String h = mappableUnitStr.substring(0,1) ; //图号列号 double l =Double.valueOf(mappableUnitStr.substring(1,3)) ; //比例尺代号 String mappableCode =mappableUnitStr.substring(3,4) ; //基础图幅内位于的行号 double h1 =Double.valueOf(mappableUnitStr.substring(4,7)) ; //基础图幅内位于的列号 double l1 =Double.valueOf(mappableUnitStr.substring(7,10)) ; //比例尺 Object bilichi = MappableUnitHelper.getMappableUnitMap().get(mappableCode) ; if(bilichi == null ){ return null ; } String xy = MappableUnitHelper.getxYDvalueMap().get(bilichi).toString() ; double x2 = Double.valueOf(xy.toString().split(",")[0]) ; double y2 = Double.valueOf(xy.toString().split(",")[1]) ; Object doubleLine = MappableUnitHelper.getMappableUnitLineMap().get(h) ; if(doubleLine == null){ return null ; } double hDouble = Double.valueOf(doubleLine.toString()) ; double ymax=(hDouble*14400-(h1-1)*y2)/3600 ; double xmin=((l-31)*21600+(l1-1)*x2)/3600; double ymin= ymax-y2/3600; double xmax=xmin+x2/3600; MappableUnitHelper mappableUnit = new MappableUnitHelper() ; mappableUnit.setXmin(xmin); mappableUnit.setXmax(xmax); mappableUnit.setYmin(ymin); mappableUnit.setYmax(ymax); return mappableUnit; } /** * 根据经纬度计算图幅 * 1:100万 A 经6度,纬4度; 1:50万 B 经3度,纬2度; 1:25万 C 经1度30分,纬1度; 1:10万 D 经30分 纬20分; * 1:5万 E 经15分 纬10分; 1:2.5万 F 经3分45秒 纬2分30秒;1:1万 G 经1分52.5秒 纬1分15秒; * 1:5000 H; 1:2000 J; 1:1000 K; 1:500 L; 1:20万 R; * 1:150万 S; 1:250万 T; 1:400万 U; 1:500万 V; 1:600万 W; 1:800万 X;1:1000万 Y * */ public static String changeToMappale(double x,double y,String scale){ // 分步计算 // h=[y/y1]+1;l=[x/x1]+31;h1=y1/y2-[(y/y1)/y2];l1=[(x/x1)/x2]+1; // ,y代表纬度,y1代表比例尺100万地图的纬差,x代表经度,y1代表纬差(1:100万),值为4度,x1代表经差(1:100万),值为6度,y2代表纬差,x2代表经差 //下代表比例尺100万地图的经差。[]为商取整符号,如9.3则取9,()为取余,h代表图号行号,l代表图号列号,h1代表 // h1代表图号的地形图在基础图幅内所位于的行号,l1代表图号的地形图在基础图幅内所位于的列号 //比例尺 String zeroLength="000" ; Object xy = MappableUnitHelper.getxYDvalueMap().get(scale); if(xy == null){ return null ; } double x2 = Double.valueOf(xy.toString().split(",")[0]) ; double y2 = Double.valueOf(xy.toString().split(",")[1]) ; String h = String.valueOf((int)Math.floor(y/4)+1) ; int l = (int)Math.floor(x/6)+31; String h1 = String.valueOf((int)(14400/y2-Math.floor(((y%4)*3600/y2)))); String l1 = String.valueOf((int)(Math.floor(x%6*3600/x2)+1)) ; String hkey = MappableUnitHelper.getKey(MappableUnitHelper.getMappableUnitLineMap(),h) ; String scaleCode = MappableUnitHelper.getKey(MappableUnitHelper.getMappableUnitMap(),scale) ; String hk1 = zeroLength.substring(0,zeroLength.length()-h1.length())+h1; String lk1 = zeroLength.substring(0,zeroLength.length()-l1.length())+l1; return hkey+l+scaleCode+hk1+lk1 ; }
package com.unis.dimensional.geotools.utils;
import java.util.HashMap;
import java.util.Map;
public class MappableUnitHelper {
private static Map<String,Object> mappableUnitMap = new HashMap<String,Object>() ;
private static Map<String,Object> xYDvalueMap = new HashMap<String,Object>() ;
private static Map<String,Object> mappableUnitLineMap = new HashMap<String,Object>() ;
private double xmin ;
private double xmax ;
private double ymin ;
private double ymax ;
public double getXmin() {
return xmin;
}
public void setXmin(double xmin) {
this.xmin = xmin;
}
public double getXmax() {
return xmax;
}
public void setXmax(double xmax) {
this.xmax = xmax;
}
public double getYmin() {
return ymin;
}
public void setYmin(double ymin) {
this.ymin = ymin;
}
public double getYmax() {
return ymax;
}
public void setYmax(double ymax) {
this.ymax = ymax;
}
static{
setMappableUnitMap() ;
setXYDvalueMap() ;
setMappableUnitLineMap();
}
private static void setMappableUnitMap(){
mappableUnitMap.put("A", "1:1000000") ;
mappableUnitMap.put("B", "1:500000") ;
mappableUnitMap.put("C", "1:250000") ;
mappableUnitMap.put("D", "1:100000") ;
mappableUnitMap.put("E", "1:50000") ;
mappableUnitMap.put("F", "1:25000") ;
mappableUnitMap.put("G", "1:10000") ;
mappableUnitMap.put("H", "1:5000") ;
}
private static void setMappableUnitLineMap(){
mappableUnitLineMap.put("A", "1") ;
mappableUnitLineMap.put("B", "2") ;
mappableUnitLineMap.put("C", "3") ;
mappableUnitLineMap.put("D", "4") ;
mappableUnitLineMap.put("E", "5") ;
mappableUnitLineMap.put("F", "6") ;
mappableUnitLineMap.put("G", "7") ;
mappableUnitLineMap.put("H", "8") ;
mappableUnitLineMap.put("I", "9") ;
mappableUnitLineMap.put("J", "10") ;
mappableUnitLineMap.put("K", "11") ;
mappableUnitLineMap.put("L", "12") ;
mappableUnitLineMap.put("M", "13") ;
mappableUnitLineMap.put("N", "13") ;
}
//插值,秒
private static void setXYDvalueMap(){
xYDvalueMap.put("1:1000000","21600,14400") ;
xYDvalueMap.put("1:500000", "10800,7200") ;
xYDvalueMap.put("1:250000","5400,3600") ;
xYDvalueMap.put("1:100000","1800,1200") ;
xYDvalueMap.put("1:50000","900,600") ;
xYDvalueMap.put("1:25000","450,300") ;
xYDvalueMap.put("1:10000","225,150") ;
xYDvalueMap.put("1:5000","112.5,75") ;
}
public static Map<String, Object> getMappableUnitMap() {
return mappableUnitMap;
}
public static Map<String, Object> getxYDvalueMap() {
return xYDvalueMap;
}
public static Map<String, Object> getMappableUnitLineMap() {
return mappableUnitLineMap;
}
public static String getKey(Map map, Object value) {
for (Object key : map.keySet()) {
if (map.get(key).equals(value)) {
return key.toString();
}
}
return null ;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具