图幅与经纬度之间的换算⼀、基本知识了解
/**
* 根据图幅计算经纬度
* 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 = MappableUnitMap().get(mappableCode) ;
if(bilichi == null ){
return null ;
}
String xy = YDvalueMap().get(bilichi).toString() ;
double x2 = Double.String().split(",")[0]) ;
double y2 = Double.String().split(",")[1]) ;
Object doubleLine = MappableUnitLineMap().get(h) ;
if(doubleLine == null){
return null ;
}
double hDouble = Double.String()) ;
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.tXmin(xmin);
mappableUnit.tXmax(xmax);
mappableUnit.tYmin(ymin);
mappableUnit.tYmax(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 = YDvalueMap().get(scale);
if(xy == null){
return null ;
}
double x2 = Double.String().split(",")[0]) ;
double y2 = Double.String().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 = MappableUnitLineMap(),h) ;
String scaleCode = MappableUnitMap(),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.ls.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 tXmin(double xmin) {
}
public double getXmax() {
return xmax;
}
public void tXmax(double xmax) {
}
public double getYmin() {
return ymin;
}
public void tYmin(double ymin) {
}
public double getYmax() {
return ymax;
}
public void tYmax(double ymax) {
}
static{
tMappableUnitMap() ;
tXYDvalueMap() ;
tMappableUnitLineMap();
}
private static void tMappableUnitMap(){
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 tMappableUnitLineMap(){
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 tXYDvalueMap(){
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 ((key).equals(value)) {