精华内容
下载资源
问答
  • 高斯投影坐标转换(c语言)

    千次阅读 2020-11-19 16:55:11
    高斯投影坐标转换(c语言) 高斯投影又称横轴椭圆柱等角投影,属于正形投影。世界上最先采用高斯投影的国家是奥地利和德国,我国于1952年正式决定采用高斯投影。


    一、高斯投影简介

    1.1 高斯投影基本概念

    高斯投影又称横轴椭圆柱等角投影,属于正形投影。世界上最先采用高斯投影的国家是奥地利和德国,我国于1952年正式决定采用高斯投影。

    在这里插入图片描述

    1.2 高斯投影的条件

    (1)投影后角度不产生变形,满足正形投影要求;

    (2)中央子午线投影后是一条直线;

    (3)中央子午线投影后长度不变,其投影长度比恒等于1。

    在这里插入图片描述

    高斯投影除了在中央子午线上没有长度变形外,不在中央子午线上的各点,其长度比都大于1,且离开中央子午线愈远,长度变形愈大。

    1.3 高斯投影分带

    为限制长度投影变形,投影分带有6度分带和3度分带两种方法。

    在这里插入图片描述

    • 6°带带号N和中央子午线经度 LN的关系式: LN=6N-3
    • 3°带带号n和中央子午线经度 Ln的关系式: Ln=3n
    • 6°带与3°带带号之间的关系为:n=2N-1

    二、高斯投影转换

    2.1 几个概念

    高斯平面坐标系:指的是以中央子午线与赤道的交点作为坐标原点,以中央子午线的投影为纵坐标轴X,规定X轴向北为正,以赤道的投影为横坐标轴Y,Y轴向东为正,形成的坐标系。

    通用坐标:在同一投影带内横坐标有正值、有负值,这对坐标的计算和使用不方便。为了使Y值都为正,将纵坐标x轴西移500km,并在Y坐标前面冠以带号,称为通用坐标。

    大地坐标(Geodetic coordinate):是大地测量中以参考椭球面为基准面的坐标,地面点P的位置用大地经度L大地纬度B大地高H表示。

    高斯坐标正算:大地坐标(B、L、H)转换为高斯投影坐标(X、Y、Z)

    高斯坐标反算:高斯投影坐标(X、Y、Z)转换为大地坐标(B、L、H)

    注意:本文高斯坐标投影转换指的是高斯投影的 6° 带转换成 3° 带 或者 3° 带转换成 6° 带。

    2.2 计算已知量

    地球属性 符号表示
    长半轴 a 6378245
    短半轴 b 6356863.01877
    c 6399698.9018
    第一偏心率 e1^2 0.0066934216
    第二偏心率 e2^2 0.0067385254

    2.3 计算步骤

    以6° 带转换成 3° 带为例, 3° 带转换成 6° 带同。

    1. 通用值转换成自然值
    2. 高斯投影坐标反算
    3. 求解6°带中央经线
    4. 求解3°带的经差
    5. 高斯投影坐标正算
    6. 自然值转换成通用值

    三、具体问题求解

    3.1 问题重述

    已知:某点P在1954年北京坐标系6°带的平面直角坐标为

    x1 = 3589644.286m
    y1 = 20679136.438m

    求:P点在3°带第40带的平面坐标(x2,y2)

    3.2 实现代码

    /*-------------------------------------------
    	高斯坐标代号转换代码:6°带转换成3°带
    	
    	时间:2019年12月1日
    	编译:鸽子
    	编程语言:C语言
    ---------------------------------------------*/
    #include <stdio.h>
    #include <math.h>
    /* 定义已知值 */
    double a = 6378245;					//长半轴
    double b = 6356863.01877;			//短半轴
    double c = 6399698.9018;			//c
    double e_square = 0.0066934216;		//第一偏心率
    double e1_square = 0.0067385254;	//第二偏心率
    double e = sqrt(e_square);	
    double e1 = sqrt(e1_square);
    double beita0 = 1 - 3.0 / 4.0*e1_square + 45 / 65 * pow(e1_square, 2) - 175 / 256 * pow(e1_square, 3) + 11025 / 16384 * pow(e1_square, 4);	//β0,下同
    double beita2 = beita0 - 1;
    double beita4 = 15 / 32 * pow(e1_square, 2) - 175 / 384 * pow(e1_square, 3) + 3675 / 8192 * pow(e1_square, 4);
    double beita6 = -35 / 96 * pow(e1_square, 3) + 735 / 2048 * pow(e1_square, 4);
    double beita8 = 315 / 1024 * pow(e1_square, 4);
    
    /*------------------------------高斯坐标反算-------------------------------------*/
    double Fx(double B)
    {
    	return (c*beita2 + (c*beita4 + (c*beita6 + c*beita8*pow(cos(B), 2))*pow(cos(B), 2))*pow(cos(B), 2))*sin(B)*cos(B);
    }
    double Fx(double B, double l)
    {
    	double N = a / sqrt(1 - e_square*pow(sin(B), 2));	//卯酉圈曲率半径
    	double t = tan(B);
    	double fai = e1*cos(B);
    	double a2 = 1.0 / 2.0 * N*sin(B)*cos(B);
    	double a4 = 1.0 / 24.0 * N*sin(B)*pow(cos(B), 3)*(5 - pow(t, 2) + 9 * pow(fai, 2) + 4 * pow(fai, 4));
    	double a6 = 1.0 / 720.0 * N*sin(B)*pow(cos(B), 5)*(61 - 58 * pow(t, 2) + pow(t, 4));
    	return (a2*pow(l, 2) + a4*pow(l, 4) + a6*pow(l, 6));
    }
    double Fy(double B, double l)
    {
    	double N = a / sqrt(1 - e_square*pow(sin(B), 2));	//卯酉圈曲率半径
    	double t = tan(B);
    	double fai = e1*cos(B);
    	double a3 = 1.0 / 6.0 * N*pow(cos(B), 3)*(1 - pow(t, 2) + pow(fai, 2));
    	double a5 = 1.0 / 120.0 * N*pow(cos(B), 5)*(5 - 18 * pow(t, 2) + pow(t, 4) + 14 * pow(fai, 2) - 58 * pow(fai, 2)*pow(t, 2));
    	return a3*pow(l, 3) + a5*pow(l, 5);
    }
    void InverseCalculation(double x, double y, double &B, double &a1, double &l)
    {
    
    	B = (x - Fx(B) - Fx(B, l)) / c*beita0;
    	a1 = a*cos(B) / sqrt(1 - e_square*pow(sin(B), 2));
    	l = (y - Fy(B, l)) / a1;
    }
    //坐标反算
    void InverseCal(double x, double y, double &B, double&l)
    {
    	//初始值设置
    	double B0 = (x / c*beita0);
    	double a10 = a*cos(B0) / sqrt(1 - e_square*pow(sin(B0), 2));
    	double l0 = (y / a10);
    	printf("设置初始值为:\n	B0 = %lf   l0 = %lf\n", B0, l0);
    	B = B0;
    	double a1 = a10;
    	l = l0;
    	int n = 1;
    	InverseCalculation(x, y, B, a1, l);
    	printf("第%d次迭代结果为:	B = %lf   l = %lf\n", n, B, l);
    	while (fabs(B0 - B) > 0.0001 || fabs(l0 - l) > 0.0001)
    	{
    		n++;	//次数
    		B0 = B;	
    		a10 = a1;
    		l0 = l;
    		InverseCalculation(x, y, B, a1, l);
    		printf("第%d次迭代结果为:	B = %lf   l = %lf\n", n, B, l);
    	}
    }
    /*------------------------------------------------------------------------------*/
    /*带号转换*/
    void DegreeTrans(double &B, double &l, int &n, double &L, int degree)
    {
    	switch (degree)
    	{
    	case 6:
    	{
    			  int centerLongitude = n * 6 - 3;	//中央经度
    			  B = B * 206265 / 3600;
    			  l = l * 206265 / 3600;
    			  L = l + centerLongitude;
    			  break;
    	}
    	case 3:
    	{
    			  n = (1.5 + L) / 3;	//计算带号
    			  int centerLongitude = n * 3;	//中心经度
    			  l = L - centerLongitude;	//经差
    			  l = l * 3600 / 206265;	
    			  B = B * 3600 / 206265;
    			  break;
    	}
    	}
    }
    /*坐标正算:大地坐标转化为高斯投影坐标*/
    void Calculate(double B, double l, double &x, double &y)
    {
    	double N = a / sqrt(1 - e_square*pow(sin(B), 2));	//卯酉圈曲率半径
    	double t = tan(B);
    	double fai = e1*cos(B);
    	double X = c*(beita0*B + (beita2*cos(B) + beita4*pow(cos(B), 3) + beita6*pow(cos(B), 5) + beita8*pow(cos(B), 7))*sin(B));	//赤道至纬度B的子午线弧长
    	x = X + pow(l, 2)*N*sin(B)*cos(B) + pow(l, 4) / 24 * N*sin(B)*pow(cos(B), 3)*(5 - pow(t, 2) + 9 * pow(fai, 2) + 4 * pow(fai, 4)) +
    		pow(l, 6) / 720 * N*sin(B)*pow(cos(B), 5)*(61 - 58 * pow(t, 2) + pow(t, 4));
    	y = l*N*cos(B) + pow(l, 3) / 6 * N*pow(cos(B), 3)*(1 - pow(t, 2) + pow(fai, 2)) +
    		pow(l, 5) / 120 * N*pow(cos(B), 5)*(5 - 18 * pow(t, 2) + 14 * pow(fai, 2) - 58 * pow(fai, 2)*pow(t, 2));
    }
    
    int main()
    {
    	printf("*********高斯投影带转换(6°——3°)************\n\n");
    	double x = 3589544.286;	//初始高斯坐标xy
    	double y = 20679136.438;
    	printf("需要转换的6°带坐标为:\n	x = %lf   y = %lf\n\n", x, y);
    	int n = 20;
    	y = y - n * 1000000 - 500000;	//转换成自然值
    	printf("计算过程:\n(一)通用值转换成自然值\n	x = %lf   y = %lf\n", x, y);
    	printf("\n(二)高斯投影坐标反算\n");
    	double B = 0;
    	double l = 0;
    	InverseCal(x, y, B, l);	//坐标反算
    	printf("迭代结果为:\n	B = %lf   l = %lf\n", B, l);
    	double L = 0;	//定义大地经度
    	DegreeTrans(B, l, n, L, 6);	//求中央经线及大地坐标
    	printf("\n(三)求解6°带中央经线\n转换后的大地坐标为:\n	B = %lf   L = %lf\n", B, L);
    	printf("\n(四)求解3°带的经差\n");
    	int n1 = 0;	//3°带代号
    	double l1 = 0;	//经差
    	DegreeTrans(B, l1, n1, L, 3);	//求中央经线
    	printf("转换后的3°带的经度纬度和代号为:\n	B = %lf   l = %lf   n=%d\n", B, l1, n1);
    	printf("\n(五)高斯投影坐标正算\n");
    	double x1 = 0, y1 = 0;
    	Calculate(B, l1, x1, y1);	//坐标正算
    	printf("正算结果为:\n	x = %lf   y = %lf\n", x1, y1);
    	y1 = y1 + n1 * 1000000 + 500000;	//高斯投影坐标y
    	printf("\n(六)自然值转换成通用值\n	x = %lf   y = %lf\n", x1, y1);
    	return 0;
    }
    
    

    注:代码是根据中国矿业大学出版社出版的《应用大地测量学》高斯投影一章的知识编写的,为了理解书本内容,精度没经过验证。

    3.3 输出结果

    注:以下是编译器输出的内容,未经修改

    需要转换的6°带坐标为:
    x = 3589544.286000 y = 20679136.438000

    计算过程:
    (一)通用值转换成自然值
    x = 3589544.286000 y = 179136.438000

    (二)高斯投影坐标反算

    设置初始值为:
    B0 = 0.558058 l0 = 0.033078

    第1次迭代结果为: B = 0.560073 l = 0.033116
    第2次迭代结果为: B = 0.560076 l = 0.033116

    迭代结果为:
    B = 0.560076 l = 0.033116

    (三)求解6°带中央经线
    转换后的大地坐标为:
    B = 32.090028 L = 118.897435

    (四)求解3°带的经差
    转换后的3°带的经度纬度和代号为:
    B = 0.560076 l = -0.019243 n=40

    (五)高斯投影坐标正算
    正算结果为:
    x = 3552710.678780 y = -104087.421312

    (六)自然值转换成通用值
    x = 3552710.678780 y = 40395912.578688

    总结:测量学与其他学科的不同就是对结果的精度近乎苛刻(尤其是大地测量学),在实际应用中还是需要精度验证的。

    展开全文
  • 法1:使用Arcgis中工具箱-数据管理工具-投影与变换-要素-投影,:这个工具进行坐标转换 法2:转换图层的坐标系:图层右键属性-坐标系,变换坐标系,然后shp右键导出数据,选择”数据框的坐标系“ 出现的问题:可能...

    问题来源:

    目的:shp图需要将投影坐标系去掉,即投影坐标系转换为地理坐标系
    正常操作:
    法1:使用Arcgis中工具箱-数据管理工具-投影与变换-要素-投影,:这个工具进行坐标转换
    法2:转换图层的坐标系:图层右键属性-坐标系,变换坐标系,然后shp右键导出数据,选择”数据框的坐标系“
    出现的问题:可能因为该shp图是CAD导出的,且坐标系是投影坐标系,经过试验,上述两方法均失败。

    **

    解决方案:

    **
    利用奥维互动地图
    将数据导入:系统-导入对象
    选择坐标系统位”横轴墨卡托“,根据数据源的坐标系来
    在这里插入图片描述
    导入时要选择中央子午线,否则图会偏(因为数据源是投影坐标系)
    在这里插入图片描述

    将数据导出:系统-导出对象
    选择导出格式:shp
    在这里插入图片描述

    选择坐标类型:WGS84(地理坐标)
    在这里插入图片描述
    就可以把这个奇怪的数据转为地理坐标系了~

    展开全文
  • 前言 在进行坐标转换之前,先简单的介绍下几个专业概念: 1.地理坐标系: 2.投影坐标系: 地球椭球体 大地基准面 pyproj库使用简介

    前言

    在进行坐标转换之前,先简单的介绍下几个专业概念:
    地理坐标系:地理坐标是用纬度、经度表示地面点位置的球面坐标
    投影坐标系:简单点来讲就是通过投影的方式把地球地理坐标系这种三维空间坐标展开成平面坐标。
    关于坐标系统这块的详细介绍可以参阅地图学相关书籍:
    空间坐标与地图投影
    国内常用坐标系统介绍

    pyproj库使用简介

    1.Python中安装pyproj库

    直接pip安装就好

    pip install pyproj
    

    2.初始化坐标参考系统(CRS)

    pyproj库提供了四种初始化参考坐标的方式,括号里面的数字是地图坐标系统在epsg中的代号,每一种地图坐标系统在epsg中都有一个唯一的数值与之对应,例如,4326对应的就是WGS84地理坐标系统,对应代码坐标系统的详细信息可以在https://epsg.io/查询。

    from  pyproj  import  CRS
    crs=CRS.from_epsg(4326)
    crs = CRS.from_string("epsg:4326")
    crs = CRS.from_proj4("+proj=latlon")
    crs = CRS.from_user_input(4326)
    

    3.检查坐标参考系统信息

    直接输入刚才构造的crs对象,即可查看当前坐标系统的详细信息,在进行坐标转换之前,首先要检查坐标转换的范围和轴向信息,比如这里的wgs84地理坐标系的轴向信息是(纬度,经度),在后面输入经纬度坐标的时候切记是先纬度,后经度的顺序,不然整个坐标系统就完全乱了,转换出来的坐标可能会出现无穷大的错误值。
    wgs84地理坐标洗描述
    投影坐标洗描述

    4.转换坐标

    在转换坐标前,首先构造一个转换对象,确定是从哪个地理坐标向哪个投影坐标进行转换

    transformer = Transformer.from_crs(crs,crs_cs)
    # crs是wgs84坐标参考系统
    # crs_cs是湖南省长沙市所在地区UTM投影坐标系(这里代号为49带)
    
    
    读入需要转换的经纬度数据
    import   pandas   as  pd
    data=pd.read_csv('ex.csv')
    '''测试数据
              lon        lat
    0  112.901623  27.984723
    1  112.891346  27.999936
    2  112.902052  28.001706
    3  112.907937  28.006145
    4  112.911574  28.006142
    5  112.911833  28.007062
    '''
    lon=data.lon.values
    lat =data.lat.values
    

    坐标转换

    切记经纬度的输入顺序,输出的即是UTM坐标系统的xy系统坐标

    transformer.transform(lat,lon)
    '''
    (array([687018.1260865 , 685980.99577337, 687030.93355121, 687602.0694474 ,
            687959.70480738, 687983.63799872]),
     array([3096966.74417735, 3098636.7189627 , 3098849.23596314,
            3099350.09742483, 3099355.45537758, 3099457.7973657 ]))
    '''
    
    展开全文
  • 本课程详细讲解了如何用arcgis软件将同一椭球下的高斯平面投影坐标转换成经纬度坐标,同时还讲解了如何投影生成点,如何正确选择坐标系,还讲解了计算几何与字段计算器在本课中的实际应用,同时讲解了如何将平面坐标...

    课程简介:
    本课程详细讲解了如何用arcgis软件将同一椭球下的高斯平面投影坐标转换成经纬度坐标,同时还讲解了如何投影生成点,如何正确选择坐标系,还讲解了计算几何与字段计算器在本课中的实际应用,同时讲解了如何将平面坐标转换成以秒为单位的坐标,最后讲解了如何将转换好的坐标导出成文本格式,通过本课程的学习可以掌握arcgis软件的使用流程及提高解决实际问题的能力。(12)


    工作学习不求人,欢迎进入【电脑技术服务平台】咨询解决关于arcgis的各种问题
    https://shop60546095.taobao.com/

    QQ: 1584453536

    展开全文
  • 许久没有使用坐标转换,记忆有些模糊了,以后还是会用到,先将WGS84与web墨卡托转换复习一下; 1.84转web墨卡托 //核心公式 平面坐标x = 经度*20037508.34/108 平面坐标y = log(tan((90+纬度)*PI/360))/...
  • 高斯投影坐标转换正算参数

    千次阅读 2019-09-10 14:25:43
    转换的方式:精确一点的有投影等;不同地区采用不同的椭球参数; 高斯投影计算公式可以有多种; 相关的参数有:分带——中央子午线经度,3/6度带,带号 椭球参数: 椭球长半径:a 椭球短半径:b 扁率:α=(a-...
  • 地图投影坐标转换

    千次阅读 2009-03-16 16:23:00
    系统是直接将将(B,L)84 视为(B,L)54,省去了很多问题细节不是很精确1、(B,L)84——(X,Y,Z)84,空间大地坐标到空间直角坐标转换。2、(X,Y,Z)84——(X,Y,Z)54,坐标基准的转换,即Datum转换。通常有三...
  • GPS 高斯投影 坐标转换 代码

    千次阅读 2011-09-09 17:13:23
    //分析表明,此程序的结果和Coord4.2的转换结果是一样的,只差到毫米级 //原程序有几个问题,1.Pi的值不对。2.SetBL中多了两行错误代码 } double Dms2Rad(double Dms) { double Degree, Miniute; ...
  • ##批量栅格数据投影转换 import arcpy,os,os.path,init def projectRaster(rootPath): try: ##arcpy工作目录 root_path = rootPath arcpy.env.workspace = root_path ##待处理文件所在目录(相对于根目录)...
  • 获取相应坐标系 import gdal import numpy as np from osgeo import osr dataset = gdal.Open("C:\\Users\\Nihil\\Desktop\\Arcgisdata\\HPDEM.tif") adfGeoTransform = dataset.GetGeoTransform() get_ref = ...
  • -> next , 然后只需要在 Export 修改一下输入路径即可 校正后: 现在就有基本的坐标投影信息了 投影转换 上述校正结果是UTM墨卡托投影, 如果需要 转成 经纬度 投影,可以用 ENVI classic 处理 首先, 点击 ...
  • arcgis中将地理坐标转换投影坐标 / 经纬度坐标转换 1.导入需要转换的数据,以csv格式的点为例 (1) File-> Add Data -> Add XY Data… (2) 选择导入的数据后将经纬度坐标分别赋予“X Field”和“Y Field”. 2...
  • C# 墨卡托投影坐标与WGS84坐标转换
  • Arcgis 投影坐标转换为地理坐标系

    千次阅读 2020-03-11 21:38:17
    今天,一个妹子问我怎么把投影坐标转换为地理坐标。 说实话,这个问题我不会,而且当时没在电脑旁,匆匆用手机查了一下,找到一个转换坐标注记法。当然这个办法是不对的。下午回到家也好累,吃完晚饭我竟然睡了两个...
  • 投影坐标,平面以及坐标转换

    千次阅读 2017-08-16 11:43:00
    表现方式:大地坐标(L,B,H),空间直角坐标(x,y,z),这两种坐标均基于球面,,前者表现是度,是常见的表现方式,后者单位是米,一般是为同其他坐标进行转换的时候出现。大地坐标和空间直角坐标之间可以相互转换。  ...
  • 例如,图层坐标系(地理坐标系 WGS 84) 转换投影坐标系 CGCS 2000来计算图层面积。转换方法为: 1.在搜索栏中搜索自定义地理(坐标)转换 2.地理(坐标)变换名称:自己定(我定为WGS84-CGCS2000) ...
  • ESRI坐标系World Mercator(ESRI:54004)是投影坐标系,由于学习中遇到相关需求,需要将其数据在leaflet中进行展示,但是由于leaflet加载的在线瓦片图为wgs84(EPSG:4326)的地理坐标系,所以需要对其进行坐标转换。...
  • 下面是实现将经纬度坐标转换投影坐标的方法  double locy = loc.getLatitude(); double locx = loc.getLongitude(); Point wgspoint = new Point(locx, locy); Point mapPoint = (Point) GeometryEngine ....
  • 【摘 要】 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤。 【关键词】 ArcGIS 坐标转换 投影变换  1坐标转换简介  坐标系统之间的...
  • ArcGIS的地理坐标系与投影坐标
  • 如何利用ArcMap定义投影坐标转换

    万次阅读 2018-08-24 09:48:11
    今天想写的是对数据如何进行定义投影坐标转换,坐标问题一直是困扰许多人的一个问题,也是每个测绘、测量、gis等工作者再工作学习当中经常碰到的一个问题,对于没有投影信息的图来说,是无法进行投影变换的,所以...
  • 【摘 要】 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤。 【关键词】 ArcGIS 坐标转换 投影变换  1 坐标转换简介  坐标系统之间...
  • 坐标、投影坐标转换

    千次阅读 2016-01-25 15:31:35
    坐标、投影坐标转换 1、 空间坐标(球面) 地心坐标:WGS84,国家2000坐标。 参心坐标:北京54,西安80,地方坐标。 表示方式: 大地坐标(L,B,H);空间直角坐标(x,y,z)。这两种坐标都是基于球面的,前者...
  • 经纬度坐标和投影坐标转换

    万次阅读 2015-12-11 09:28:22
    昨天,有朋友要我帮忙看看一个将经纬度坐标转换成墨卡托投影(墨卡托投影有很多变种,我也不知道他说的是哪一种)的程序,他说转换以后的坐标精度太差。当时,他的程序没怎么看懂,然后研究了一下Geotools,自己写了...
  • 【ArcGIS for Android】经纬度坐标、地图投影坐标、屏幕坐标互相转换 1. 屏幕坐标转换成投影坐标 MapView map; ... public void onSingleTap(float x, float y) { ...2. 投影坐标转换成经纬度  接1, Poin

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,173
精华内容 14,069
关键字:

投影坐标转换