地理空间坐标系统-城市坐标系与国家统一坐标系之间的转换(含四参数转换代码)
标签: 地理信息
先梳理一下两个概念:“国家统一坐标系“和”城市坐标系“
国家统一坐标系:此处可以认为是基于国家规定的大地椭球构建的球面坐标系(经纬度),经过高斯投影后形成的平面坐标系,各城市分属国家统一坐标系的不同分带坐标系中,此坐标是平面坐标,单位是长度单位,米或千米等
城市坐标系:在市政测绘中,工程制图和施工放样使用的都是大比例尺测绘数据,一般要求投影长度变形不大于2.5cm/km,国家统一坐标系很难满足需求,为此各地都建立了当地高精度的城市坐标系。此坐标是平面坐标,单位是长度单位,米或千米等。目前城市坐标系主要有以下两种。(1)与国家坐标系统一致的城市坐标系统(2)地方独立坐标系统。
针对上述两种城市坐标系,第一种由于和国家统一坐标系一致,测绘成果可以直接纳入国家统一坐标系。第二种独立于国家统一坐标系,要将此坐标系下的测绘成果纳入国家统一坐标系,就需要进行坐标转换。所以我们重点讨论的是城市坐标系中的第二种类型与国家统一坐标系之间的转换。属于两个平面坐标系之间的转换。
二维平面直角坐标之间的转换
两个二维平面直角坐标系的转换通常使用的是四参数模型,四参数适合小范围测区(5KM范围)的坐标转换。四参数转换模型公式如下:

在该模型中有四个未知参数,
(1)两个坐标平移量(△X,△Y),即两个平面坐标系的坐标原点之间的坐标差值。
(2)平面坐标轴的旋转角度,通过旋转一个角度,可以使两个坐标系的X和Y轴重合在一起。
(3)尺度因子K,即两个坐标系内的同一段直线的长度比值,实现尺度的比例转换。通常K值几乎等于1。
四个参数:△X,△Y,,m
已四参数,进行二维平面直角坐标之间的转换
按上述四参数转换模型公式,构建对应矩阵进行运算。即可求得转换后的目标坐标。相对比较简单,代码就不写了。需要用到矩阵,矩阵类库在《地理空间坐标系统-不同椭球基准间的坐标转换-相关算法代码实现C#》一节有分享。
未知四参数,通过两个以上的坐标点对反算四参数
反算四参数,常规做法是将四参数转换模型公式通过矩阵变换转换为复合最小二乘求解的矩阵表达式。简化过程如下(网上查找,高精度建议看相关论文):

