Java实现坐标系转换(WGS84、GCJ02、BD-09)

1.WGS84、GCJ02、BD-09

1.1.WGS84(World Geodetic System 1984)

WGS84是为GPS全球定位系统建立的坐标系统,是世界上第一个统一的地心坐标系,因此也被称为大地坐标系、原始坐标系。一般通过GPS记录仪记录下来的经纬度,就是基于WGS84坐标系的数据。

1.2.GCJ-02(国家测量局02号标准)

GCJ-02 是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统,是在WGS84经纬度的基础上执行加密算法而成。因为GPS得到的经纬度直接在 GCJ-02 坐标系下会定位到错误的地点,有种到了火星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系。国测局规定,国内出版的各种地图系统(包括电子形式),必须至少采用 GCJ-02 对地理位置进行首次加密的坐标系,高德和Google在国内都是使用 GCJ-02 坐标系。

1.3.BD-09(Baidu Coordinate System)

DB-09是百度地图使用的坐标系统,它在WGS84基础上进行了一定的偏移和转换。BD-09没有独立的EPSG编码,它是一种百度地图特有的坐标系统。

2.Java实现坐标系之间的转换代码

package com.gnss.common.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * 坐标系转换
 * @author Mr.Li
 * @date 2023-08-02
 */
public class GpsCoordinateUtils {
    private static final double PI = 3.1415926535897932384626433832795;
    private static final double A = 6378245.0;
    private static final double EE = 0.00669342162296594323;

    /**
     * 地球坐标系 WGS-84 to 火星坐标系 GCJ-02
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return [纬度, 经度]
     */
    public static double[] calWGS84toGCJ02(double latitude, double longitude) {
        Point dev = calDev(latitude, longitude);
        double retLat = latitude + dev.getLatitude();
        double retLon = longitude + dev.getLongitude();
        return new double[]{retLat, retLon};
    }

    /**
     * 地球坐标系 WGS-84 to 百度坐标系 BD-09
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return [纬度, 经度]
     */
    public static double[] calWGS84toBD09(double latitude, double longitude) {
        Point dev = calDev(latitude, longitude);
        double retLat = latitude + dev.getLatitude();
        double retLon = longitude + dev.getLongitude();
        return calGCJ02toBD09(retLat, retLon);
    }

    /**
     * 火星坐标系 GCJ-02 to 地球坐标系 WGS-84
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return [纬度, 经度]
     */
    public static double[] calGCJ02toWGS84(double latitude, double longitude) {
        Point dev = calDev(latitude, longitude);
        double retLat = latitude - dev.getLatitude();
        double retLon = longitude - dev.getLongitude();
        dev = calDev(retLat, retLon);
        retLat = latitude - dev.getLatitude();
        retLon = longitude - dev.getLongitude();
        return new double[]{retLat, retLon};
    }

    /**
     * 百度坐标系 BD-09 to 地球坐标系 WGS-84
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return [纬度, 经度]
     */
    public static double[] calBD09toWGS84(double latitude, double longitude) {
        double[] gcj = calBD09toGCJ02(latitude, longitude);
        return calGCJ02toWGS84(gcj[0], gcj[1]);
    }

