WGS84转为北京54坐标 ---Android Demo

来源:互联网 发布:绕过网络白名单限制 编辑:程序博客网 时间:2024/05/20 15:42

WGS84转为北京54坐标

坐标转换大致分为下面四个步骤:

1.B,L,H84—–>(X,Y,Z)84 ,空间大地坐标到空间直角坐标的转换。

2.X,Y,Z84—–>(X,Y,Z)54 ,坐标基准的转换,即

Datum转换。通常有三种转换方法:七参数、简化三参数、Molodensky

3.X,Y,Z54—–>(B,L,H)54 ,空间直角坐标到空间大地坐标的转换。

4.B,L,H54—–>(x,y) ,高斯投影正算。

高斯投影:


以下为代码:

根据WGS84和北京54坐标计算三参数
 
package fuguang.cannonballsystem;

import fuguang.common.JConfig;
import fuguang.common.common;
import fuguang.common.config;
import fuguang.common.errno;
import fuguang.model.Coordinate;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class JSettingActivity extends Activity
{
// WGS84坐标系的三个参数
private EditText mWGS84BEditText;
private EditText mWGS84LEditText;
private EditText mWGS84HEditText;

// 北京54坐标系的三个参数private EditText mBJ54XEditText;private EditText mBJ54YEditText;private EditText mBJ54ZEditText;// 三个平移参数private EditText mParamXEditText;private EditText mParamYEditText;private EditText mParamZEditText;// 中央经线private EditText mZYEditText;// 保存按钮private Button mSaveButton;// 计算按钮private Button mCountButton;@Overrideprotected void onCreate(Bundle savedInstanceState){    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_setting);    mBJ54XEditText = (EditText) findViewById(R.id.editText_Activity_BJ54_X);    mBJ54YEditText = (EditText) findViewById(R.id.editText_Activity_BJ54_Y);    mBJ54ZEditText = (EditText) findViewById(R.id.editText_Activity_BJ54_Z);    mWGS84BEditText = (EditText) findViewById(R.id.editText_Activity_Wgs84_B);    mWGS84LEditText = (EditText) findViewById(R.id.editText_Activity_Wgs84_L);    mWGS84HEditText = (EditText) findViewById(R.id.editText_Activity_Wgs84_H);    mParamXEditText = (EditText) findViewById(R.id.editText_Activity_X1);    mParamYEditText = (EditText) findViewById(R.id.editText_Activity_Y1);    mParamZEditText = (EditText) findViewById(R.id.editText_Activity_Z1);    mSaveButton = (Button) findViewById(R.id.button_Activity_Save);    mCountButton = (Button) findViewById(R.id.button_Activity_Count);    mZYEditText = (EditText) findViewById(R.id.editText_Activity_ZY);    mSaveButton.setOnClickListener(new OnSaveButtonClickListener());    mCountButton.setOnClickListener(new OnCountButtonClickListener());    JConfig.Initialize(JSettingActivity.this);    synchronized (JConfig.mLock) {        if (JConfig.get().mX1 != 0 && JConfig.get().mY1 != 0 && JConfig            .get().mZ1 != 0) {            mParamXEditText.setText("" + JConfig.get().mX1);            mParamYEditText.setText("" + JConfig.get().mY1);            mParamZEditText.setText("" + JConfig.get().mZ1);        }        if (JConfig.get().mZY != 0) {            mZYEditText.setText("" + JConfig.get().mZY);        }    }}@Overrideprotected void onStop(){    super.onStop();}@Overrideprotected void onDestroy(){    super.onDestroy();}public class OnSaveButtonClickListener implements OnClickListener{    @Override    public void onClick(View v)    {        if (mParamXEditText.getText().toString().equals("") || mParamXEditText            .getText() == null) {            Toast.makeText(                JSettingActivity.this, "△X不能为空", Toast.LENGTH_LONG).show();        }        else if (mParamXEditText.getText().toString().equals("") || mParamXEditText            .getText() == null) {            Toast.makeText(                JSettingActivity.this, "△Y不能为空", Toast.LENGTH_LONG).show();        }        else if (mParamXEditText.getText().toString().equals("") || mParamXEditText            .getText() == null) {            Toast.makeText(                JSettingActivity.this, "△Z不能为空", Toast.LENGTH_LONG).show();        }        else if (mZYEditText.getText().toString().equals("") || mZYEditText            .getText() == null) {            Toast                .makeText(                    JSettingActivity.this, "中央经线不能为空", Toast.LENGTH_LONG)                .show();        }        else {            synchronized (JConfig.mLock) {                try {                    JConfig.get().mX1 = Double.parseDouble(mParamXEditText                        .getText().toString());                    JConfig.get().mY1 = Double.parseDouble(mParamYEditText                        .getText().toString());                    JConfig.get().mZ1 = Double.parseDouble(mParamZEditText                        .getText().toString());                    JConfig.get().mZY = Double.parseDouble(mZYEditText                        .getText().toString());                    if (JConfig.SaveConfig() == errno.S_OK) {                        Toast.makeText(                            JSettingActivity.this, "保存成功",                            Toast.LENGTH_LONG).show();                    }                    else {                        Toast.makeText(                            JSettingActivity.this, "保存失败",                            Toast.LENGTH_LONG).show();                    }                }                catch (Exception e) {                    Toast                        .makeText(                            JSettingActivity.this, "保存失败",                            Toast.LENGTH_LONG).show();                }            }        }    }}public class OnCountButtonClickListener implements OnClickListener{    @Override    public void onClick(View v)    {        double a = 6378137.00;        double pianxinlv = 0.0066943799013;        double hudu = 57.2957795130823;// 180/PI        try {            double B = Double.parseDouble(mWGS84BEditText                .getText().toString());            double L = Double.parseDouble(mWGS84LEditText                .getText().toString());            double H = Double.parseDouble(mWGS84HEditText                .getText().toString());            double X = Double.parseDouble(mBJ54XEditText                .getText().toString());            double Y = Double.parseDouble(mBJ54YEditText                .getText().toString());            double Z = Double.parseDouble(mBJ54ZEditText                .getText().toString());            double N = a / Math.sqrt(1 - pianxinlv * Math.pow(                (Math.sin(B / hudu)), 2));            double X1 = (N + H / hudu) * Math.cos(B / hudu) * Math                .cos(L / hudu);            double Y1 = (N + H / hudu) * Math.cos(B / hudu) * Math                .sin(L / hudu);            double Z1 = (N * (1 - pianxinlv) + H / hudu) * Math                .sin(B / hudu);            mParamXEditText.setText(X1 - X + "");            mParamYEditText.setText(Y1 - Y + "");            mParamZEditText.setText(Z1 - Z + "");        }        catch (Exception e) {            Toast.makeText(                JSettingActivity.this, "参数不能为空", Toast.LENGTH_LONG).show();            e.printStackTrace();        }    }}
}
/**     * 将WGS84坐标转换为北京54坐标     * @param WGS84 location     * @return 北京54 坐标     */    public static Coordinate WGS84ToBJ54(Location location)    {        // 三参数计算结果        double X2, Y2, Z2;        double hudu = 57.2957795130823;// 180/PI        double a = 6378137.00;        double pianxinlv = 0.0066943799013;        double B = location.getLatitude();        double L = location.getLongitude();        double H = location.getAltitude();        double N = a / Math.sqrt(1 - pianxinlv * Math.pow(            (Math.sin(B / hudu)), 2));        double a54 = 6378245;        double b54 = 6356752.314;        double pianxinlv54 = 0.006693421622966;        double pianxinlv542 = 0.006738525414683;        double zy;
    // WGS84经纬度坐标转化为北京54空间直角坐标    X2 = ((N + H / hudu) * Math.cos(B / hudu) * Math.cos(L / hudu) )- JConfig         .get().mX1;    Y2 = ((N + H / hudu) * Math.cos(B / hudu) * Math.sin(L / hudu) )- JConfig         .get().mY1;    Z2 = ((N * (1 - pianxinlv) + H / hudu) * Math.sin(B / hudu) )- JConfig         .get().mZ1;    zy = JConfig.get().mZY;    // 北京54空间直角坐标转化为经纬度坐标    double q = Math.atan(Z2 * a54 / (Math.sqrt(Math.pow(X2, 2) + Math.pow(        Y2, 2)) * b54));    double L54 = Math.atan(Y2 / X2) * hudu + 180;    double B54 = hudu * Math        .atan((Z2 + pianxinlv542 * b54 * Math.pow(Math.sin(q), 3)) / (Math            .sqrt(Math.pow(X2, 2) + Math.pow(Y2, 2)) - pianxinlv54 * a54 * Math            .pow(Math.cos(q), 3)));    // 北京54经纬度转化为高斯平面坐标    return BLH2Gauss54(L54, B54, zy);}public static Coordinate BLH2Gauss54(double jd, double wd, double LP){    double t; // t=tgB    double l0; // 经差    double jd_hd, wd_hd; // 将jd、wd转换成以弧度为单位    double et2; // et2 = (e' ** 2) * (cosB ** 2)    double N; // N = C / sqrt(1 + et2)    double X; // 克拉索夫斯基椭球中子午弧长    double m; // m = cosB * PI/180 * l0    double tsin, tcos; // sinB,cosB    double PI = 3.14159265358979;    double b_e2 = 0.0067385254147;    double b_c = 6399698.90178271;    double hudu = 57.2957795130823;// 180/PI    jd_hd = jd / hudu; // 将经度转换成弧度    wd_hd = wd / hudu; // 将纬度转换成弧度    l0 = jd - LP; // 计算经差    tsin = Math.sin(wd_hd); // 计算sinB    tcos = Math.cos(wd_hd); // 计算cosB    // 计算克拉索夫斯基椭球中子午弧长X    X = 111134.8611 * wd - (32005.7799 * tsin + 133.9238 * Math        .pow(tsin, 3) + 0.6976 * Math.pow(tsin, 5) + 0.0039 * Math.pow(        tsin, 7)) * tcos;    et2 = b_e2 * Math.pow(tcos, 2); // et2 = (e' ** 2) * (cosB ** 2)    N = b_c / Math.sqrt(1 + et2); // N = C / sqrt(1 + et2)    t = Math.tan(wd_hd); // t=tgB    m = PI / 180 * l0 * tcos; // m = cosB * PI/180 * l0    Coordinate coordinate = new Coordinate();    coordinate.Latitude = X + N * t * (0.5 * Math.pow(m, 2) + (5.0 - Math        .pow(t, 2) + 9.0 * et2 + 4 * Math.pow(et2, 2)) * Math.pow(m, 4) / 24.0 + (61.0 - 58.0 * Math        .pow(t, 2) + Math.pow(t, 4)) * Math.pow(m, 6) / 720.0);    coordinate.Longitude = N * (m + (1.0 - Math.pow(t, 2) + et2) * Math        .pow(m, 3) / 6.0 + (5.0 - 18.0 * Math.pow(t, 2) + Math.pow(t, 4) + 14.0 * et2 - 58.0 * et2 * Math        .pow(t, 2)) * Math.pow(m, 5) / 120.0) + 500000;    return coordinate;}
0 0
原创粉丝点击