首页 > 编程语言 >Java工具 - 坐标系WGS-84,GCJ-02,BD-09之间的相互转换

Java工具 - 坐标系WGS-84,GCJ-02,BD-09之间的相互转换

时间:2024-03-08 09:22:24浏览次数:35  
标签:02 BD Point double 09 longitude latitude new Math

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

/**
* 地图坐标转换
*/
public class GpsCoordinateUtils {

private static final double PI = 3.1415926535897932384626433832795;
// private static final double PI = 3.14159265358979324;
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坐标数据
//Mainland
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)
};

//Taiwan
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)
};

//Hainan
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)
};

//Chongming
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<Point[]> CHINA_POLYGON = new ArrayList<>();

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

 

 

引用:https://www.cnblogs.com/helios-fz/p/11177080.html

标签:02,BD,Point,double,09,longitude,latitude,new,Math
From: https://www.cnblogs.com/ckfuture/p/18060304

相关文章

  • 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告
     首页政策法规考试介绍考试安排考试用书考试研究与对外交流各地联系方式2024年03月08日 丨回到首页 当前位置:首页>工作动态关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告2024-01-22 来源:中国计算机技术职业资格网关于2023年......
  • 2024年度计算机技术与软件专业技术资格(水平)考试工作计划
     首页政策法规考试介绍考试安排考试用书考试研究与对外交流各地联系方式2024年03月08日 丨回到首页 当前位置:首页>考试安排2024年度计算机技术与软件专业技术资格(水平)考试工作计划2024-03-05 来源:中国计算机技术职业资格网声明:本网(www.rua......
  • 联合省选2024游记&反思
    Day0干了啥来着,好像打了点板子,打了点摆,中间被拉去给学弟学妹拍了中考祝福视频,然后一天就过去了。其实没什么心理压力,反正进队希望不是很大。Day1进场发现右边是lcj,左边是lzx,但是他没有来,所以左边变成了wxr。开题发现其实每个题看起来都挺可做的?画了画图发现自己似乎会了......
  • Git 开源的版本控制系统-02-base usage 基本用法
    拓展阅读Subversion开源的版本控制系统入门介绍VCSGit开源的版本控制系统-01-入门使用介绍Git开源的版本控制系统-02-baseusage基本用法Git开源的版本控制系统-03-时间数据回溯Git开源的版本控制系统-04-branchmanage分支管理Git开源的版本控制系统-05-tags标签......
  • 2024天梯选拔赛(一)
    2024天梯选拔赛(一)A私人笑声#include<bits/stdc++.h>#definedebug(a)cout<<#a<<"="<<a<<'\n';usingnamespacestd;usingi64=longlong;typedefpair<i64,i64>PII;intmain(){ios::sync_with_stdio......
  • 【专题】2023年中国奢侈品市场数字化趋势洞察报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33672原文出处:拓端数据部落公众号2022年,中国的奢侈品消费市场一直处于不断变化和挑战之中,但随着2023年的到来,中国正在全面复苏,市场也充满了机遇和想象空间。自2019年以来,奢侈品品牌一直在中国尝试本地化和数字化策略,将中国的奢侈品消费者与国内市......
  • 2023年第十四届蓝桥杯大赛软件类省赛Java大学B组真题
    2023年第十四届蓝桥杯大赛软件类省赛Java大学B组真题C.数组分割思路:因为最后要是分为2组偶数。由于偶数+偶数=偶数,奇数+奇数=偶数。那么我们的奇数个数一定要是偶数个。如果奇数个数为奇数个那直接就不行了,答案是0。如果奇数的个数是偶数的话,假设偶数n个,奇数m个。\(C_{n}^{0}+......
  • CSP_J2023总结
    维护中include<bits/stdc++.h>usingnamespacestd;intn,ans,k;intmain(){ cin>>n; while(n){ ans++; if(k==0&&n%3==1)k=ans; if(n%3==0)n-=n/3; elsen-=n/3+1; } cout<<ans<<""<<k; return0;}......
  • 2024.3.7习题总结
    CF1288C题目可以把\(a\)数组和\(b\)数组的倒序合并,这样,题目就成了求出长度为\(2m\)的序列递增的方案数,\(dp\)求解可以把长度为\(2m\)的差分数组。对于任意一个\(c_i\),\(c_i\ge0,\sumc_i\len\),所以方案数为\(C_{n+2*m-1}^{2*m}\)CF1569C......
  • 【LeetCode】209. 长度最小的子数组
    题目:209.长度最小的子数组解题思路:初始化最小长度,设置为最大值,当最小长度变小时,该值更新设置left和right指针,left指针用于记录左边界,当求和sum大于target时,左指针右移;right指针记录右边界,当求和sum小于target时,右指针右移,继续寻找符合要求的子字符串。当右边界符合题目要求......