?墨卡托坐標(biāo)轉(zhuǎn)換 此方法轉(zhuǎn)換結(jié)果最接近騰訊地圖文章來源地址http://www.zghlxwxcb.cn/news/detail-417595.html
package cn.ydxiaoshuai.gis;
import java.math.BigDecimal;
/**
* Description 墨卡托坐標(biāo)轉(zhuǎn)換 此方法轉(zhuǎn)換結(jié)果最接近騰訊地圖
* https://lbs.qq.com/service/webService/webServiceGuide/webServiceTranslate
* ProjectName worktools
* Created by 小帥丶 on 2023-04-17 16:28.
* Version 1.0
*/
public class MercatorWGS84ConvertUtil {
/**
* @EARTH_CIRCLE_HALF 地球赤道周長的一半
* 地球半徑6378137米,赤道周長2*PI*r = 2 * 20037508.3427892,
* 墨卡托坐標(biāo)x軸區(qū)間[-20037508.3427892,20037508.3427892]
* 墨卡托坐標(biāo)系:展開地球,赤道作為x軸,向東為x軸正方,本初子午線作為y軸,向北為y軸正方向。
**/
private static BigDecimal EARTH_CIRCLE_HALF = new BigDecimal(20037508.34);
/**
* @EARTH_RADIUS 地球半徑
**/
private static BigDecimal EARTH_RADIUS = new BigDecimal(6378137.0);
/**
* @STRAIGHT_ANGLE 平角 180°
**/
private static BigDecimal STRAIGHT_ANGLE = new BigDecimal(180);
private static CoordinateBean mercatorToWGS84(BigDecimal mercatorLngX,
BigDecimal mercatorLatY){
CoordinateBean coord = new CoordinateBean();
BigDecimal coordLng = mercatorLngX.divide(EARTH_CIRCLE_HALF,BigDecimal.ROUND_CEILING).setScale(4,BigDecimal.ROUND_HALF_EVEN)
.multiply(STRAIGHT_ANGLE).setScale(4,BigDecimal.ROUND_HALF_EVEN);
BigDecimal coordLat = mercatorLatY.divide(EARTH_CIRCLE_HALF,BigDecimal.ROUND_CEILING).setScale(4,BigDecimal.ROUND_HALF_EVEN)
.multiply(STRAIGHT_ANGLE).setScale(4,BigDecimal.ROUND_HALF_EVEN);
Double tempLat = STRAIGHT_ANGLE.doubleValue() /
Math.PI * (2 * Math.atan(Math.exp(coordLat.doubleValue() * Math.PI /
STRAIGHT_ANGLE.doubleValue())) - Math.PI / 2);
coordLat = new BigDecimal(tempLat).setScale(4,BigDecimal.ROUND_HALF_EVEN);
coord.setCoordLngX(coordLng);
coord.setCoordLatY(coordLat);
System.out.println(coordLng.doubleValue() + "===" + coordLat);
return coord;
}
private static CoordinateBean WGS84ToMercator(BigDecimal lng,
BigDecimal lat){
CoordinateBean coord = new CoordinateBean();
BigDecimal PI = new BigDecimal(Math.PI);
BigDecimal coordLng = lng.multiply(PI)
.divide(STRAIGHT_ANGLE,BigDecimal.ROUND_CEILING)
.multiply(EARTH_RADIUS)
.setScale(4,BigDecimal.ROUND_HALF_EVEN);
BigDecimal tempParam = lat.multiply(PI).divide(STRAIGHT_ANGLE,BigDecimal.ROUND_CEILING)
.setScale(4,BigDecimal.ROUND_HALF_EVEN);
Double tempLat = EARTH_RADIUS.doubleValue()
/ 2 * Math.log((1.0 + Math.sin(tempParam.doubleValue()))
/ (1.0 - Math.sin(tempParam.doubleValue())));
BigDecimal coordLat = new BigDecimal(tempLat).setScale(4,BigDecimal.ROUND_HALF_EVEN);
coord.setCoordLngX(coordLng);
coord.setCoordLatY(coordLat);
System.out.println(coordLng.toPlainString() + "===" + coordLat.toPlainString());
return coord;
}
public static void main(String[] args) {
BigDecimal coordLng = new BigDecimal(39419429.2936);
BigDecimal coordLat = new BigDecimal(4452052.1597);
//代碼轉(zhuǎn)換 39.996===89.7629 騰訊地圖 轉(zhuǎn)換 39.99303 === 89.740407
mercatorToWGS84(coordLat,coordLng);
}
}
package cn.ydxiaoshuai.gis;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* Description
* ProjectName workdemo
* Created by 小帥丶 on 2023-04-17 17:09.
* Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CoordinateBean {
private BigDecimal coordLngX;
private BigDecimal coordLatY;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-417595.html
到了這里,關(guān)于【 Java-小記錄】墨卡托投影坐標(biāo)轉(zhuǎn)換經(jīng)緯度方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!