精华内容
下载资源
问答
  • 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, % * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); % * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS...
  • 各种经纬度坐标系转换-百度坐标系、火星坐标系、国际坐标系 WGS84:国际坐标系,为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。 GCJ02:火星坐标系,是由中国国家测绘局制订的地理信息...

    各种经纬度坐标系转换-百度坐标系、火星坐标系、国际坐标系

     (文章代码参考网上 测试没什么问题, 汇总整理希望对大家有帮助-dou )
     WGS84:国际坐标系,为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
     GCJ02:火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
     BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标
    

    一 : 百度坐标与百度墨卡坐标互转

    import java.util.HashMap;
    import java.util.Map;
    /** 
     * @ClassName: Baidu 
     * @Description: 百度坐标与百度墨卡坐标互转
     * @author: Max dou
     * @date: 2017年4月11日 下午4:49:54 
     */
    public class Baidu {
         public static void main(String[] args) {
                //百度坐标转百度墨卡坐标
                Map<String, Double> location = convertMC2LL(13745329.000000, 5104310.500000);
                System.out.println(location.get("lng")+"==="+location.get("lat"));
                //百度墨卡坐标转百度坐标
                location = convertLL2MC(location.get("lng"),location.get("lat"));
                System.out.println(location.get("x")+"==="+location.get("y"));
    
            }
    
            private static Double EARTHRADIUS = 6370996.81;
            private static Double[] MCBAND = {12890594.86, 8362377.87, 5591021d, 3481989.83, 1678043.12, 0d};
            private static Double[] LLBAND = {75d, 60d, 45d, 30d, 15d, 0d};
            private static Double[][] MC2LL = {{1.410526172116255e-8, 0.00000898305509648872, -1.9939833816331, 200.9824383106796, -187.2403703815547, 91.6087516669843, -23.38765649603339, 2.57121317296198, -0.03801003308653, 17337981.2}, {-7.435856389565537e-9, 0.000008983055097726239, -0.78625201886289, 96.32687599759846, -1.85204757529826, -59.36935905485877, 47.40033549296737, -16.50741931063887, 2.28786674699375, 10260144.86}, {-3.030883460898826e-8, 0.00000898305509983578, 0.30071316287616, 59.74293618442277, 7.357984074871, -25.38371002664745, 13.45380521110908, -3.29883767235584, 0.32710905363475, 6856817.37}, {-1.981981304930552e-8, 0.000008983055099779535, 0.03278182852591, 40.31678527705744, 0.65659298677277, -4.44255534477492, 0.85341911805263, 0.12923347998204, -0.04625736007561, 4482777.06}, {3.09191371068437e-9, 0.000008983055096812155, 0.00006995724062, 23.10934304144901, -0.00023663490511, -0.6321817810242, -0.00663494467273, 0.03430082397953, -0.00466043876332, 2555164.4}, {2.890871144776878e-9, 0.000008983055095805407, -3.068298e-8, 7.47137025468032, -0.00000353937994, -0.02145144861037, -0.00001234426596, 0.00010322952773, -0.00000323890364, 826088.5}};
            private static Double[][] LL2MC = {{-0.0015702102444, 111320.7020616939, 1704480524535203d, -10338987376042340d, 26112667856603880d, -35149669176653700d, 26595700718403920d, -10725012454188240d, 1800819912950474d, 82.5}, {0.0008277824516172526, 111320.7020463578, 647795574.6671607, -4082003173.641316, 10774905663.51142, -15171875531.51559, 12053065338.62167, -5124939663.577472, 913311935.9512032, 67.5}, {0.00337398766765, 111320.7020202162, 4481351.045890365, -23393751.19931662, 79682215.47186455, -115964993.2797253, 97236711.15602145, -43661946.33752821, 8477230.501135234, 52.5}, {0.00220636496208, 111320.7020209128, 51751.86112841131, 3796837.749470245, 992013.7397791013, -1221952.21711287, 1340652.697009075, -620943.6990984312, 144416.9293806241, 37.5}, {-0.0003441963504368392, 111320.7020576856, 278.2353980772752, 2485758.690035394, 6070.750963243378, 54821.18345352118, 9540.606633304236, -2710.55326746645, 1405.483844121726, 22.5}, {-0.0003218135878613132, 111320.7020701615, 0.00369383431289, 823725.6402795718, 0.46104986909093, 2351.343141331292, 1.58060784298199, 8.77738589078284, 0.37238884252424, 7.45}};
    
            /**
             * 墨卡托坐标转经纬度坐标
             * @param x
             * @param y
             * @return
             */
            public static Map<String, Double> convertMC2LL(Double x, Double y) {
                Double[] cF = null;
                x = Math.abs(x);
                y = Math.abs(y);
    
                for (int cE = 0; cE < MCBAND.length; cE++) {
                    if (y >= MCBAND[cE]) {
                        cF = MC2LL[cE];
                        break;
                    }
                }
                Map<String,Double> location = converter(x, y, cF);
                location.put("lng",location.get("x"));
                location.remove("x");
                location.put("lat",location.get("y"));
                location.remove("y");
                return location;
            }
    
    
            /**
             * 经纬度坐标转墨卡托坐标
             * @param lng
             * @param lat
             * @return
             */
            private static Map<String, Double> convertLL2MC(Double lng, Double lat) {
                Double[] cE = null;
                lng = getLoop(lng, -180, 180);
                lat = getRange(lat, -74, 74);
                for (int i = 0; i < LLBAND.length; i++) {
                    if (lat >= LLBAND[i]) {
                        cE = LL2MC[i];
                        break;
                    }
                }
                if (cE!=null) {
                    for (int i = LLBAND.length - 1; i >= 0; i--) {
                        if (lat <= -LLBAND[i]) {
                            cE = LL2MC[i];
                            break;
                        }
                    }
                }
                return converter(lng,lat, cE);
            }
    
    
            private static Map<String, Double> converter(Double x, Double y, Double[] cE) {
                Double xTemp = cE[0] + cE[1] * Math.abs(x);
                Double cC = Math.abs(y) / cE[9];
                Double yTemp = cE[2] + cE[3] * cC + cE[4] * cC * cC + cE[5] * cC * cC * cC + cE[6] * cC * cC * cC * cC + cE[7] * cC * cC * cC * cC * cC + cE[8] * cC * cC * cC * cC * cC * cC;
                xTemp *= (x < 0 ? -1 : 1);
                yTemp *= (y < 0 ? -1 : 1);
                Map<String, Double> location = new HashMap<String, Double>();
                location.put("x", xTemp);
                location.put("y", yTemp);
                return location;
            }
    
            private static Double getLoop(Double lng, Integer min, Integer max) {
                while (lng > max) {
                    lng -= max - min;
                }
                while (lng < min) {
                    lng += max - min;
                }
                return lng;
            }
    
            private static Double getRange(Double lat, Integer min, Integer max) {
                if (min != null) {
                    lat = Math.max(lat, min);
                }
                if (max != null) {
                    lat = Math.min(lat, max);
                }
                return lat;
            }
    }

    二 : 国际坐标即gps坐标、百度坐标、火星坐标转换

    /** 
     * @ClassName: PositionUtil 
     * @Description: 
     * 各地图API坐标系统比较与转换;
     * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
     * 谷歌地图采用的是WGS84地理坐标系(中国范围除外);
     * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
     * 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系; BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
     * 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。 chenhua
     * @author: Max dou
     * @date: 2017年4月10日 下午4:17:44 
     */
    public class PositionUtil {
        public static final String BAIDU_LBS_TYPE = "bd09ll";
    
        public static double pi = 3.1415926535897932384626;
        public static double a = 6378245.0;
        public static double ee = 0.00669342162296594323;
    
        /**
         * 国际坐标 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System
         * 
         * @param lat
         * @param lon
         * @return
         */
        public static Gps gps84_To_Gcj02(double lat, double lon) {
            if (outOfChina(lat, lon)) {
                return null;
            }
            double dLat = transformLat(lon - 105.0, lat - 35.0);
            double dLon = transformLon(lon - 105.0, lat - 35.0);
            double radLat = lat / 180.0 * pi;
            double magic = Math.sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
            double mgLat = lat + dLat;
            double mgLon = lon + dLon;
            return new Gps(mgLat, mgLon);
        }
    
        /**
         * * 火星坐标系 (GCJ-02) to 国际坐标 * * @param lon * @param lat * @return
         * */
        public static Gps gcj_To_Gps84(double lat, double lon) {
            Gps gps = transform(lat, lon);
            double lontitude = lon * 2 - gps.getWgLon();
            double latitude = lat * 2 - gps.getWgLat();
            return new Gps(latitude, lontitude);
        }
    
        /**
         * 火星坐标系 (GCJ-02) to 百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标
         * 
         * @param gg_lat
         * @param gg_lon
         */
        public static Gps gcj02_To_Bd09(double gg_lat, double gg_lon) {
            double x = gg_lon, y = gg_lat;
            double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);
            double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);
            double bd_lon = z * Math.cos(theta) + 0.0065;
            double bd_lat = z * Math.sin(theta) + 0.006;
            return new Gps(bd_lat, bd_lon);
        }
    
        /**
         * * 火星坐标系 (GCJ-02) to 百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param
         * bd_lat * @param bd_lon * @return
         */
        public static Gps bd09_To_Gcj02(double bd_lat, double bd_lon) {
            double x = bd_lon - 0.0065, y = bd_lat - 0.006;
            double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);
            double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);
            double gg_lon = z * Math.cos(theta);
            double gg_lat = z * Math.sin(theta);
            return new Gps(gg_lat, gg_lon);
        }
    
        /**
         * 百度坐标系 (BD-09) to 国际坐标
         * @param bd_lat
         * @param bd_lon
         * @return
         */
        public static Gps bd09_To_Gps84(double bd_lat, double bd_lon) {
    
            Gps gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat, bd_lon);
            Gps map84 = PositionUtil.gcj_To_Gps84(gcj02.getWgLat(),
                    gcj02.getWgLon());
            return map84;
    
        }
    
        public static boolean outOfChina(double lat, double lon) {
            if (lon < 72.004 || lon > 137.8347)
                return true;
            if (lat < 0.8293 || lat > 55.8271)
                return true;
            return false;
        }
    
        public static Gps transform(double lat, double lon) {
            if (outOfChina(lat, lon)) {
                return new Gps(lat, lon);
            }
            double dLat = transformLat(lon - 105.0, lat - 35.0);
            double dLon = transformLon(lon - 105.0, lat - 35.0);
            double radLat = lat / 180.0 * pi;
            double magic = Math.sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
            double mgLat = lat + dLat;
            double mgLon = lon + dLon;
            return new Gps(mgLat, mgLon);
        }
    
        public static double transformLat(double x, double y) {
            double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                    + 0.2 * Math.sqrt(Math.abs(x));
            ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
            ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
            return ret;
        }
    
        public static double transformLon(double x, double y) {
            double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                    * Math.sqrt(Math.abs(x));
            ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
            ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0
                    * pi)) * 2.0 / 3.0;
            return ret;
        }
    
        public static void main(String[] args) {
            Gps gps = new Gps(40.084481,116.395412 );
            System.out.println("gps :" + gps);
            Gps bd = bd09_To_Gcj02(gps.getWgLat(), gps.getWgLon());
            System.out.println("bd  :" + bd);
        }
    }
    
    /** 
     * @ClassName: Gps 
     * @Description: TODO
     * @author: Max dou
     * @date: 2017年4月10日 下午4:19:13 
     */
    public class Gps {
        private double wgLat;
        private double wgLon;
        public Gps(double wgLat, double wgLon) {
        setWgLat(wgLat);
        setWgLon(wgLon);
        }
        public double getWgLat() {
        return wgLat;
        }
        public void setWgLat(double wgLat) {
        this.wgLat = wgLat;
        }
        public double getWgLon() {
        return wgLon;
        }
        public void setWgLon(double wgLon) {
        this.wgLon = wgLon;
        }
        @Override
        public String toString() {
        return wgLat + "," + wgLon;
        }
    }

    三 : 利用百度地图api接口,坐标转换

     参考链接:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
    
    此接口为免费接口,不过每天有限制
    

    四 : 利用百度地图api接口,根据坐标获取地理位置信息
    参考链接:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
    此接口为免费接口,不过每天有限制:
    限制:

    /**
     * @ClassName: BaiDuUtil
     * @Description: TODO
     * @author: Max dou
     * @date: 2017年4月10日 上午11:58:55
     */
    public class BaiDuUtil {
        public static String getCity(String lat, String lng) {
            JSONObject objSrc = getLocationInfo(lat, lng);
            System.out.println(objSrc.toString());
            JSONObject obj = getLocationInfo(lat, lng).getJSONObject("result")
                    .getJSONObject("addressComponent");
            return obj.getString("city");
        }
    
        public static JSONObject getLocationInfo(String lat, String lng) {
            String url = "http://api.map.baidu.com/geocoder/v2/?location=" + lat
                    + "," + lng + "&output=json&ak=" + "此处填写百度开放平台秘钥"
                    + "&pois=0";
            JSONObject obj = JSONObject.fromObject(HttpUtil.getRequest(url));
            return obj;
        }
        public static void main(String[] args) {
            System.out.println(BaiDuUtil.getCity("40.091637", "116.396764"));
        }
    }

    五 : 阿里云接口 : 根据坐标获取地理位置信息
    (此接口从网上找到的,已现在测试看没有限制条件)

    需要json解析包:
    <dependency>      
        <groupId>net.sf.json-lib</groupId>     
        <artifactId>json-lib</artifactId>      
        <version>2.4</version>      
        <classifier>jdk15</classifier>    
    </dependency>  
    
    import java.net.URL;
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    /** 
     * @ClassName: GetLocation 
     * @Description: TODO
     * @author: Max dou
     * @date: 2017年4月10日 下午1:53:42 
     */
    public class GetLocation {
         public static void main(String[] args) {  
                 String add = getAdd("110.303959", "23.548133");  
                 JSONObject jsonObject = JSONObject.fromObject(add);  
                 JSONArray jsonArray = JSONArray.fromObject(jsonObject.getString("addrList"));  
                 JSONObject j_2 = JSONObject.fromObject(jsonArray.get(1));  
                 JSONObject j_1 = JSONObject.fromObject(jsonArray.get(0));  
                 String allAdd = j_2.getString("admName");  
                 String arr[] = allAdd.split(",");  
                 System.out.println("省:"+arr[0]+"\n市:"+arr[1]+"\n区:"+arr[2]+"\n路:"+j_1.getString("name")+"\n详细地址:"+j_2.getString("name"));  
            }  
    
            public static String getAdd(String log, String lat ){  
                //lat 小  log  大  ,经过测试,数据的经纬度为国家坐标即火星坐标
                //参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)  
                String urlString = "http://gc.ditu.aliyun.com/regeocoding?l="+lat+","+log+"&type=111";  
                String res = "";
                try {     
                    URL url = new URL(urlString);    
                    java.net.HttpURLConnection conn = (java.net.HttpURLConnection)url.openConnection();    
                    conn.setDoOutput(true);    
                    conn.setRequestMethod("POST");    
                    java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),"UTF-8"));    
                    String line;    
                   while ((line = in.readLine()) != null) {    
                       res += line+"\n";    
                   }    
                    in.close();    
                } catch (Exception e) {    
                    System.out.println("error in wapaction,and e is " + e.getMessage());    
                }   
                System.out.println(res);  
                return res;    
            } 
    }
    

    如有什么问题,请大家指正,谢谢!
    
    展开全文
  • WGS-84坐标:世界标准经纬度坐标系(GPS/北斗设备得到的经纬度) GCJ-02坐标:中国国内使用的经纬度坐标系(火星坐标系),是经过WGS-84坐标系换算得到的,比如WGS-84坐标系经纬度为45°30’ 20在火星坐标系下对应...

    WGS-84坐标:世界标准经纬度坐标系(GPS/北斗设备得到的经纬度)
    GCJ-02坐标:中国国内使用的经纬度坐标系(火星坐标系),是经过WGS-84坐标系换算得到的,比如WGS-84坐标系下经纬度为45°30’ 20在火星坐标系下对应的就是45+30/60+20/3600。
    BD-09坐标:百度地图特有坐标系,在火星坐标系的基础上经过二次加密得到(具体转换算法此处省略),可以调用百度地图api进行转换。
    其余坐标系:搜狗地图、奥维互动地图等基本都是在火星地图坐标系基础上进行二次加密。

    奥维地图导出成kml格式文件经纬度是WGS-84坐标系,导出成txt格式可以勾选WGS84 或者GCJ-02坐标系。

    展开全文
  • 地图坐标系转换

    2018-04-24 15:36:47
    设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84...
  • 项目中用到了 北斗车辆导航,app用的高德插件,因为高德(GCj02坐标系)与北斗(WGS84 坐标系)采用的坐标系不同,就在网上找了转换方法,用PHP写了一遍 代码里面还有百度的 BD-09 坐标,关于各种地图坐标的坐标系大家...
    
    
    项目中用到了 北斗车辆导航,app用的高德插件,因为高德(GCj02坐标系)与北斗(WGS84 坐标系)采用的坐标系不同,就在网上找了转换方法,用PHP写了一遍
    代码里面还有百度的 BD-09 坐标,关于各种地图坐标的坐标系大家可以自己查资料了解。
    误差测试
    1、北斗转高德
    
    
     源数据 :117.093457,39.077387 
     高德转换 117.099876,39.078529
     本地转换 117.099884,39.078533
    
    
    2、高德转北斗,再转高德
    
    
     源数据 :				117.095563,39.077410  高德获取的高新区发展六道坐标
     本地转换成北斗坐标:   117.089142,39.076267
     本地转换成高德坐标:	117.095565,39.077412
    
    
      源数据 :				117.087199,39.090175	117大厦
      本地转换成北斗坐标:  117.080784,39.089027
      本地转换成高德坐标:	117.087198,39.090174
    
    3、天津 117大厦坐标经过本地转成北斗,再转回高德后的误差

    
    
    下面是代码:
    备注:因为项目中只用到了北斗与高德之前的经纬度转换,所以对于其他的转换函数未做测试,如果要用代码的话请自己测试误差大小
    <?php
    class Map
    {
        const x_PI  = 52.35987755982988;
        const PI  = 3.1415926535897932384626;
        const a = 6378245.0;
        const ee = 0.00669342162296594323;
    
    
        /**
         * WGS84转GCj02(北斗转高德)
         * @param lng
         * @param lat
         * @returns {*[]}
         */
        public function wgs84togcj02($lng,  $lat) {
            if ($this->out_of_china($lng, $lat)) {
                return array($lng, $lat);
            } else {
                $dlat = $this->transformlat($lng - 105.0, $lat - 35.0);
                $dlng = $this->transformlng($lng - 105.0, $lat - 35.0);
                $radlat = $lat / 180.0 * self::PI;
                $magic = sin($radlat);
                $magic = 1 - self::ee * $magic * $magic;
                $sqrtmagic = sqrt($magic);
                $dlat = ($dlat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrtmagic) * self::PI);
                $dlng = ($dlng * 180.0) / (self::a / $sqrtmagic * cos($radlat) * self::PI);
                $mglat = $lat + $dlat;
                $mglng = $lng + $dlng;
                return array($mglng, $mglat);
            }
        }
        /**
         * GCJ02 转换为 WGS84 (高德转北斗)
         * @param lng
         * @param lat
         * @return array(lng, lat);
         */
        public function gcj02towgs84($lng, $lat) {
            if ($this->out_of_china($lng, $lat)) {
                return array($lng, $lat);
            } else {
                $dlat = $this->transformlat($lng - 105.0, $lat - 35.0);
                $dlng = $this->transformlng($lng - 105.0, $lat - 35.0);
                $radlat = $lat / 180.0 * self::PI;
                $magic = sin($radlat);
                $magic = 1 - self::ee * $magic * $magic;
                $sqrtmagic = sqrt($magic);
                $dlat = ($dlat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrtmagic) * self::PI);
                $dlng = ($dlng * 180.0) / (self::a / $sqrtmagic * cos($radlat) * self::PI);
                $mglat = $lat + $dlat;
                $mglng = $lng + $dlng;
                return array($lng * 2 - $mglng, $lat * 2 - $mglat);
            }
        }
    
    
            /**
          * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
          * 即 百度 转 谷歌、高德
          * @param bd_lon
          * @param bd_lat
          * @returns
      */
            public function bd09togcj02 ($bd_lon, $bd_lat) {
                $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
                $x = $bd_lon - 0.0065;
                $y = $bd_lat - 0.006;
                $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
                $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
                $gg_lng = $z * cos(theta);
                $gg_lat = $z * sin(theta);
                return array($gg_lng, $gg_lat);
            }
    
        /**
        * GCJ-02 转换为 BD-09  (火星坐标系 转百度即谷歌、高德 转 百度)
        * @param $lng
        * @param $lat
        * @returns array(bd_lng, bd_lat)
        */
        public function gcj02tobd09($lng, $lat) { 
            $z = sqrt($lng * $lng + $lat * $lat) + 0.00002 * Math.sin($lat * x_PI);
            $theta = Math.atan2($lat, $lng) + 0.000003 * Math.cos($lng * x_PI);
            $bd_lng = $z * cos($theta) + 0.0065;
            $bd_lat = z * sin($theta) + 0.006;
            return array($bd_lng, $bd_lat);
        }
    
    
        private function transformlat($lng, $lat) {
            $ret = -100.0 + 2.0 * $lng + 3.0 * $lat + 0.2 * $lat * $lat + 0.1 * $lng * $lat + 0.2 * sqrt(abs($lng));
            $ret += (20.0 * sin(6.0 * $lng * self::PI) + 20.0 * sin(2.0 * $lng * self::PI)) * 2.0 / 3.0;
            $ret += (20.0 * sin($lat * self::PI) + 40.0 * sin($lat / 3.0 * self::PI)) * 2.0 / 3.0;
            $ret += (160.0 * sin($lat / 12.0 * self::PI) + 320 * sin($lat * self::PI / 30.0)) * 2.0 / 3.0;
            return $ret;
        }
        private function transformlng($lng, $lat) {
            $ret = 300.0 + $lng + 2.0 * $lat + 0.1 * $lng * $lng + 0.1 * $lng * $lat + 0.1 * sqrt(abs($lng));
            $ret += (20.0 * sin(6.0 * $lng * self::PI) + 20.0 * sin(2.0 * $lng * self::PI)) * 2.0 / 3.0;
            $ret += (20.0 * sin($lng * self::PI) + 40.0 * sin($lng / 3.0 * self::PI)) * 2.0 / 3.0;
            $ret += (150.0 * sin($lng / 12.0 * self::PI) + 300.0 * sin($lng / 30.0 * self::PI)) * 2.0 / 3.0;
            return $ret;
        }
    
    
        private function rad($param)
        {
          return  $param * self::PI / 180.0;
        }
        /**
        * 判断是否在国内,不在国内则不做偏移
        * @param $lng
        * @param $lat
        * @returns {boolean}
        */
        private function out_of_china($lng, $lat) { 
            return ($lng < 72.004 || $lng > 137.8347) || (($lat < 0.8293 || $lat > 55.8271) || false);
        }
    
    }
    
    $test = new Map();
    var_dump($test->wgs84togcj02(117.087199,39.090175));
    
    ?>

    
    
    
    
    展开全文
  • 各地图坐标系转换; WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,谷歌地图采用的是WGS84地理坐标系(中国范围除外); GCJ02坐标系:即火星坐标...
    package position;
    
    import org.junit.Test;
    
    /**
     * 各地图API坐标系统比较与转换;
     * 
     * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,谷歌地图采用的是WGS84地理坐标系(中国范围除外);
     * 
     * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系;
     * 
     * BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
     * 
     * 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。
     * 
     * @author chenhua
     * 
     */
    public class PositionUtil
    {
    	private static double pi = 3.1415926535897932384626;
    	private static double a = 6378245.0;
    	private static double ee = 0.00669342162296594323;
    
    	@Test
    	public void t1()
    	{
    		// 北斗芯片获取的经纬度为WGS84地理坐标 31.426896,119.496145
    
    		Gps gps = new Gps(31.426896, 119.496145);
    		System.out.println("gps :" + gps);
    
    		Gps gcj = gps84_To_Gcj02(gps.getWgLat(), gps.getWgLon());
    		System.out.println("gcj :" + gcj);
    
    		Gps star = gcj_To_Gps84(gcj.getWgLat(), gcj.getWgLon());
    		System.out.println("star:" + star);
    
    		Gps bd = gcj02_To_Bd09(gcj.getWgLat(), gcj.getWgLon());
    		System.out.println("bd  :" + bd);
    
    		Gps gcj2 = bd09_To_Gcj02(bd.getWgLat(), bd.getWgLon());
    		System.out.println("gcj :" + gcj2);
    
    	}
    
    	/**
    	 * 84 to 火星坐标系 (GCJ-02)
    	 * 
    	 * World Geodetic System ==> Mars Geodetic System
    	 * 
    	 * @param lat
    	 * @param lon
    	 * @return
    	 */
    	public static Gps gps84_To_Gcj02(double lat, double lon)
    	{
    		if (outOfChina(lat, lon))
    		{
    			return null;
    		}
    		double dLat = transformLat(lon - 105.0, lat - 35.0);
    		double dLon = transformLon(lon - 105.0, lat - 35.0);
    		double radLat = lat / 180.0 * pi;
    		double magic = Math.sin(radLat);
    		magic = 1 - ee * magic * magic;
    		double sqrtMagic = Math.sqrt(magic);
    		dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
    		dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
    		double mgLat = lat + dLat;
    		double mgLon = lon + dLon;
    
    		return new Gps(mgLat, mgLon);
    	}
    
    	/**
    	 * 火星坐标系 (GCJ-02) to 84
    	 * 
    	 * @param lon
    	 * @param lat
    	 * @return
    	 */
    	public Gps gcj_To_Gps84(double lat, double lon)
    	{
    		Gps gps = transform(lat, lon);
    		double lontitude = lon * 2 - gps.getWgLon();
    		double latitude = lat * 2 - gps.getWgLat();
    
    		return new Gps(latitude, lontitude);
    
    	}
    
    	/**
    	 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
    	 * 
    	 * 将 GCJ-02 坐标转换成 BD-09 坐标
    	 * 
    	 * @param gg_lat
    	 * @param gg_lon
    	 */
    	public static Gps gcj02_To_Bd09(double gg_lat, double gg_lon)
    	{
    		double x = gg_lon, y = gg_lat;
    
    		double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);
    
    		double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);
    
    		double bd_lon = z * Math.cos(theta) + 0.0065;
    
    		double bd_lat = z * Math.sin(theta) + 0.006;
    
    		return new Gps(bd_lat, bd_lon);
    	}
    
    	/**
    	 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
    	 * 
    	 * 将 BD-09 坐标转换成GCJ-02 坐标
    	 * 
    	 * @param bd_lat
    	 * @param bd_lon
    	 * @return
    	 */
    	public static Gps bd09_To_Gcj02(double bd_lat, double bd_lon)
    	{
    		double x = bd_lon - 0.0065, y = bd_lat - 0.006;
    
    		double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);
    
    		double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);
    
    		double gg_lon = z * Math.cos(theta);
    
    		double gg_lat = z * Math.sin(theta);
    
    		return new Gps(gg_lat, gg_lon);
    	}
    
    	private static boolean outOfChina(double lat, double lon)
    	{
    		if (lon < 72.004 || lon > 137.8347)
    			return true;
    		if (lat < 0.8293 || lat > 55.8271)
    			return true;
    		return false;
    	}
    
    	private Gps transform(double lat, double lon)
    	{
    		if (outOfChina(lat, lon))
    		{
    			return new Gps(lat, lon);
    		}
    		double dLat = transformLat(lon - 105.0, lat - 35.0);
    		double dLon = transformLon(lon - 105.0, lat - 35.0);
    		double radLat = lat / 180.0 * pi;
    		double magic = Math.sin(radLat);
    		magic = 1 - ee * magic * magic;
    		double sqrtMagic = Math.sqrt(magic);
    		dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
    		dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
    		double mgLat = lat + dLat;
    		double mgLon = lon + dLon;
    
    		return new Gps(mgLat, mgLon);
    	}
    
    	private static double transformLat(double x, double y)
    	{
    		double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
    		ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
    		ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
    		ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
    		return ret;
    	}
    
    	private static double transformLon(double x, double y)
    	{
    		double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
    		ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
    		ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
    		ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
    		return ret;
    	}
    
    }
    
    package position;
    
    public class Gps
    {
    
    	private double wgLat;
    	private double wgLon;
    
    	public Gps(double wgLat, double wgLon)
    	{
    		setWgLat(wgLat);
    		setWgLon(wgLon);
    	}
    
    	public double getWgLat()
    	{
    		return wgLat;
    	}
    
    	public void setWgLat(double wgLat)
    	{
    		this.wgLat = wgLat;
    	}
    
    	public double getWgLon()
    	{
    		return wgLon;
    	}
    
    	public void setWgLon(double wgLon)
    	{
    		this.wgLon = wgLon;
    	}
    
    	@Override
    	public String toString()
    	{
    		return wgLat + "," + wgLon;
    	}
    
    }
    


     
    


    展开全文
  • GPS坐标转换经纬度及换算方法

    千次阅读 2013-04-11 13:58:34
    地形图坐标系:我国的地形图采用高斯-克吕格平面直角坐标系。在该坐标系中,横轴:赤道,用Y表示;纵轴:中央经线,用X表示;坐标原点:中央经线与赤 道的交点,用0表示。赤道以南为负,以北为正;中央经线以东为...
  • 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系。 GCJ02坐标系 火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。 BD09坐标系 百度地图使用坐标系,...
  • C#各种坐标系转换源码,百度转WGS,火星转WGS,WGS转火星,快速实现批量转换,使用性较高
  • PHP坐标系转换

    2019-03-28 17:58:36
    PHP坐标系转换 1.坐标系 WGS84:地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,最基础的坐标,谷歌地图在非中国地区使用的坐标系。使用地图:GPS/谷歌地图卫星。 ...
  • 地图坐标系转换简介

    2020-08-28 17:09:03
    地图坐标系转换简介及问题分享 背景介绍 从android系统定位获取到的经纬度,到谷歌地图查询,发现定位偏移很大,以为是定位误差或者定位策略问题导致,实际上并非如此,详情以下分解。 各坐标系简介 WGS84...
  • 【GNSS】北斗坐标系

    千次阅读 2021-04-23 17:21:24
    1. 北斗坐标系 一个全球卫星导航定位系统的基本任务是为全球用户提供可用性、完好性、连续性和精度符合规定要求的导航定位服务。卫星导航系统赖以导航定位的大地基准是其使用的坐标系。坐标系对导航定位系统的重要...
  • 来源:微信公众号中国测绘学会引文格式:魏子卿, 吴富梅, 刘光明. 北斗坐标系[J]. 测绘学报,2019,48(7):805-809. DOI: 10.11947/j.AGCS.2019...
  • 对.gpx文件进行地图坐标系转换

    千次阅读 2020-10-02 13:11:07
    设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,最基础的坐标,谷歌地图在非中国地区使用的坐标系 GPS/谷歌地图卫星 GCJ02 火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。并要求...
  • 坐标系转换

    2017-07-17 19:02:00
    目前国内主要有以下三种坐标系: 1. 地球坐标WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系; 国际标准,从专业GPS 设备中取出的数据的坐标系 国际地图提供商使用的坐标系 2...
  • 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,    * 谷歌地图采用的是WGS84地理坐标系(中国范围除外);    * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统...
  • % 各地图API坐标系统比较与转换; % WGS84坐标系:即地球坐标系,国际...设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, % 谷歌地图采用的是WGS84地理坐标系(中国范围除外); % GCJ02坐标系:即火星
  • 一、笔名 主流被使用的地理坐标系并不统一,常见的有wgs84、gcj02(月球坐标系)、bd09(百度坐标系)此外百度地图中留存矢量信息的web墨卡托,本文利用python编写相关类以实现4种坐标功能之间的相互转换。...
  • 高精度地图及定位常涉及到的坐标系有:地心地固坐标系、大地坐标系、站心坐标系。 1、地心地固坐标系:Earth-Centered, Earth-Fixed,简称ECEF。Z轴指向协议地球北极方向,X轴指向零子午面和赤道的交点,Y轴与Z轴、X...
  • 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, 谷歌地图采用的是WGS84地理坐标系(中国范围除外); GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系...
  • 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系...
  • 三种常见经纬度坐标系的转化

    万次阅读 2019-05-15 18:06:23
    三种常见经纬度坐标系的转化 我们常用的地图api坐标系有wgs84坐标系,gcj02坐标系,bd09坐标系。 wgs坐标系是国际上通用的坐标系,也称地球坐标系,gps和北斗系统都使用的是wgs坐标系。谷歌地图使用的是wgs坐标系...
  • 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS...
  • 背景:从GPS和北斗卫星定位得到的定位数据采用的都是WGS84坐标系,即地球坐标系,但是国内不管是高德地图、百度地图采用的并不是WGS84坐标系,所以需要经过转换后才能使用,前端用百度API提供的方法转换速度较慢。...
  • 高德使用的是gcj-02坐标系,百度使用的是bd09坐标系,注意其间的相互转换 1.首先创建一个GPS对象类 public class Gps { private double wgLat; private double wgLon; public Gps(double wgLon, double wgLat)...
  • 设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, # * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); # * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS...
  • 各种国内地图坐标系总结

    万次阅读 多人点赞 2018-08-29 14:33:56
    一、国内的常用坐标系 1、WGS-84坐标系:地心坐标系,GPS原始坐标体系 在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。 2、GCJ-02 坐标系:国测局坐标,火星坐标系 1)国测局02年发布的坐标体系...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 329
精华内容 131
关键字:

北斗坐标系转换经纬度