此时的表达式符合B=AX的结构,可通过最小二乘公式进行求解:
未知四参数,通过两个以上的坐标点对反算四参数,代码实现C#
矩阵类库在《地理空间坐标系统-不同椭球基准间的坐标转换-相关算法代码实现C#》
/// <summary>
///两个以上的坐标点对计算四参数
/// </summary>
/// <param name="originalCooords旧坐标"></param>
/// <param name="targetCooords新坐标"></param>
/// <param name="rota旋转参数"></param>
/// <param name="scale比例"></param>
/// <param name="dx x的平移"></param>
/// <param name="dy y的平移"></param>
public static void CalFourParaByTwoPlaneRectangularCoords2(
Point2d[] originalCooords, Point2d[] targetCooords,
ref double rota, ref double scale,
ref double dx, ref double dy)
{
int pointCount = originalCooords.Length;
if (pointCount < 2)
{
//坐标点数小于三。
return;
}
if (targetCooords.Length < pointCount)
{
//新旧坐标个数不匹配
return;
}
double[,] pA = new double[pointCount * 2, 4];
double[,] pB = new double[pointCount * 2, 1];
for (int i = 0; i < pointCount * 2; i++)
{
if (i % 2 == 0)
{
pA[i, 0] = 1;
pA[i, 1] = 0;
pA[i, 2] = originalCooords[i / 2].X;
pA[i, 3] = -originalCooords[i / 2].Y;
}
else if (i % 2 == 1)
{
pA[i, 0] = 0;
pA[i, 1] = 1;
pA[i, 2] = originalCooords[i / 2].Y;
pA[i, 3] = originalCooords[i / 2].X;
}
}
///初始化B矩阵第一步
for (int i = 0; i < pointCount * 2; i++)
{
if (i % 2 == 0)
{
pB[i, 0] = targetCooords[i / 2].X - originalCooords[i / 2].X;
}
else if (i % 2 == 1)
{
pB[i, 0] = targetCooords[i / 2].Y - originalCooords[i / 2].Y;
}
}
GMatrix A = new GMatrix(pA);
GMatrix AT = A.Transpose();
GMatrix W = AT * A;
GMatrix W1 = W.Inverse();
GMatrix B = new GMatrix(pB);
GMatrix reslut = W1 * AT * B;
double X_offset, Y_offset, a1, a2;
X_offset = reslut[0, 0]; //x0
Y_offset = reslut[1, 0]; //y0
a1 = reslut[2, 0];
a2 = reslut[3, 0];
dx = X_offset; //x0
dy = Y_offset; //y0
rota = Math.Atan(a2 / (a1 + 1));
scale = (a1 + 1) / Math.Cos(rota);
}
智能推荐
surpac块体模型坐标系转换
原surpac块体模型为80坐标系,现需要将80坐标系整体转换为54坐标系。思路如下: 将原块体模型数据导出为CSV格式,通过python将数据中的坐标进行偏移转换,根据导入后的数据求得块体范围,再新建块体模型将数据全部导入。 具体操作如下: 通过python处理数据 依据坐标范围设定新块大小位置 创建新块属性,其中Calulated型字段(计算型)需要再其他属性创建之后...
Java运行原理
1.Java运行原理 我们可通过文本编辑板生成Java源代码(.java)经过dos窗口由Java编译器(javac.exe)生成字节码文件(.class),字节码可由Java虚拟机转化为机器码供计算机读取处理。由于Java可以生成字节码可供虚拟机转译所以可跨平台运行。运行过程如下: 所以相对于C语言还需要转化为exe文件才能运行的权限,Java具有跨平台...
Python由放弃到入门,基础篇七(类)下
类的实例化 有感于现在python教程多如牛毛,且大多高不可攀,多次拜读而不得其门道,遂由入门到放弃。偶有机缘,得一不错教程,得以入门,现博客分享,想要获取完整教程,ff17328081445。 通过对比可以看到,实例化后再使用的格式,①是空着的,意思是这里不再需要@classmethod的声明,并且在第②处,把cls替换成了self。同时,实例化后再使用的格式,需要先赋值然后再调用(第③处): ...
pytorch CNN手写字体识别
数据整体训练一次,对于accuracy都是0的问题,由于刚开始学,有些代码的细节我也没看懂,不过整体结果是对的,可能是由于pytorch版本的更新,导致accuracy的计算方式有所改变 内容转载自:https://www.bilibili.com/video/av15997678/?p=19...
linux后台运行命令总结
linux后台运行命令总结 问题: 我们有时候需要登录远程服务器跑运行时间非常长的脚本,这个时候你要让脚本后台运行,不然占着终端窗口看着不舒服。但万一网络不好,(比如我这儿的破校园网,高峰时几秒钟断一次),终端突然和服务器之间的连接断了,那脚本就会自动停了(因为运行test.sh进程的父进程就是当前的shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,子进...
猜你喜欢
类对象模型和this指针
关于类/对象大小的计算 类只是一种类型定义,它本身是没有大小可言的。 我们这里指的类的大小,其实指的是类的对象所占的大小。因此,如果用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。 首先,类大小的计算遵循结构体的对齐原则 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响 虚函数对类的大小有影响,...
3D人脸重建——PRNet网络输出的理解
前言 之前有款换脸软件不是叫ZAO么,分析了一下,它的实现原理绝对是3D人脸重建,而非deepfake方法,找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。 国际惯例,参考博客: 什么是uv贴图? PRNet论文 PRNet代码 本博客主要是对PRNet的输出进行理解。 理论简介 这篇博客比较系统的介绍了3D人脸重建的方法,就我个人浅显的理解,分为两个流派:1.通过算...
javascript简单的正则表达式入门
内容来自百度前端学院javascript入门课程 基本的HTML: 样式: javascript: document.write和innerHTML有什么区别 前者是直接将内容写入文档流,如果写入之前没有调用document.open,那么回自动调用document.open(每打开一次文档流都会清除之前的所有内容包括变量)。每次写完关闭后重新调用该函数的话,会导致页面重写。 innerHTML是...
微信小程序一个你可能需要的功能
根据工作需要。需要做一个图片选中部分区域的效果。百度了很久,都没有见有。于是就自己写了个,需要的可以借鉴下,还有很多需要改善的地方 现在先看看效果 效果图 那这个有什么用呢。。需求是选中图片的某个区域然后给它添加注释。还可以有其他用处。那这个是怎么做到的呢 。。首先我说下基本的思路 ——-> 图片作为一个背景。然后上面是一层canvas 以及最上面生成的view 因为...
