2.7.6 坐标转换


坐标转换

坐标转换是指在不同坐标类型之间进行转换。CooRun SDK支持多种坐标之间的转换操作。包括屏幕坐标、三维场景的世界坐标、以及不同坐标系下的经纬高程坐标。

下面简单介绍SDK中使用到的坐标:

1.屏幕坐标 是指三维地图场景在屏幕上显示的直角坐标。它是以场景左上角为坐标原点,水平向右方向为x轴正方向,垂直向下为y轴正方向形成的直角坐标系。

2.世界坐标 是以球心为原点建立的坐标系。它反映的是地球上所有对象的具体位置。对于三维地图来说,他是以世界坐标来描述场景的坐标。

3.经纬度高程坐标 是指地理坐标系统。它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。经度是从本初子午线为0度开始,向东为正、向西为负。向东从0到180度,向西从0到-180度。纬度是从赤道为0度开始,向北从0到90度,向南从0到-90度。高程值是指坐标位置到地球的椭球面的距离。 SDK默认使用的是WGS1984坐标系统。

代码调用示例

Javascript调用

//html
原始点X:<input id="startX" type="number" value="120">
原始点Y:<input id="startY" type="number" value="30">
原始点Z:<input id="startZ" type="number" value="0">
结果点X:<input id="endX" type="number" value="">
结果点Y:<input id="endY" type="number" value="">
结果点Z:<input id="endZ" type="number" value="">
<br/>
<input id="Button0" type="button" value="屏幕坐标转经纬度坐标" onclick="screenToLonlat()" />
<input id="Button1" type="button" value="经纬度坐标转屏幕坐标" onclick="lonlatToScreen()" />
<input id="Button2" type="button" value="三维场景坐标转经纬度坐标" onclick="sceneToLonlat()" />
<input id="Button3" type="button" value="经纬度坐标转三维场景坐标" onclick="lonlatToScene()" />
<input id="Button4" type="button" value="根据平移量计算经纬度新坐标" onclick="transToNewLonlat()" />
<input id="Button5" type="button" value="不同坐标系坐标转换" onclick="transBySrsCode()" />
//js
var startXObj = document.getElementById("startX");
var startYObj = document.getElementById("startY");
var startZObj = document.getElementById("startZ");
var endXObj = document.getElementById("endX");
var endYObj = document.getElementById("endY");
var endZObj = document.getElementById("endZ");
var transformate = map.CreateTransformation();
var srcPos = map.CreatePosition(startXObj.value, startYObj.value, startZObj.value);//创建坐标对象
//屏幕坐标转经纬度坐标
function screenToLonlat() {
    var destPos = transformate.ScreenPosToWorldPos(startXObj.value, startYObj.value);//将屏幕坐标点转换成经纬度坐标
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//经纬度坐标转屏幕坐标
function lonlatToScreen(){
    var srcPos = map.CreatePosition(startXObj.value, startYObj.value, startZObj.value);//创建坐标对象
    var destPos = transformate.ConvertLongLatHeightToScreen(srcPos);//经纬度高程坐标转屏幕坐标
    exportResult(parseInt(destPos.GetX()), parseInt(destPos.GetY()), null);
}
//三维场景坐标转经纬度坐标
function sceneToLonlat(){
    var srcPos = map.CreatePosition(startXObj.value, startYObj.value, startZObj.value);//创建坐标对象
    var destPos = transformate.ConvertXYZToLongLatHeight(srcPos);//场景世界坐标转经纬度高程坐标
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//经纬度坐标转三维场景坐标
function lonlatToScene(){
    var srcPos = map.CreatePosition(startXObj.value, startYObj.value, startZObj.value);//创建坐标对象
    var destPos = transformate.ConvertLongLatHeightToXYZ(srcPos);//经纬度高程坐标转场景世界坐标
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//根据平移量计算经纬度新坐标
function transToNewLonlat(){
    //根据平移参数进行新经纬度计算,参数二表示东西方向,往西为负,往东为正;参数三表示南北方向,往北为正,往南为负;参数四表示上下方向,往上为正,往下为负,单位均为米
    var srcPos = map.CreatePosition(startXObj.value, startYObj.value, startZObj.value);//创建坐标对象
    var destPos = transformate.GetNewPosByTranslate(srcPos, endXObj.value, endYObj.value, endZObj.value);
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//不同坐标系坐标转换
function transBySrsCode(){
    var srcPos = map.CreatePosition(startXObj.value, startYObj.value, startZObj.value);//创建坐标对象
    var destPos = transformate.ConvertCoordBySRS(srcPos,"epsg:4326","epsg:4490");//根据原始坐标系及目标坐标系进行坐标转换
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//输出计算结果
function exportResult(x, y, z){
    endXObj.value = x;
    endYObj.value = y;
    endZObj.value = z;
}

C++调用

CoordinateSystemCOMLib::ITransformatePtr transformate;//坐标转换对象
BaseObjectCOMLib::IPositionPtr srcPos;
CEdit startXObj;//目标经度
CEdit startYObj;//目标纬度
CEdit startZObj;//目标高度
CEdit endXObj;//视点经度
CEdit endYObj;//视点纬度
CEdit endZObj;//视点高度
DOUBLE startX;//目标经度获取值
DOUBLE startY;//目标纬度获取值
DOUBLE startZ;//目标高度获取值
DOUBLE endX;//视点经度获取值
DOUBLE endY;//视点纬度获取值
DOUBLE endZ;//视点高度获取值

//获取输入框内容
void Cf6c5TransformateDlg::getEditValue()
{
    CString m_paramname;
    startXObj.GetWindowText(m_paramname);
    startX = _ttof(m_paramname);
    startYObj.GetWindowText(m_paramname);
    startY = _ttof(m_paramname);
    startZObj.GetWindowText(m_paramname);
    startZ = _ttof(m_paramname);
    endXObj.GetWindowText(m_paramname);
    endX = _ttof(m_paramname);
    endYObj.GetWindowText(m_paramname);
    endY = _ttof(m_paramname);
    endZObj.GetWindowText(m_paramname);
    endZ = _ttof(m_paramname);
}

void Cf6c5TransformateDlg::exportResult(DOUBLE x,DOUBLE y ,DOUBLE z)
{
    std::stringstream streamX,streamY,streamZ;
    streamX << x;
    _bstr_t t = streamX.str().c_str();
    endXObj.SetWindowText(t);
    streamY << y;
    t = streamY.str().c_str();
    endYObj.SetWindowText(t);
    streamZ << z;
    t = streamZ.str().c_str();
    endZObj.SetWindowText(t);
}

//屏幕坐标转经纬度坐标
void Cf6c5TransformateDlg::OnBnClickedscreentolonlat()
{
    getEditValue();
    BaseObjectCOMLib::IPositionPtr pos = transformate->ScreenPosToWorldPos(startX, startY);//将屏幕坐标点转换成经纬度坐标
    exportResult(pos->GetX(),pos->GetY(),pos->GetZ());
}

//经纬度坐标转屏幕坐标
void Cf6c5TransformateDlg::OnBnClickedlonlattoscreen()
{
    getEditValue();
    BaseObjectCOMLib::IPositionPtr srcPos = map->CreatePosition(startX, startY, startZ);//创建坐标对象
    BaseObjectCOMLib::IPositionPtr pos = transformate->ConvertLongLatHeightToScreen(srcPos);//经纬度高程坐标转屏幕坐标
    exportResult(pos->GetX(),pos->GetY(),pos->GetZ());
}

//三维场景坐标转经纬度坐标
void Cf6c5TransformateDlg::OnBnClickedscenetolonlat()
{
    getEditValue();
    BaseObjectCOMLib::IPositionPtr srcPos = map->CreatePosition(startX, startY, startZ);//创建坐标对象
    BaseObjectCOMLib::IPositionPtr pos = transformate->ConvertXYZToLongLatHeight(srcPos);//场景世界坐标转经纬度高程坐标
    exportResult(pos->GetX(),pos->GetY(),pos->GetZ());
}

//经纬度坐标转三维场景坐标
void Cf6c5TransformateDlg::OnBnClickedlonlattoscene()
{
    getEditValue();
    BaseObjectCOMLib::IPositionPtr srcPos = map->CreatePosition(startX, startY, startZ);//创建坐标对象
    BaseObjectCOMLib::IPositionPtr pos = transformate->ConvertLongLatHeightToXYZ(srcPos);//经纬度高程坐标转场景世界坐标
    exportResult(pos->GetX(),pos->GetY(),pos->GetZ());
}

//根据平移量计算经纬度新坐标
void Cf6c5TransformateDlg::OnBnClickedtranstonewlonlat()
{
    getEditValue();
    //根据平移参数进行新经纬度计算,参数二表示东西方向,往西为负,往东为正;参数三表示南北方向,往北为正,往南为负;参数四表示上下方向,往上为正,往下为负,
    BaseObjectCOMLib::IPositionPtr srcPos = map->CreatePosition(startX, startY, startZ);//创建坐标对象
    BaseObjectCOMLib::IPositionPtr pos = transformate->GetNewPosByTranslate(srcPos,endX,endY,endZ);
    exportResult(pos->GetX(),pos->GetY(),pos->GetZ());
}

//不同坐标系坐标转换
void Cf6c5TransformateDlg::OnBnClickedtransbysrscode()
{
    getEditValue();
    BaseObjectCOMLib::IPositionPtr srcPos = map->CreatePosition(startX, startY, startZ);//创建坐标对象
    BaseObjectCOMLib::IPositionPtr pos = transformate->ConvertCoordBySRS(srcPos,"epsg:4326","epsg:4490");//根据原始坐标系及目标坐标系进行坐标转换
    exportResult(pos->GetX(),pos->GetY(),pos->GetZ());
}

C#调用

private void exportResult(double x, double y, double z)
{
    textBox4.Text = x.ToString();
    textBox5.Text = y.ToString();
    textBox6.Text = z.ToString();
}
//屏幕坐标转经纬度坐标
private void screenToLonlat_Click(object sender, EventArgs e)
{
    var destPos = transformate.ScreenPosToWorldPos(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));//将屏幕坐标点转换成经纬度坐标
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//经纬度坐标转屏幕坐标
private void lonlatToScreen_Click(object sender, EventArgs e)
{
    var srcPos = map.CreatePosition(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text));//创建坐标对象
    var destPos = transformate.ConvertLongLatHeightToScreen(srcPos);//经纬度高程坐标转屏幕坐标
    exportResult(destPos.GetX(), destPos.GetY(), 0);
}
//三维场景坐标转经纬度坐标
private void sceneToLonlat_Click(object sender, EventArgs e)
{
    var srcPos = map.CreatePosition(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text));//创建坐标对象
    var destPos = transformate.ConvertXYZToLongLatHeight(srcPos);//场景世界坐标转经纬度高程坐标
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//经纬度坐标转三维场景坐标
private void lonlatToScene_Click(object sender, EventArgs e)
{
    var srcPos = map.CreatePosition(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text));//创建坐标对象
    var destPos = transformate.ConvertLongLatHeightToXYZ(srcPos);//经纬度高程坐标转场景世界坐标
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//根据平移量计算经纬度新坐标
private void transToNewLonlat_Click(object sender, EventArgs e)
{
    //根据平移参数进行新经纬度计算,参数二表示东西方向,往西为负,往东为正;参数三表示南北方向,往北为正,往南为负;参数四表示上下方向,往上为正,往下为负,单位均为米
    var srcPos = map.CreatePosition(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text));//创建坐标对象
    var destPos = transformate.GetNewPosByTranslate(srcPos, Convert.ToDouble(textBox4.Text), Convert.ToDouble(textBox5.Text), Convert.ToDouble(textBox6.Text));
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}
//不同坐标系坐标转换
private void transBySrsCode_Click(object sender, EventArgs e)
{
    var srcPos = map.CreatePosition(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text));//创建坐标对象
    var destPos = transformate.ConvertCoordBySRS(srcPos, "epsg:4326", "epsg:4490");//根据原始坐标系及目标坐标系进行坐标转换
    exportResult(destPos.GetX(), destPos.GetY(), destPos.GetZ());
}

results matching ""

    No results matching ""