WGS84转为北京54坐标 ---Android Demo
来源:互联网 发布:绕过网络白名单限制 编辑:程序博客网 时间:2024/05/20 15:42
WGS84转为北京54坐标
坐标转换大致分为下面四个步骤:
1.(B,L,H)84—–>(X,Y,Z)84 ,空间大地坐标到空间直角坐标的转换。
2.(X,Y,Z)84—–>(X,Y,Z)54 ,坐标基准的转换,即
Datum转换。通常有三种转换方法:七参数、简化三参数、Molodensky。
3.(X,Y,Z)54—–>(B,L,H)54 ,空间直角坐标到空间大地坐标的转换。
4.(B,L,H)54—–>(x,y) ,高斯投影正算。
高斯投影:
以下为代码:
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;}
- WGS84转为北京54坐标 ---Android Demo
- WGS84坐标与北京54坐标转换
- WGS84经纬度坐标与北京54坐标或者…
- 天津90、北京54坐标和WGS84坐标
- 如何实现从WGS84到北京54的坐标转换
- WGS84经纬度坐标与北京54坐标或者西安80坐标的关系
- WGS84经纬度坐标与北京54坐标或者西安80坐标的关系
- 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
- 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
- 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
- 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
- ArcGIS教程:北京54坐标(或西安80)与WGS84的坐标转换
- ArcGIS教程:北京54坐标(或西安80)与WGS84的坐标转换
- 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
- 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
- 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
- WGS84经纬度坐标到北京54高斯投影坐标的转换
- [转]使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
- 问题汇总
- android amr编解码
- React-Native-Android简单环境构建
- 人类社交模拟(python实现)
- IntroductionInterceptor
- WGS84转为北京54坐标 ---Android Demo
- Android文件操作模式
- Hibernate实体类注解大全(转)
- bzoj 1303 |前缀和
- URAL 1198 Jobbery (强连通分量 Tarjan)
- AndroidStudio中如何使用Github
- select sysdate - interval '2' day from dual --计算N天前的日期
- 多字段相同值约束
- Makefile初级详解