JS实现WSG(BLH)和空间直角坐标系(XYZ)相互转换


重新编辑我

点击查看详细内容

/**
 * Created by xsg on 2014/6/23.
 */
var pi_180 = Math.PI / 180;
var _180_pi = 180 / Math.PI;
var projectionTypes = {};
projectionTypes.bj54 = {
    a:6378245,//长半轴
    e2:0.006693421622966//第一偏心率平方
};
projectionTypes.wgs84 = {
    a:6378135,//长半轴
    e2:0.00669437999013//第一偏心率平方
};

var myparams = {
    dx : 31.4,
    dy : -144.3,
    dz : -74.8,
    rx : 0,
    ry : 0,
    rz : 0.814,
    m : -0.38
};
//7坐标系统转换方法
//sourceType:源投影类型 targetType:目标投影类型 params: 7参数 blh:源大地坐标
function coordinateTransfUse7params(sourceType,targetType,params,blh){
    sourceType = sourceType.toLowerCase();
    targetType = targetType.toLowerCase();
    var XYZ1 = _BLH2XYZ(sourceType,blh);
    var XYZ2 = _transXYZBy7params(XYZ1,params);
    var blh2 = _XYZ2BLH(targetType,XYZ2);
    console.log(blh2);
}

function _BLH2XYZ(projectionType,blhObj){//将大地坐标喜欢换为空间直角坐标系
    var e2 = projectionTypes[projectionType].e2;//第一偏心率平方值
    var a = projectionTypes[projectionType].a;//长半轴
    var N = a / Math.sqrt(1 - e2 * Math.sin(blhObj.b * pi_180) * Math.sin(blhObj.b * pi_180));
    var X = (N + blhObj.h) * Math.cos(blhObj.b * pi_180) * Math.cos(blhObj.l * pi_180);
    var Y = (N + blhObj.h) * Math.cos(blhObj.b * pi_180) * Math.sin(blhObj.l * pi_180);
    var Z = [N * (1 - e2 ) + blhObj.h] * Math.sin(blhObj.b * pi_180);
    var resultObj = {};
    resultObj.X = X;
    resultObj.Y = Y;
    resultObj.Z = Z;
    return resultObj;
}

function _transXYZBy7params(xyz0,params){//根据7参数对空间直角坐标系进行运算
    var x0 = xyz0.X;
    var y0 = xyz0.Y;
    var z0 = xyz0.Z;
    var dx = params.dx;
    var dy = params.dy;
    var dz = params.dz;
    var rx = params.rx;
    var ry = params.ry;
    var rz = params.rz;
    var m = params.m;
    var x1 = dx + (1 + m) * x0 + Math.sin(rz / 60 / 60 * pi_180) * y0 - Math.sin(ry / 60 / 60 * pi_180) * z0;
    var y1 = dy + (1 + m) * y0 - Math.sin(rz / 60 / 60 * pi_180) * x0 + Math.sin(rx / 60 / 60 * pi_180) * z0;
    var z1 = dz + (1 + m) * z0 + Math.sin(ry / 60 / 60 * pi_180) * x0 - Math.sin(rx / 60 / 60 * pi_180) * y0;
    var resultObj = {};
    resultObj.X = x1;
    resultObj.Y = y1;
    resultObj.Z = z1;
    return resultObj;
}

function _XYZ2BLH(projectionType,xyz1){
    var a = projectionTypes[projectionType].a;
    var e2 = projectionTypes[projectionType].e2;//第一偏心率平方值
    var X = xyz1.X;
    var Y = xyz1.Y;
    var Z = xyz1.Z;
    var L = Math.atan(Y / X) * _180_pi;
    var B = Math.atan(Z / Math.sqrt(X * X + Y * Y));
    while(true){//迭代计算
        var N = a / Math.sqrt(1 - e2 * Math.sin(B) * Math.sin(B));
        var tempB = Math.atan((N  * e2 * Math.sin(B) + Z ) / Math.sqrt(X * X + Y * Y ));
        B = Math.atan((Z + N * e2 * Math.sin(tempB)) / Math.sqrt(X * X + Y * Y ));
        if(tempB == B){
            break;
        }
    }
    var H = Z / Math.sin(B) - N * (1 - e2);
    B = B * _180_pi;
    var resultObj = {};
    resultObj.L = L;
    resultObj.B = B;
    resultObj.H = H;
    if( resultObj.B < 0 ){
        resultObj.B = resultObj.B + 180;
    }
    if(resultObj.L < 0 ){
        resultObj.L = resultObj.L + 180;
    }
    return resultObj;
}



转载于:https://www.cnblogs.com/marvelousone/p/11265895.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WSG84(World Geodetic System 1984)和CGCS2000(中国大地坐标统2000)是两种常用的地理坐标。在Java中将WSG84转换为CGCS2000可以通过使用坐标转换库来实现。 首先,我们需要确定所使用的坐标转换库。Java中有许多开源的坐标转换库可以使用,例如Geotools和Proj4j。这里以使用Geotools为例进行说明。 在使用Geotools进行坐标转换之前,我们需要先导入相关的库文件。可以在Maven项目中的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-hsql</artifactId> <version>24.1</version> </dependency> ``` 接下来,我们可以使用以下代码将WSG84坐标转换为CGCS2000坐标: ```java import org.geotools.geometry.DirectPosition2D; import org.geotools.referencing.CRS; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; public class CoordinateConversion { public static void main(String[] args) { // 输入的坐标点(WSG84) double longitude = 116.3975; double latitude = 39.9085; // 设置源坐标WSG84) CoordinateReferenceSystem sourceCRS; try { sourceCRS = CRS.decode("EPSG:4326"); } catch (NoSuchAuthorityCodeException | FactoryException e) { e.printStackTrace(); return; } // 设置目标坐标(CGCS2000) CoordinateReferenceSystem targetCRS; try { targetCRS = CRS.decode("EPSG:4490"); } catch (NoSuchAuthorityCodeException | FactoryException e) { e.printStackTrace(); return; } // 创建源坐标点 DirectPosition2D sourcePosition = new DirectPosition2D(sourceCRS, longitude, latitude); // 坐标转换 try { DirectPosition2D targetPosition = (DirectPosition2D) CRS.transform(sourcePosition, targetCRS); double targetLongitude = targetPosition.x; double targetLatitude = targetPosition.y; System.out.println("转换后的坐标(CGCS2000):"); System.out.println("经度:" + targetLongitude); System.out.println("纬度:" + targetLatitude); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码中,首先设置源坐标WSG84(EPSG:4326)和目标坐标为CGCS2000(EPSG:4490),然后创建源坐标点并利用`CRS.transform()`方法进行坐标转换。 运行上述代码后,将输出转换后的CGCS2000坐标,包括经度和纬度。 需要注意的是,WSG84和CGCS2000的坐标定义可能因使用的地理坐标转换库而有所不同,可以根据实际情况进行相应的调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值