    private static Point calDev(double latitude, double longitude) {
        if (isOutOfChina(latitude, longitude, false)) {
            return new Point(latitude, latitude);
        }
        double dLat = calLat(longitude - 105.0, latitude - 35.0);
        double dLon = calLon(longitude - 105.0, latitude - 35.0);
        double radLat = latitude / 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);
        return new Point(dLat, dLon);
    }

    private static double calLat(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 calLon(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;
    }

    /**
     * 火星坐标系 GCJ-02 to 百度坐标系 BD-09
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return [纬度, 经度]
     */
    public static double[] calGCJ02toBD09(double latitude, double longitude) {
        double x = longitude, y = latitude;
        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 retLat = z * Math.sin(theta) + 0.006;
        double retLon = z * Math.cos(theta) + 0.0065;
        return new double[]{retLat, retLon};
    }

    /**
     * 百度坐标系 BD-09 to 火星坐标系 GCJ-02
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return [纬度, 经度]
     */
    public static double[] calBD09toGCJ02(double latitude, double longitude) {
        double x = longitude - 0.0065, y = latitude - 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 retLat = z * Math.sin(theta);
        double retLon = z * Math.cos(theta);
        return new double[]{retLat, retLon};
    }

    /**
     * 判断坐标是否在国内
     *
     * @param latitude
     * @param longitude
     * @param precision 是否精确判断范围
     * @return true 在国外,false 在国内
     */
    public static boolean isOutOfChina(double latitude, double longitude, boolean precision) {
        if (precision) {
            return CHINA_POLYGON.stream().noneMatch(point -> pointInPolygon(point, latitude, longitude));
        } else {
            if (longitude < 72.004 || longitude > 137.8347) {
                return true;
            }
            if (latitude < 0.8293 || latitude > 55.8271) {
                return true;
            }
            return false;
        }
    }

    /**
     * 检查坐标点是否在多边形区域内
     *
     * @param polygon   多边形
     * @param latitude  纬度
     * @param longitude 经度
     * @return true 在多边形区域内,false 在多边形区域外
     */
    private static boolean pointInPolygon(Point[] polygon, double latitude, double longitude) {
        int i, j = polygon.length - 1;
        boolean oddNodes = false;
        for (i = 0; i < polygon.length; i++) {
            if ((polygon[i].getLatitude() < latitude && polygon[j].getLatitude() >= latitude
                    || polygon[j].getLatitude() < latitude && polygon[i].getLatitude() >= latitude)
                    && (polygon[i].getLongitude() <= longitude || polygon[j].getLongitude() <= longitude)) {
                if (polygon[i].getLongitude()
                        + (latitude - polygon[i].getLatitude()) / (polygon[j].getLatitude() - polygon[i].getLatitude())
                        * (polygon[j].getLongitude() - polygon[i].getLongitude())
                        < longitude) {
                    oddNodes = !oddNodes;
                }
            }
            j = i;
        }
        return oddNodes;
    }

    static class Point {
        private double longitude;
        private double latitude;

        Point(double latitude, double longitude) {
            this.longitude = longitude;
            this.latitude = latitude;
        }

        public double getLongitude() {
            return longitude;
        }

        public void setLongitude(double longitude) {
            this.longitude = longitude;
        }

        public double getLatitude() {
            return latitude;
        }

        public void setLatitude(double latitude) {
            this.latitude = latitude;
        }

        @Override
        public String toString() {
            return longitude + "," + latitude;
        }
    }

    //region 中国行政边界的WGS84坐标数据
    /**
     * 大陆边境线
     */
    private static final Point[] MAINLAND = new Point[]{
            new Point(27.32083, 88.91693),
            new Point(27.54243, 88.76464),
            new Point(28.00805, 88.83575),
            new Point(28.1168, 88.62435),
            new Point(27.86605, 88.14279),
            new Point(27.82305, 87.19275),
            new Point(28.11166, 86.69527),
            new Point(27.90888, 86.45137),
            new Point(28.15805, 86.19769),
            new Point(27.88625, 86.0054),
            new Point(28.27916, 85.72137),
            new Point(28.30666, 85.11095),
            new Point(28.59104, 85.19518),
            new Point(28.54444, 84.84665),
            new Point(28.73402, 84.48623),
            new Point(29.26097, 84.11651),
            new Point(29.18902, 83.5479),
            new Point(29.63166, 83.19109),
            new Point(30.06923, 82.17525),
            new Point(30.33444, 82.11123),
            new Point(30.385, 81.42623),
            new Point(30.01194, 81.23221),
            new Point(30.20435, 81.02536),
            new Point(30.57552, 80.207),
            new Point(30.73374, 80.25423),
            new Point(30.96583, 79.86304),
            new Point(30.95708, 79.55429),
            new Point(31.43729, 79.08082),
            new Point(31.30895, 78.76825),
            new Point(31.96847, 78.77075),
            new Point(32.24304, 78.47594),
            new Point(32.5561, 78.40595),
            new Point(32.63902, 78.74623),
            new Point(32.35083, 78.9711),
            new Point(32.75666, 79.52874),
            new Point(33.09944, 79.37511),
            new Point(33.42863, 78.93623),
            new Point(33.52041, 78.81387),
            new Point(34.06833, 78.73581),
            new Point(34.35001, 78.98535),
            new Point(34.6118, 78.33707),
            new Point(35.28069, 78.02305),
            new Point(35.49902, 78.0718),
            new Point(35.50133, 77.82393),
            new Point(35.6125, 76.89526),
            new Point(35.90665, 76.55304),
            new Point(35.81458, 76.18061),
            new Point(36.07082, 75.92887),
            new Point(36.23751, 76.04166),
            new Point(36.66343, 75.85984),
            new Point(36.73169, 75.45179),
            new Point(36.91156, 75.39902),
            new Point(36.99719, 75.14787),
            new Point(37.02782, 74.56543),
            new Point(37.17, 74.39089),
            new Point(37.23733, 74.91574),
            new Point(37.40659, 75.18748),
            new Point(37.65243, 74.9036),
            new Point(38.47256, 74.85442),
            new Point(38.67438, 74.35471),
            new Point(38.61271, 73.81401),
            new Point(38.88653, 73.70818),
            new Point(38.97256, 73.85235),
            new Point(39.23569, 73.62005),
            new Point(39.45483, 73.65569),
            new Point(39.59965, 73.95471),
            new Point(39.76896, 73.8429),
            new Point(40.04202, 73.99096),
            new Point(40.32792, 74.88089),
            new Point(40.51723, 74.8588),
            new Point(40.45042, 75.23394),
            new Point(40.64452, 75.58284),
            new Point(40.298, 75.70374),
            new Point(40.35324, 76.3344),
            new Point(41.01258, 76.87067),
            new Point(41.04079, 78.08083),
            new Point(41.39286, 78.39554),
            new Point(42.03954, 80.24513),
            new Point(42.19622, 80.23402),
            new Point(42.63245, 80.15804),
            new Point(42.81565, 80.25796),
            new Point(42.88545, 80.57226),
            new Point(43.02906, 80.38405),
            new Point(43.1683, 80.81526),
            new Point(44.11378, 80.36887),
            new Point(44.6358, 80.38499),
            new Point(44.73408, 80.51589),
            new Point(44.90282, 79.87106),
            new Point(45.3497, 81.67928),
            new Point(45.15748, 81.94803),
            new Point(45.13303, 82.56638),
            new Point(45.43581, 82.64624),
            new Point(45.5831, 82.32179),
            new Point(47.20061, 83.03443),
            new Point(46.97332, 83.93026),
            new Point(46.99361, 84.67804),
            new Point(46.8277, 84.80318),
            new Point(47.0591, 85.52257),
            new Point(47.26221, 85.70139),
            new Point(47.93721, 85.53707),
            new Point(48.39333, 85.76596),
            new Point(48.54277, 86.59791),
            new Point(49.1102, 86.87602),
            new Point(49.09262, 87.34821),
            new Point(49.17295, 87.8407),
            new Point(48.98304, 87.89291),
            new Point(48.88103, 87.7611),
            new Point(48.73499, 88.05942),
            new Point(48.56541, 87.99194),
            new Point(48.40582, 88.51679),
            new Point(48.21193, 88.61179),
            new Point(47.99374, 89.08514),
            new Point(47.88791, 90.07096),
            new Point(46.95221, 90.9136),
            new Point(46.57735, 91.07027),
            new Point(46.29694, 90.92151),
            new Point(46.01735, 91.02651),
            new Point(45.57972, 90.68193),
            new Point(45.25305, 90.89694),
            new Point(45.07729, 91.56088),
            new Point(44.95721, 93.5547),
            new Point(44.35499, 94.71735),
            new Point(44.29416, 95.41061),
            new Point(44.01937, 95.34109),
            new Point(43.99311, 95.53339),
            new Point(43.28388, 95.87901),
            new Point(42.73499, 96.38206),
            new Point(42.79583, 97.1654),
            new Point(42.57194, 99.51012),
            new Point(42.67707, 100.8425),
            new Point(42.50972, 101.8147),
            new Point(42.23333, 102.0772),
            new Point(41.88721, 103.4164),
            new Point(41.87721, 104.5267),
            new Point(41.67068, 104.5237),
            new Point(41.58666, 105.0065),
            new Point(42.46624, 107.4758),
            new Point(42.42999, 109.3107),
            new Point(42.64576, 110.1064),
            new Point(43.31694, 110.9897),
            new Point(43.69221, 111.9583),
            new Point(44.37527, 111.4214),
            new Point(45.04944, 111.873),
            new Point(45.08055, 112.4272),
            new Point(44.8461, 112.853),
            new Point(44.74527, 113.638),
            new Point(45.38943, 114.5453),
            new Point(45.4586, 115.7019),
            new Point(45.72193, 116.2104),
            new Point(46.29583, 116.5855),
            new Point(46.41888, 117.3755),
            new Point(46.57069, 117.425),
            new Point(46.53645, 117.8455),
            new Point(46.73638, 118.3147),
            new Point(46.59895, 119.7068),
            new Point(46.71513, 119.9315),
            new Point(46.90221, 119.9225),
            new Point(47.66499, 119.125),
            new Point(47.99475, 118.5393),
            new Point(48.01125, 117.8046),
            new Point(47.65741, 117.3827),
            new Point(47.88805, 116.8747),
            new Point(47.87819, 116.2624),
            new Point(47.69186, 115.9231),
            new Point(47.91749, 115.5944),
            new Point(48.14353, 115.5491),
            new Point(48.25249, 115.8358),
            new Point(48.52055, 115.8111),
            new Point(49.83047, 116.7114),
            new Point(49.52058, 117.8747),
            new Point(49.92263, 118.5746),
            new Point(50.09631, 119.321),
            new Point(50.33028, 119.36),
            new Point(50.39027, 119.1386),
            new Point(51.62083, 120.0641),
            new Point(52.115, 120.7767),
            new Point(52.34423, 120.6259),
            new Point(52.54267, 120.7122),
            new Point(52.58805, 120.0819),
            new Point(52.76819, 120.0314),
            new Point(53.26374, 120.8307),
            new Point(53.54361, 123.6147),
            new Point(53.18832, 124.4933),
            new Point(53.05027, 125.62),
            new Point(52.8752, 125.6573),
            new Point(52.75722, 126.0968),
            new Point(52.5761, 125.9943),
            new Point(52.12694, 126.555),
            new Point(51.99437, 126.4412),
            new Point(51.38138, 126.9139),
            new Point(51.26555, 126.8176),
            new Point(51.31923, 126.9689),
            new Point(51.05825, 126.9331),
            new Point(50.74138, 127.2919),
            new Point(50.31472, 127.334),
            new Point(50.20856, 127.5861),
            new Point(49.80588, 127.515),
            new Point(49.58665, 127.838),
            new Point(49.58443, 128.7119),
            new Point(49.34676, 129.1118),
            new Point(49.4158, 129.4902),
            new Point(48.86464, 130.2246),
            new Point(48.86041, 130.674),
            new Point(48.60576, 130.5236),
            new Point(48.3268, 130.824),
            new Point(48.10839, 130.6598),
            new Point(47.68721, 130.9922),
            new Point(47.71027, 132.5211),
            new Point(48.09888, 133.0827),
            new Point(48.06888, 133.4843),
            new Point(48.39112, 134.4153),
            new Point(48.26713, 134.7408),
            new Point(47.99207, 134.5576),
            new Point(47.70027, 134.7608),
            new Point(47.32333, 134.1825),
            new Point(46.64017, 133.9977),
            new Point(46.47888, 133.8472),
            new Point(46.25363, 133.9016),
            new Point(45.82347, 133.4761),
            new Point(45.62458, 133.4702),
            new Point(45.45083, 133.1491),
            new Point(45.05694, 133.0253),
            new Point(45.34582, 131.8684),
            new Point(44.97388, 131.4691),
            new Point(44.83649, 130.953),
            new Point(44.05193, 131.298),
            new Point(43.53624, 131.1912),
            new Point(43.38958, 131.3104),
            new Point(42.91645, 131.1285),
            new Point(42.74485, 130.4327),
            new Point(42.42186, 130.6044),
            new Point(42.71416, 130.2468),
            new Point(42.88794, 130.2514),
            new Point(43.00457, 129.9046),
            new Point(42.43582, 129.6955),
            new Point(42.44624, 129.3493),
            new Point(42.02736, 128.9269),
            new Point(42.00124, 128.0566),
            new Point(41.58284, 128.3002),
            new Point(41.38124, 128.1529),
            new Point(41.47249, 127.2708),
            new Point(41.79222, 126.9047),
            new Point(41.61176, 126.5661),
            new Point(40.89694, 126.0118),
            new Point(40.47037, 124.8851),
            new Point(40.09362, 124.3736),
            new Point(39.82777, 124.128),
            new Point(39.8143, 123.2422),
            new Point(39.67388, 123.2167),
            new Point(38.99638, 121.648),
            new Point(38.8611, 121.6982),
            new Point(38.71909, 121.1873),
            new Point(38.91221, 121.0887),
            new Point(39.09013, 121.6794),
            new Point(39.2186, 121.5994),
            new Point(39.35166, 121.7511),
            new Point(39.52847, 121.2283),
            new Point(39.62322, 121.533),
            new Point(39.81138, 121.4683),
            new Point(40.00305, 121.881),
            new Point(40.50562, 122.2987),
            new Point(40.73874, 122.0521),
            new Point(40.92194, 121.1775),
            new Point(40.1961, 120.4468),
            new Point(39.87242, 119.5264),
            new Point(39.15693, 118.9715),
            new Point(39.04083, 118.3273),
            new Point(39.19846, 117.889),
            new Point(38.67555, 117.5364),
            new Point(38.38666, 117.6722),
            new Point(38.16721, 118.0281),
            new Point(38.1529, 118.8378),
            new Point(37.87832, 119.0355),
            new Point(37.30054, 118.9566),
            new Point(37.14361, 119.2328),
            new Point(37.15138, 119.7672),
            new Point(37.35228, 119.8529),
            new Point(37.83499, 120.7371),
            new Point(37.42458, 121.58),
            new Point(37.55256, 122.1282),
            new Point(37.41833, 122.1814),
            new Point(37.39624, 122.5586),
            new Point(37.20999, 122.5972),
            new Point(37.02583, 122.4005),
            new Point(37.01978, 122.5392),
            new Point(36.89361, 122.5047),
            new Point(36.84298, 122.1923),
            new Point(37.00027, 121.9566),
            new Point(36.75889, 121.5944),
            new Point(36.61666, 120.7764),
            new Point(36.52638, 120.96),
            new Point(36.37582, 120.8753),
            new Point(36.42277, 120.7062),
            new Point(36.14075, 120.6956),
            new Point(36.0419, 120.3436),
            new Point(36.26345, 120.3078),
            new Point(36.19998, 120.0889),
            new Point(35.95943, 120.2378),
            new Point(35.57893, 119.6475),
            new Point(34.88499, 119.1761),
            new Point(34.31145, 120.2487),
            new Point(32.97499, 120.8858),
            new Point(32.63889, 120.8375),
            new Point(32.42958, 121.3348),
            new Point(32.11333, 121.4412),
            new Point(32.02166, 121.7066),
            new Point(31.67833, 121.8275),
            new Point(31.86639, 120.9444),
            new Point(32.09361, 120.6019),
            new Point(31.94555, 120.099),
            new Point(32.30638, 119.8267),
            new Point(32.26277, 119.6317),
            new Point(31.90388, 120.1364),
            new Point(31.98833, 120.7026),
            new Point(31.81944, 120.7196),
            new Point(31.30889, 121.6681),
            new Point(30.97986, 121.8828),
            new Point(30.85305, 121.8469),
            new Point(30.56889, 120.9915),
            new Point(30.33555, 120.8144),
            new Point(30.39298, 120.4586),
            new Point(30.19694, 120.15),
            new Point(30.31027, 120.5082),
            new Point(30.06465, 120.7916),
            new Point(30.30458, 121.2808),
            new Point(29.96305, 121.6778),
            new Point(29.88211, 122.1196),
            new Point(29.51167, 121.4483),
            new Point(29.58916, 121.9744),
            new Point(29.19527, 121.9336),
            new Point(29.18388, 121.8119),
            new Point(29.37236, 121.7969),
            new Point(29.19729, 121.7444),
            new Point(29.29111, 121.5611),
            new Point(29.1634, 121.4135),
            new Point(29.02194, 121.6914),
            new Point(28.9359, 121.4908),
            new Point(28.72798, 121.6113),
            new Point(28.84215, 121.1464),
            new Point(28.66993, 121.4844),
            new Point(28.34722, 121.6417),
            new Point(28.13889, 121.3419),
            new Point(28.38277, 121.1651),
            new Point(27.98222, 120.9353),
            new Point(28.07944, 120.5908),
            new Point(27.87229, 120.84),
            new Point(27.59319, 120.5812),
            new Point(27.45083, 120.6655),
            new Point(27.20777, 120.5075),
            new Point(27.28278, 120.1896),
            new Point(27.14764, 120.4211),
            new Point(26.89805, 120.0332),
            new Point(26.64465, 120.128),
            new Point(26.51778, 119.8603),
            new Point(26.78823, 120.0733),
            new Point(26.64888, 119.8668),
            new Point(26.79611, 119.7879),
            new Point(26.75625, 119.5503),
            new Point(26.44222, 119.8204),
            new Point(26.47388, 119.5775),
            new Point(26.33861, 119.658),
            new Point(26.36777, 119.9489),
            new Point(25.99694, 119.4253),
            new Point(26.14041, 119.0975),
            new Point(25.93788, 119.354),
            new Point(25.99069, 119.7058),
            new Point(25.67996, 119.5807),
            new Point(25.68222, 119.4522),
            new Point(25.35333, 119.6454),
            new Point(25.60649, 119.3149),
            new Point(25.42097, 119.1053),
            new Point(25.25319, 119.3526),
            new Point(25.17208, 119.2726),
            new Point(25.2426, 118.8749),
            new Point(24.97194, 118.9866),
            new Point(24.88291, 118.5729),
            new Point(24.75673, 118.7631),
            new Point(24.52861, 118.5953),
            new Point(24.53638, 118.2397),
            new Point(24.68194, 118.1688),
            new Point(24.44024, 118.0199),
            new Point(24.46019, 117.7947),
            new Point(24.25875, 118.1237),
            new Point(23.62437, 117.1957),
            new Point(23.65919, 116.9179),
            new Point(23.355, 116.7603),
            new Point(23.42024, 116.5322),
            new Point(23.23666, 116.7871),
            new Point(23.21083, 116.5139),
            new Point(22.93902, 116.4817),
            new Point(22.73916, 115.7978),
            new Point(22.88416, 115.6403),
            new Point(22.65889, 115.5367),
            new Point(22.80833, 115.1614),
            new Point(22.70277, 114.8889),
            new Point(22.53305, 114.8722),
            new Point(22.64027, 114.718),
            new Point(22.81402, 114.7782),
            new Point(22.69972, 114.5208),
            new Point(22.50423, 114.6136),
            new Point(22.55004, 114.2223),
            new Point(22.42993, 114.3885),
            new Point(22.26056, 114.2961),
            new Point(22.36736, 113.9056),
            new Point(22.50874, 114.0337),
            new Point(22.47444, 113.8608),
            new Point(22.83458, 113.606),
            new Point(23.05027, 113.5253),
            new Point(23.11724, 113.8219),
            new Point(23.05083, 113.4793),
            new Point(22.87986, 113.3629),
            new Point(22.54944, 113.5648),
            new Point(22.18701, 113.5527),
            new Point(22.56701, 113.1687),
            new Point(22.17965, 113.3868),
            new Point(22.04069, 113.2226),
            new Point(22.20485, 113.0848),
            new Point(21.8693, 112.94),
            new Point(21.96472, 112.824),
            new Point(21.70139, 112.2819),
            new Point(21.91611, 111.8921),
            new Point(21.75139, 111.9669),
            new Point(21.77819, 111.6762),
            new Point(21.61264, 111.7832),
            new Point(21.5268, 111.644),
            new Point(21.52528, 111.0285),
            new Point(21.21138, 110.5328),
            new Point(21.37322, 110.3944),
            new Point(20.84381, 110.1594),
            new Point(20.84083, 110.3755),
            new Point(20.64, 110.3239),
            new Point(20.48618, 110.5274),
            new Point(20.24611, 110.2789),
            new Point(20.2336, 109.9244),
            new Point(20.4318, 110.0069),
            new Point(20.92416, 109.6629),
            new Point(21.44694, 109.9411),
            new Point(21.50569, 109.6605),
            new Point(21.72333, 109.5733),
            new Point(21.49499, 109.5344),
            new Point(21.39666, 109.1428),
            new Point(21.58305, 109.1375),
            new Point(21.61611, 108.911),
            new Point(21.79889, 108.8702),
            new Point(21.59888, 108.7403),
            new Point(21.93562, 108.4692),
            new Point(21.59014, 108.5125),
            new Point(21.68999, 108.3336),
            new Point(21.51444, 108.2447),
            new Point(21.54241, 107.99),
            new Point(21.66694, 107.7831),
            new Point(21.60526, 107.3627),
            new Point(22.03083, 106.6933),
            new Point(22.45682, 106.5517),
            new Point(22.76389, 106.7875),
            new Point(22.86694, 106.7029),
            new Point(22.91253, 105.8771),
            new Point(23.32416, 105.3587),
            new Point(23.18027, 104.9075),
            new Point(22.81805, 104.7319),
            new Point(22.6875, 104.3747),
            new Point(22.79812, 104.1113),
            new Point(22.50387, 103.9687),
            new Point(22.78287, 103.6538),
            new Point(22.58436, 103.5224),
            new Point(22.79451, 103.3337),
            new Point(22.43652, 103.0304),
            new Point(22.77187, 102.4744),
            new Point(22.39629, 102.1407),
            new Point(22.49777, 101.7415),
            new Point(22.20916, 101.5744),
            new Point(21.83444, 101.7653),
            new Point(21.14451, 101.786),
            new Point(21.17687, 101.2919),
            new Point(21.57264, 101.1482),
            new Point(21.76903, 101.099),
            new Point(21.47694, 100.6397),
            new Point(21.43546, 100.2057),
            new Point(21.72555, 99.97763),
            new Point(22.05018, 99.95741),
            new Point(22.15592, 99.16785),
            new Point(22.93659, 99.56484),
            new Point(23.08204, 99.5113),
            new Point(23.18916, 98.92747),
            new Point(23.97076, 98.67991),
            new Point(24.16007, 98.89073),
            new Point(23.92999, 97.54762),
            new Point(24.26055, 97.7593),
            new Point(24.47666, 97.54305),
            new Point(24.73992, 97.55255),
            new Point(25.61527, 98.19109),
            new Point(25.56944, 98.36137),
            new Point(25.85597, 98.7104),
            new Point(26.12527, 98.56944),
            new Point(26.18472, 98.73109),
            new Point(26.79166, 98.77777),
            new Point(27.52972, 98.69699),
            new Point(27.6725, 98.45888),
            new Point(27.54014, 98.31992),
            new Point(28.14889, 98.14499),
            new Point(28.54652, 97.55887),
            new Point(28.22277, 97.34888),
            new Point(28.46749, 96.65387),
            new Point(28.35111, 96.40193),
            new Point(28.525, 96.34027),
            new Point(28.79569, 96.61373),
            new Point(29.05666, 96.47083),
            new Point(28.90138, 96.17532),
            new Point(29.05972, 96.14888),
            new Point(29.25757, 96.39172),
            new Point(29.46444, 96.08315),
            new Point(29.03527, 95.38777),
            new Point(29.33346, 94.64751),
            new Point(29.07348, 94.23456),
            new Point(28.6692, 93.96172),
            new Point(28.61876, 93.35194),
            new Point(28.3193, 93.22205),
            new Point(28.1419, 92.71044),
            new Point(27.86194, 92.54498),
            new Point(27.76472, 91.65776),
            new Point(27.945, 91.66277),
            new Point(28.08111, 91.30138),
            new Point(27.96999, 91.08693),
            new Point(28.07958, 90.3765),
            new Point(28.24257, 90.38898),
            new Point(28.32369, 89.99819),
            new Point(28.05777, 89.48749),
            new Point(27.32083, 88.91693)
    };

    /**
     * 台湾区域
     */
    private static final Point[] TAIWAN = new Point[]{
            new Point(25.13474, 121.4441),
            new Point(25.28361, 121.5632),
            new Point(25.00722, 122.0004),
            new Point(24.85028, 121.8182),
            new Point(24.47638, 121.8397),
            new Point(23.0875, 121.3556),
            new Point(21.92791, 120.7196),
            new Point(22.31277, 120.6103),
            new Point(22.54044, 120.3071),
            new Point(23.04437, 120.0539),
            new Point(23.61708, 120.1112),
            new Point(25.00166, 121.0017),
            new Point(25.13474, 121.4441)
    };

    /**
     * 海南区域
     */
    private static final Point[] HAINAN = new Point[]{
            new Point(19.52888, 110.855),
            new Point(19.16761, 110.4832),
            new Point(18.80083, 110.5255),
            new Point(18.3852, 110.0503),
            new Point(18.39152, 109.7594),
            new Point(18.19777, 109.7036),
            new Point(18.50562, 108.6871),
            new Point(19.28028, 108.6283),
            new Point(19.76, 109.2939),
            new Point(19.7236, 109.1653),
            new Point(19.89972, 109.2572),
            new Point(19.82861, 109.4658),
            new Point(19.99389, 109.6108),
            new Point(20.13361, 110.6655),
            new Point(19.97861, 110.9425),
            new Point(19.63829, 111.0215),
            new Point(19.52888, 110.855)
    };

    /**
     * 崇明县
     */
    private static final Point[] CHONGMING = new Point[]{
            new Point(31.80054, 121.2039),
            new Point(31.49972, 121.8736),
            new Point(31.53111, 121.5464),
            new Point(31.80054, 121.2039)
    };
    //endregion

    /**
     * 中国行政边界的WGS84坐标数据,
     * 光线投射算法 (Ray casting algorithm) 获得,
     * 沿海、国界周边地区可能会有误差,更高精度需要调整坐标点
     */
    private static final List CHINA_POLYGON = new ArrayList<>();

    static {
        CHINA_POLYGON.add(MAINLAND);
        CHINA_POLYGON.add(TAIWAN);
        CHINA_POLYGON.add(HAINAN);
        CHINA_POLYGON.add(CHONGMING);
    }
}

你可能感兴趣的:(java,dubbo,开发语言)