Proj4 坐标转换(以北京54坐标转WGS84投影坐标系为例)

// convertor.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "convertor.h"
#include <projects.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

void output_coordinates(const double coords[3][3], const char* msg, bool degtorad = false);

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	HMODULE hModule = ::GetModuleHandle(NULL);

	if (hModule != NULL)
	{
		if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
		{
			_tprintf(_T("错误:  MFC 初始化失败\n"));
			nRetCode = 1;
		}
		else
		{
		}
	}
	else
	{
		_tprintf(_T("错误:  GetModuleHandle 失败\n"));
		nRetCode = 1;
	}
	
	projPJ lcc = pj_init_plus(" +proj=lcc +x_0=0 +y_0=0 +lat_0=0 +lon_0=105 +lat_1=30 +lat_2=62 +a=6378245 +b=6356863.01877305 +no_defs");
	//projPJ lcc = pj_init_plus(" +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +a=6378245 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs");
	projPJ lonlat1 = pj_init_plus(" +proj=longlat +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +no_defs");
	projPJ lonlat2 = pj_init_plus(" +proj=longlat +datum=WGS84 +no_defs");
	projPJ merc = pj_init_plus(" +proj=merc +x_0=0 +y_0=0 +lon_0=0 +lat_1=0 +datum=WGS84 +no_defs");
	double xyz1[3][3] = { { 1000000, 1100000, 1 }, { 2000000, 2200000, 2 }, { 3000000, 3300000, 3 } };
	double xyz2[3][3] = { { 1000000, 1100000, 1 }, { 2000000, 2200000, 2 }, { 3000000, 3300000, 3 } };
	int ret = 0;

	if (lcc == nullptr || lonlat1 == nullptr || lonlat2 == nullptr || merc == nullptr)
	{
		printf_s("坐标系初始化失败。\n");
		goto zanting;
	}

	output_coordinates(xyz1, "北京54投影坐标系");

	for (int i = 0; i < 3; i++)
		ret = pj_transform(lcc, lonlat1, 1, 1, &xyz1[i][0], &xyz1[i][1], &xyz1[i][2]);
	output_coordinates(xyz1, "北京54投影坐标系转大地坐标系", true);
	output_coordinates(xyz1, "北京54投影坐标系转大地坐标系");

	for (int i = 0; i < 3; i++)
		pj_geodetic_to_geocentric(lcc->a, lcc->es, 1, 1, &xyz1[i][0], &xyz1[i][1], &xyz1[i][2]);
	output_coordinates(xyz1, "大地坐标系转空间直角坐标系");

	for (int i = 0; i < 3; i++)
		pj_geocentric_to_geodetic(merc->a, merc->es, 1, 1, &xyz1[i][0], &xyz1[i][1], &xyz1[i][2]);
	output_coordinates(xyz1, "空间直角坐标系转大地坐标系", true);

	for (int i = 0; i < 3; i++)
	{
		xyz1[i][0] *= DEG_TO_RAD;
		xyz1[i][1] *= DEG_TO_RAD;
		ret = pj_transform(lonlat2, merc, 1, 1, &xyz1[i][0], &xyz1[i][1], &xyz1[i][2]);
	}
	output_coordinates(xyz1, "大地坐标系转Mecator投影坐标系");
	for (int i = 0; i < 3; i++)
		ret = pj_transform(lcc, merc, 1, 1, &xyz2[i][0], &xyz2[i][1], &xyz2[i][2]);
	output_coordinates(xyz2, "北京54投影坐标系直接转Mecator投影坐标系");
zanting:
	_tsystem(_T("pause"));
	return nRetCode;
}

void output_coordinates(const double coords[3][3], const char* msg, bool degtorad)
{
	printf_s("=================================================\n");
	printf_s(msg);
	printf_s("\n");
	for (int i = 0; i < 3; i++)
	{
		if (degtorad)
			printf_s("%16f,%16f,%16f\n", coords[i][0] / DEG_TO_RAD, coords[i][1] / DEG_TO_RAD, coords[i][2]);
		else
			printf_s("%16f,%16f,%16f\n", coords[i][0], coords[i][1], coords[i][2]);
	}
	printf_s("=================================================\n");
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值