zoukankan      html  css  js  c++  java
  • 图幅与经纬度之间的换算

    一、基本知识了解

     

     

     

     

     

    
    
    /**
         * 根据图幅计算经纬度
         * 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 ;
    }
    }
     
    
    
    
    
    
  • 相关阅读:
    解决AVAST杀毒软件导致系统启动缓慢的问题
    HTML 测验 1
    tar 命令详解
    Vmware 中Linux与Windows共享方法
    用VMtool Share功能编译内核导致失败的问题
    C盘空间不足的解决方法
    DNW下USB驱动故障的解决
    KDE vs. GNOME:一位用户的经验之谈
    NTFS压缩过程中电脑断电的问题
    Environment Setup Instruction[Android]
  • 原文地址:https://www.cnblogs.com/hejj-bk/p/13883231.html
Copyright © 2011-2022 走看看