java utm坐标转经纬度,关于经纬度坐标与utm坐标之间的相互转换api

/** Author: Sami Salkosuo, sami.salkosuo@fi.ibm.com

*

* (c) Copyright IBM Corp. 2007*/

packagecom.baidu.traffic.sc.common.util;//add by liushouyun 20190515 for convert UTM & lat/lon//IBMhttps://www.ibm.com/developerworks/cn/java/j-coordconvert/index.html#artdownload

importjava.util.Hashtable;importjava.util.Map;public classCoordinateConversion {publicCoordinateConversion() {

}public double[] utm2LatLon(String UTM) {

UTM2LatLon c= newUTM2LatLon();returnc.convertUTMToLatLong(UTM);

}public String latLon2UTM(double latitude, doublelongitude) {

LatLon2UTM c= newLatLon2UTM();returnc.convertLatLonToUTM(latitude, longitude);

}private void validate(double latitude, doublelongitude) {if (latitude < -90.0 || latitude > 90.0 || longitude < -180.0

|| longitude >= 180.0) {throw newIllegalArgumentException("Legal ranges: latitude [-90,90], longitude [-180,180).");

}

}public String latLon2MGRUTM(double latitude, doublelongitude) {

LatLon2MGRUTM c= newLatLon2MGRUTM();returnc.convertLatLonToMGRUTM(latitude, longitude);

}public double[] mgrutm2LatLon(String MGRUTM) {

MGRUTM2LatLon c= newMGRUTM2LatLon();returnc.convertMGRUTMToLatLong(MGRUTM);

}public double degreeToRadian(doubledegree) {return degree * Math.PI / 180;

}public double radianToDegree(doubleradian) {return radian * 180 /Math.PI;

}private double POW(double a, doubleb) {returnMath.pow(a, b);

}private double SIN(doublevalue) {returnMath.sin(value);

}private double COS(doublevalue) {returnMath.cos(value);

}private double TAN(doublevalue) {returnMath.tan(value);

}private classLatLon2UTM {public String convertLatLonToUTM(double latitude, doublelongitude) {

validate(latitude, longitude);

String UTM= "";

setVariables(latitude, longitude);

String longZone=getLongZone(longitude);

LatZones latZones= newLatZones();

String latZone=latZones.getLatZone(latitude);double _easting =getEasting();double _northing =getNorthing(latitude);

UTM= longZone + " " + latZone + " " + ((int) _easting) + " "

+ ((int) _northing);//UTM = longZone + " " + latZone + " " + decimalFormat.format(_easting) +//" "+ decimalFormat.format(_northing);

returnUTM;

}protected void setVariables(double latitude, doublelongitude) {

latitude=degreeToRadian(latitude);

rho= equatorialRadius * (1 - e *e)/ POW(1 - POW(e * SIN(latitude), 2), 3 / 2.0);

nu= equatorialRadius / POW(1 - POW(e * SIN(latitude), 2), (1 / 2.0));doublevar1;if (longitude < 0.0) {

var1= ((int) ((180 + longitude) / 6.0)) + 1;

}else{

var1= ((int) (longitude / 6)) + 31;

}double var2 = (6 * var1) - 183;double var3 = longitude -var2;

p= var3 * 3600 / 10000;

S= A0 * latitude - B0 * SIN(2 * latitude) + C0 * SIN(4 * latitude) -D0* SIN(6 * latitude) + E0 * SIN(8 *latitude);

K1= S *k0;

K2= nu * SIN(latitude) * COS(latitude) * POW(sin1, 2) * k0 * (100000000)/ 2;

K3= ((POW(sin1, 4) * nu * SIN(latitude) * Math.pow(COS(latitude), 3)) / 24)* (5 - POW(TAN(latitude), 2) + 9 * e1sq * POW(COS(latitude), 2) + 4

* POW(e1sq, 2) * POW(COS(latitude), 4))*k0* (10000000000000000L);

K4= nu * COS(latitude) * sin1 * k0 * 10000;

K5= POW(sin1 * COS(latitude), 3) * (nu / 6)* (1 - POW(TAN(latitude), 2) + e1sq * POW(COS(latitude), 2)) *k0* 1000000000000L;

A6= (POW(p * sin1, 6) * nu * SIN(latitude) * POW(COS(latitude), 5) / 720)* (61 - 58 * POW(TAN(latitude), 2) + POW(TAN(latitude), 4) + 270

* e1sq * POW(COS(latitude), 2) - 330 *e1sq* POW(SIN(latitude), 2)) * k0 * (1E+24);

}protected String getLongZone(doublelongitude) {double longZone = 0;if (longitude < 0.0) {

longZone= ((180.0 + longitude) / 6) + 1;

}else{

longZone= (longitude / 6) + 31;

}

String val= String.valueOf((int) longZone);if (val.length() == 1) {

val= "0" +val;

}returnval;

}protected double getNorthing(doublelatitude) {double northing = K1 + K2 * p * p + K3 * POW(p, 4);if (latitude < 0.0) {

northing= 10000000 +northing;

}returnnorthing;

}protected doublegetEasting() {return 500000 + (K4 * p + K5 * POW(p, 3));

}//Lat Lon to UTM variables//equatorial radius

double equatorialRadius = 6378137;//polar radius

double polarRadius = 6356752.314;//flattening

double flattening = 0.00335281066474748; //(equatorialRadius-polarRadius)/equatorialRadius;//inverse flattening 1/flattening

double inverseFlattening = 298.257223563; //1/flattening;//Mean radius

double rm = POW(equatorialRadius * polarRadius, 1 / 2.0);//scale factor

double k0 = 0.9996;//eccentricity

double e = Math.sqrt(1 - POW(polarRadius / equatorialRadius, 2));double e1sq = e * e / (1 - e *e);double n = (equatorialRadius -polarRadius)/ (equatorialRadius +polarRadius);//r curv 1

double rho = 6368573.744;//r curv 2

double nu = 6389236.914;//Calculate Meridional Arc Length//Meridional Arc

double S = 5103266.421;double A0 = 6367449.146;double B0 = 16038.42955;double C0 = 16.83261333;double D0 = 0.021984404;double E0 = 0.000312705;//Calculation Constants//Delta Long

double p = -0.483084;double sin1 = 4.84814E-06;//Coefficients for UTM Coordinates

double K1 = 5101225.115;double K2 = 3750.291596;double K3 = 1.397608151;double K4 = 214839.3105;double K5 = -2.995382942;double A6 = -1.00541E-07;

}private class LatLon2MGRUTM extendsLatLon2UTM {public String convertLatLonToMGRUTM(double latitude, doublelongitude) {

validate(latitude, longitude);

String mgrUTM= "";

setVariables(latitude, longitude);

String longZone=getLongZone(longitude);

LatZones latZones= newLatZones();

String latZone=latZones.getLatZone(latitude);double _easting =getEasting();double _northing =getNorthing(latitude);

Digraphs digraphs= newDigraphs();

String digraph1=digraphs.getDigraph1(Integer.parseInt(longZone),

_easting);

String digraph2=digraphs.getDigraph2(Integer.parseInt(longZone),

_northing);

String easting= String.valueOf((int) _easting);if (easting.length() < 5) {

easting= "00000" +easting;

}

easting= easting.substring(easting.length() - 5);

String northing;

northing= String.valueOf((int) _northing);if (northing.length() < 5) {

northing= "0000" +northing;

}

northing= northing.substring(northing.length() - 5);

mgrUTM= longZone + latZone + digraph1 + digraph2 + easting +northing;returnmgrUTM;

}

}private class MGRUTM2LatLon extendsUTM2LatLon {public double[] convertMGRUTMToLatLong(String mgrutm) {double[] latlon = {0.0, 0.0};//02CNR0634657742

int zone = Integer.parseInt(mgrutm.substring(0, 2));

String latZone= mgrutm.substring(2, 3);

String digraph1= mgrutm.substring(3, 4);

String digraph2= mgrutm.substring(4, 5);

easting= Double.parseDouble(mgrutm.substring(5, 10));

northing= Double.parseDouble(mgrutm.substring(10, 15));

LatZones lz= newLatZones();double latZoneDegree =lz.getLatZoneDegree(latZone);double a1 = latZoneDegree * 40000000 / 360.0;double a2 = 2000000 * Math.floor(a1 / 2000000.0);

Digraphs digraphs= newDigraphs();double digraph2Index =digraphs.getDigraph2Index(digraph2);double startindexEquator = 1;if ((1 + zone % 2) == 1) {

startindexEquator= 6;

}double a3 = a2 + (digraph2Index - startindexEquator) * 100000;if (a3 <= 0) {

a3= 10000000 +a3;

}

northing= a3 +northing;

zoneCM= -183 + 6 *zone;double digraph1Index =digraphs.getDigraph1Index(digraph1);int a5 = 1 + zone % 3;double[] a6 = {16, 0, 8};double a7 = 100000 * (digraph1Index - a6[a5 - 1]);

easting= easting +a7;

setVariables();double latitude = 0;

latitude= 180 * (phi1 - fact1 * (fact2 + fact3 + fact4)) /Math.PI;if (latZoneDegree < 0) {

latitude= 90 -latitude;

}double d = _a2 * 180 /Math.PI;double longitude = zoneCM -d;if (getHemisphere(latZone).equals("S")) {

latitude= -latitude;

}

latlon[0] =latitude;

latlon[1] =longitude;returnlatlon;

}

}private classUTM2LatLon {doubleeasting;doublenorthing;intzone;

String southernHemisphere= "ACDEFGHJKLM";protectedString getHemisphere(String latZone) {

String hemisphere= "N";if (southernHemisphere.indexOf(latZone) > -1) {

hemisphere= "S";

}returnhemisphere;

}public double[] convertUTMToLatLong(String UTM) {double[] latlon = {0.0, 0.0};

String[] utm= UTM.split(" ");

zone= Integer.parseInt(utm[0]);

String latZone= utm[1];

easting= Double.parseDouble(utm[2]);

northing= Double.parseDouble(utm[3]);

String hemisphere=getHemisphere(latZone);double latitude = 0.0;double longitude = 0.0;if (hemisphere.equals("S")) {

northing= 10000000 -northing;

}

setVariables();

latitude= 180 * (phi1 - fact1 * (fact2 + fact3 + fact4)) /Math.PI;if (zone > 0) {

zoneCM= 6 * zone - 183.0;

}else{

zoneCM= 3.0;

}

longitude= zoneCM -_a3;if (hemisphere.equals("S")) {

latitude= -latitude;

}

latlon[0] =latitude;

latlon[1] =longitude;returnlatlon;

}protected voidsetVariables() {

arc= northing /k0;

mu=arc/ (a * (1 - POW(e, 2) / 4.0 - 3 * POW(e, 4) / 64.0 - 5 * POW(e, 6) / 256.0));

ei= (1 - POW((1 - e * e), (1 / 2.0)))/ (1 + POW((1 - e * e), (1 / 2.0)));

ca= 3 * ei / 2 - 27 * POW(ei, 3) / 32.0;

cb= 21 * POW(ei, 2) / 16 - 55 * POW(ei, 4) / 32;

cc= 151 * POW(ei, 3) / 96;

cd= 1097 * POW(ei, 4) / 512;

phi1= mu + ca * SIN(2 * mu) + cb * SIN(4 * mu) + cc * SIN(6 * mu) +cd* SIN(8 *mu);

n0= a / POW((1 - POW((e * SIN(phi1)), 2)), (1 / 2.0));

r0= a * (1 - e * e) / POW((1 - POW((e * SIN(phi1)), 2)), (3 / 2.0));

fact1= n0 * TAN(phi1) /r0;

_a1= 500000 -easting;

dd0= _a1 / (n0 *k0);

fact2= dd0 * dd0 / 2;

t0= POW(TAN(phi1), 2);

Q0= e1sq * POW(COS(phi1), 2);

fact3= (5 + 3 * t0 + 10 * Q0 - 4 * Q0 * Q0 - 9 * e1sq) * POW(dd0, 4)/ 24;

fact4= (61 + 90 * t0 + 298 * Q0 + 45 * t0 * t0 - 252 * e1sq - 3 *Q0*Q0)* POW(dd0, 6) / 720;// lof1 = _a1 / (n0 *k0);

lof2= (1 + 2 * t0 + Q0) * POW(dd0, 3) / 6.0;

lof3= (5 - 2 * Q0 + 28 * t0 - 3 * POW(Q0, 2) + 8 * e1sq + 24 * POW(t0, 2))* POW(dd0, 5) / 120;

_a2= (lof1 - lof2 + lof3) /COS(phi1);

_a3= _a2 * 180 /Math.PI;

}doublearc;doublemu;doubleei;doubleca;doublecb;doublecc;doublecd;doublen0;doubler0;double_a1;doubledd0;doublet0;doubleQ0;doublelof1;doublelof2;doublelof3;double_a2;doublephi1;doublefact1;doublefact2;doublefact3;doublefact4;doublezoneCM;double_a3;double b = 6356752.314;double a = 6378137;double e = 0.081819191;double e1sq = 0.006739497;double k0 = 0.9996;

}private classDigraphs {private Map digraph1 = newHashtable();private Map digraph2 = newHashtable();private String[] digraph1Array = {"A", "B", "C", "D", "E", "F", "G", "H","J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X","Y", "Z"};private String[] digraph2Array = {"V", "A", "B", "C", "D", "E", "F", "G","H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V"};publicDigraphs() {

}

{

digraph1.put(new Integer(1), "A");

digraph1.put(new Integer(2), "B");

digraph1.put(new Integer(3), "C");

digraph1.put(new Integer(4), "D");

digraph1.put(new Integer(5), "E");

digraph1.put(new Integer(6), "F");

digraph1.put(new Integer(7), "G");

digraph1.put(new Integer(8), "H");

digraph1.put(new Integer(9), "J");

digraph1.put(new Integer(10), "K");

digraph1.put(new Integer(11), "L");

digraph1.put(new Integer(12), "M");

digraph1.put(new Integer(13), "N");

digraph1.put(new Integer(14), "P");

digraph1.put(new Integer(15), "Q");

digraph1.put(new Integer(16), "R");

digraph1.put(new Integer(17), "S");

digraph1.put(new Integer(18), "T");

digraph1.put(new Integer(19), "U");

digraph1.put(new Integer(20), "V");

digraph1.put(new Integer(21), "W");

digraph1.put(new Integer(22), "X");

digraph1.put(new Integer(23), "Y");

digraph1.put(new Integer(24), "Z");

digraph2.put(new Integer(0), "V");

digraph2.put(new Integer(1), "A");

digraph2.put(new Integer(2), "B");

digraph2.put(new Integer(3), "C");

digraph2.put(new Integer(4), "D");

digraph2.put(new Integer(5), "E");

digraph2.put(new Integer(6), "F");

digraph2.put(new Integer(7), "G");

digraph2.put(new Integer(8), "H");

digraph2.put(new Integer(9), "J");

digraph2.put(new Integer(10), "K");

digraph2.put(new Integer(11), "L");

digraph2.put(new Integer(12), "M");

digraph2.put(new Integer(13), "N");

digraph2.put(new Integer(14), "P");

digraph2.put(new Integer(15), "Q");

digraph2.put(new Integer(16), "R");

digraph2.put(new Integer(17), "S");

digraph2.put(new Integer(18), "T");

digraph2.put(new Integer(19), "U");

digraph2.put(new Integer(20), "V");

}public intgetDigraph1Index(String letter) {for (int i = 0; i < digraph1Array.length; i++) {if(digraph1Array[i].equals(letter)) {return i + 1;

}

}return -1;

}public intgetDigraph2Index(String letter) {for (int i = 0; i < digraph2Array.length; i++) {if(digraph2Array[i].equals(letter)) {returni;

}

}return -1;

}public String getDigraph1(int longZone, doubleeasting) {int a1 =longZone;double a2 = 8 * ((a1 - 1) % 3) + 1;double a3 =easting;double a4 = a2 + ((int) (a3 / 100000)) - 1;return (String) digraph1.get(new Integer((int) Math.floor(a4)));

}public String getDigraph2(int longZone, doublenorthing) {int a1 =longZone;double a2 = 1 + 5 * ((a1 - 1) % 2);double a3 =northing;double a4 = (a2 + ((int) (a3 / 100000)));

a4= (a2 + ((int) (a3 / 100000.0))) % 20;

a4=Math.floor(a4);if (a4 < 0) {

a4= a4 + 19;

}return (String) digraph2.get(new Integer((int) Math.floor(a4)));

}

}private classLatZones {private char[] letters = {'A', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K','L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Z'};private int[] degrees = {-90, -84, -72, -64, -56, -48, -40, -32, -24, -16,-8, 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 84};private char[] negLetters = {'A', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K','L', 'M'};private int[] negDegrees = {-90, -84, -72, -64, -56, -48, -40, -32, -24,-16, -8};private char[] posLetters = {'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X', 'Z'};private int[] posDegrees = {0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 84};private int arrayLength = 22;publicLatZones() {

}public intgetLatZoneDegree(String letter) {char ltr = letter.charAt(0);for (int i = 0; i < arrayLength; i++) {if (letters[i] ==ltr) {returndegrees[i];

}

}return -100;

}public String getLatZone(doublelatitude) {int latIndex = -2;int lat = (int) latitude;if (lat >= 0) {int len =posLetters.length;for (int i = 0; i < len; i++) {if (lat ==posDegrees[i]) {

latIndex=i;break;

}if (lat >posDegrees[i]) {continue;

}else{

latIndex= i - 1;break;

}

}

}else{int len =negLetters.length;for (int i = 0; i < len; i++) {if (lat ==negDegrees[i]) {

latIndex=i;break;

}if (lat

latIndex= i - 1;break;

}else{continue;

}

}

}if (latIndex == -1) {

latIndex= 0;

}if (lat >= 0) {if (latIndex == -2) {

latIndex= posLetters.length - 1;

}returnString.valueOf(posLetters[latIndex]);

}else{if (latIndex == -2) {

latIndex= negLetters.length - 1;

}returnString.valueOf(negLetters[latIndex]);

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值