图幅与经纬度之间的换算

一、基本知识了解

 

 

 

 

 


/**
     * 根据图幅计算经纬度
     * 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 ;
}
}
 



原文地址:https://www.cnblogs.com/hejj-bk/p/13883231.html