ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

经纬度,墨卡托等坐标转换

2021-06-05 15:53:15  阅读:296  来源: 互联网

标签:WGS84 经纬度 pout double System 墨卡托 坐标 println out


经纬度,墨卡托等坐标转换

1.经纬度转墨卡托

1.1Java:

    public static double[] lngLat2Mercator(double lng, double lat) {
        double[] xy = new double[2];
        double x = lng * 20037508.342789 / 180;
        double y = Math.log(Math.tan((90 + lat) * M_PI / 360)) / (M_PI / 180);
        y = y * 20037508.34789 / 180;
        xy[0] = x;
        xy[1] = y;
        return xy;
    }

1.2Scala:

/**
  * 坐标转换
  */
object CoorTransfom {
  private val M_PI = Math.PI

  //经纬度转墨卡托
  def lngLat2Mercator(lng: Double, lat: Double): Array[Double] = {
    val xy = new Array[Double](2)
    val x = lng * 20037508.342789 / 180
    var y = Math.log(Math.tan((90 + lat) * M_PI / 360)) / (M_PI / 180)
    y = y * 20037508.34789 / 180
    xy(0) = x
    xy(1) = y
    xy
  }

}
2.墨卡托转经纬度
    public static double[] mercator2LngLat(double mercatorX, double mercatorY) {
        double[] xy = new double[2];
        double x = mercatorX / 20037508.34 * 180;
        double y = mercatorY / 20037508.34 * 180;
        y = 180 / M_PI * (2 * Math.atan(Math.exp(y * M_PI / 180)) - M_PI / 2);
        xy[0] = x;
        xy[1] = y;
        return xy;
    }
3.proj4方式

原文地址:坐标系转换成墨卡托 java 实现,最好使用成熟proj4或proj470

Maven:

<dependency>
			<groupId>org.osgeo</groupId>
			<artifactId>proj4j</artifactId>
			<version>0.1.0</version>
		</dependency>

源码:

import org.osgeo.proj4j.CRSFactory;
import org.osgeo.proj4j.CoordinateReferenceSystem;
import org.osgeo.proj4j.CoordinateTransform;
import org.osgeo.proj4j.CoordinateTransformFactory;
import org.osgeo.proj4j.ProjCoordinate;

public class Test {

	static final String WGS84_PARAM = "+title=long/lat:WGS84 +proj=longlat +datum=WGS84 +units=degrees";
	CoordinateReferenceSystem WGS84 = crsFactory.createFromParameters("WGS84",
			WGS84_PARAM);

	private static final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();
	private static final CRSFactory crsFactory = new CRSFactory();

	private static CoordinateReferenceSystem createCRS(String crsSpec) {
		CoordinateReferenceSystem crs = null;
		// test if name is a PROJ4 spec
		if (crsSpec.indexOf("+") >= 0 || crsSpec.indexOf("=") >= 0) {
			crs = crsFactory.createFromParameters("Anon", crsSpec);
		} else {
			crs = crsFactory.createFromName(crsSpec);
		}
		// crs = crsFactory.createFromParameters("Anon", crsSpec);

		return crs;
	}

	public static void main(String[] args) {
		// new CoordinateTransformTester(true).checkTransform("EPSG:4269",
		// 117.19625, 31.83879,
		// "+proj=tmerc +lat_0=0 +lon_0=117 +y_0=0 +x_0=500000 +k=0.9996 +pm=0
		// +zone=50 +to_meter=1 +a=6378137 +rf=298.257223563 +nodefs",
		// 1640416.667, 916074.825, 0.1);


//		lonlat2m();
		m2lonlat();
	}

	private static void lonlat2m() {
		System.out.println("....");
		
		// 117.19625 31.83879 518568.9 3522583.9
		double x1 = 117.19625d;
		double y1 = 31.83879d;
		// double x2 = 518568.9d;
		// double y2 = 3522583.9d;

		// String srcCRS = "EPSG:4269";
		String WGS84_PARAM = "+title=long/lat:WGS84 +proj=longlat +datum=WGS84 +units=degrees";
		String tgtCRS = "+proj=tmerc +lat_0=0 +lon_0=117 +y_0=0 +x_0=500000 +k=0.9996 +zone=50 +to_meter=1 +a=6378137 +ellps=WGS84 +units=m +no_defs";

		CoordinateTransform trans = ctFactory
				.createTransform(createCRS(WGS84_PARAM), createCRS(tgtCRS));
		ProjCoordinate pout = new ProjCoordinate();

		ProjCoordinate p = new ProjCoordinate(x1, y1);

		trans.transform(p, pout);

		System.out.println(p.x);
		System.out.println(p.y);
		System.out.println(pout.x);
		System.out.println(pout.y);

		System.out.println("-------		// 117.19625 31.83879 518568.9 3522583.9 ");
		p = new ProjCoordinate(y1, x1);
		trans.transform(p, pout);

//		System.out.println(p.x);
//		System.out.println(p.y);
//		System.out.println(pout.x);
//		System.out.println(pout.y);
	}
	
	
	
	private static void m2lonlat() {
		System.out.println("....");
		
		// 117.19625 31.83879 518568.9 3522583.9
//		double x2 = 117.19625d;
//		double y2 = 31.83879d;
		 double x1 = 518568.9d;
		 double y1 = 3522583.9d;
		
		// String srcCRS = "EPSG:4269";
		String WGS84_PARAM = "+title=long/lat:WGS84 +proj=longlat +datum=WGS84 +units=degrees";
		String tgtCRS = "+proj=tmerc +lat_0=0 +lon_0=117 +y_0=0 +x_0=500000 +k=0.9996 +zone=50 +to_meter=1 +a=6378137 +ellps=WGS84 +units=m +no_defs";
		
		CoordinateTransform trans = ctFactory
				.createTransform( createCRS(tgtCRS),createCRS(WGS84_PARAM));
		ProjCoordinate pout = new ProjCoordinate();
		
		ProjCoordinate p = new ProjCoordinate(x1, y1);
		
		trans.transform(p, pout);
		
		System.out.println(p.x);
		System.out.println(p.y);
		System.out.println(pout.x);
		System.out.println(pout.y);
		
		System.out.println("-------		// 117.19625 31.83879 518568.9 3522583.9 ");
		p = new ProjCoordinate(y1, x1);
		trans.transform(p, pout);
		
//		System.out.println(p.x);
//		System.out.println(p.y);
//		System.out.println(pout.x);
//		System.out.println(pout.y);
	}
}

标签:WGS84,经纬度,pout,double,System,墨卡托,坐标,println,out
来源: https://blog.51cto.com/u_15078339/2869918

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有