文档章节

用Proj.4进行坐标系转换(以北京54坐标系转WGS84投影坐标系为例)

妆台秋思
 妆台秋思
发布于 2017/08/14 14:29
字数 592
阅读 109
收藏 0
示例 代码如下:
// 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");
}
代码中有很多中文标注,应该不用多讲吧。

© 著作权归作者所有

妆台秋思
粉丝 0
博文 66
码字总数 67163
作品 0
深圳
Android工程师
私信 提问
BIGEMAP无偏移影像叠加配准(Auto CAD版)

BIGEMAP无偏移影像叠加配准(Auto CAD版) 第一步 工具准备 AutoCAD2008 AutoCAD2014(64位) BIGEMAP地图下载器: 相关教程:CAD文件直接导入BIGEMAP进行套合配准(推荐) 案例:等高线完美...

bigemap123
2017/07/04
0
0
80、54、84坐标系七参数转换算法

一、为什么要进行坐标转换 我们所在地球是一个不规则的椭球,地表凹凸不平,地底密度不均,因此很难用一个简单模型来概括。国际上根据建模坐标系的原点不同分为参心坐标系和地心坐标系,其中...

会哭的鳄鱼
2018/09/13
219
0
大地坐标系相互转换、测线规划和缓冲区生成源码介绍

大地坐标系相互转换源码介绍 基于一个小的需求,写的一个大地坐标系相互转换小demo,其中包括WGS84,北京54,西安80,和国家2000之间的相互转换,并支持UTM投影和高斯投影。 源码介绍: 1、数...

u011326478
2018/02/09
0
0
通过PROJ4转换地理数据到GoogleMap投影坐标系

Google Map以及VirtualEarth等web gis都采用一种特殊的投影坐标系EPSG:900913,其实这个900913并不是EPSG分配的编号,而是设计Google Map的工程师自己选定的一个编号。该投影坐标系一开始不被...

Imy
2011/02/01
1K
0
arcgis api for js入门开发系列十九 用HTML5 canvas绘制地图

之前一直想使用HTML5技术全新做一套地图API,可是苦于时间和精力,迟迟未有行动。后来下定决心,利用下班和周末做出一个大体框架出来,现在和网友分享一下自己的整体的一个思路和想法。欢迎大...

sinat_34719507
2017/03/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
6
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部