坐标转换_坐标转换工具 - CSDN
精华内容
参与话题
  • 最新2000坐标转换转换功能强大,坐标转换,54坐标系、80坐标系、2000坐标系,相互转换,免费
  • 坐标转换分析

    万次阅读 多人点赞 2020-07-06 09:06:16
    从二维坐标系说起: 二维平面直角坐标系定义可分为两类,从逆时针角度看,第一类为X坐标轴在Y坐标轴后;第二类为X坐标轴在Y坐标轴前。...以第一类二维平面直角坐标为例,涉及的坐标转换有下图中4种情

    从二维坐标系说起:

    二维平面直角坐标系定义可分为两类,从逆时针角度看,第一类为X坐标轴在Y坐标轴后;第二类为X坐标轴在Y坐标轴前。

    有这两类坐标系添加第三个坐标轴Z,得到空间直角坐标系,在默认添加的坐标轴Z垂直纸面朝向外侧下,分别得到左手空间直角坐标系和右手空间直角坐标系。

    而对于坐标的转换,最简单的依然从二维坐标系讲起。

    以第一类二维平面直角坐标为例,涉及的坐标转换有下图中4种情况:a,b,c,d.

    基础一 原坐标系坐标转到新坐标系

     a与b为已知原坐标系下坐标,从原坐标系(蓝色表示)旋转角度θ,获得新坐标系下坐标(红色表示):

    此处注意:定义角度的正负应统一,即存在原坐标系与新坐标系的概念,新坐标系相对于原坐标系的旋转角度为逆时针时为正值。

    针对情况a有:

     

    即:

     

    注:从简单直观方面理解为,当原坐标系转角度θ到新坐标系过程中,y坐标值在新坐标系中是变大的,x坐标值在新坐标系中是变小的。因此,y方向的三角系数都为正,x方向存在负值情况。可以标记为沿旋转方向数,第一条坐标轴数值是变大的,条件是旋转方向角度为无符号数值。

    因此,针对a和b两种情况,由原坐标系经过旋转一定角度,转换到新的坐标系下,得到的旋转矩阵为:

     

    其中θ为具有正负号的角度值,当为正值时代表原坐标系沿逆时针旋转;为负值时代表原坐标系沿顺时针旋转。

    基础二 新坐标系坐标转回原坐标系

    而情况c与d是表示已知新坐标系下坐标,经过坐标转换获得在原坐标系下坐标:

    此处注意:定义角度的正负应统一,即存在原坐标系与新坐标系的概念,新坐标系与原坐标系的旋转角度为逆时针时为正值。

    cd情况中,因为定义了逆时针旋转角度为正,所以c中旋转的角度为(-θ),d中旋转的角度为(θ)。而沿逆时针旋转时,在该方向上第一条坐标轴为Y轴,所以基本公式为:

    小结:

    定义了坐标轴的指向,以及新坐标系与原坐标系旋转角度的正负关系后,可以确定原坐标系转到新坐标系运算与你运算正弦系数符号变换。

    因此,要确定旋转矩阵内容必须要确定两个因素,一是坐标轴的指向二是旋转角度的正负定义

    (1)当存在原坐标系与新坐标系概念时,必然的旋转角度的正负定义必须一致,此时由原坐标系到新坐标系的转换,可严密的进行返回坐标转换。

    (2)当只存在当前坐标系下坐标转到另一个坐标系下坐标时,根据确定的旋转角度正负,参考基础一即可转换。基础一中只表示了逆时针旋转角度为正的情况,顺时针旋转为正的情况可仿照进行。

    (3)无论什么情况下,选取旋转角度定义为正(无论逆时针还是顺时针旋转)时作为基础,沿旋转方向数的第一条坐标轴的坐标值应变大,即在新坐标系下对应该坐标轴上的坐标值组合为cos+sin的形式,而另一坐标轴上坐标值为-sin+cos形式。

    在基础一与基础二中都可印证(3)的说明。再增加一条印证示例:

    在情况e中,定义从蓝色坐标系旋转到红色坐标系,定义图中状态的旋转角度θ为正,则此时坐标转换关系为:

     

    情况f中,依然定义图中状态为旋转角度θ为正值,但是从红色坐标系转到蓝色坐标系:

    从旋转方向遇到的第一个坐标轴Y坐标开始整理,则有:

     

    旋转矩阵的形式依然是正规形式,以x,y为顺序排列为:

     

    在情况e中定义了目标坐标系在原坐标系的逆时针方向为正,情况f中定义了目标坐标系在原坐标系的顺时针方向为正,这两种情况从纯坐标系的转换方面印证了上面(3)中总结的,即以正值旋转角度为基础,沿旋转方向第一条坐标轴上的坐标为cos+sin形式:e中第一条坐标轴为x轴,f中第一条坐标轴为y轴。从坐标转换与逆转换方面印证了(1)中总结结果,即存在正转换与逆转换时,定义的正旋转角度应一致,此时的正反旋转矩阵相乘为单位矩阵。

     

    基础三 平面坐标系中讨论左右手系的转换问题

    情况h中从蓝色坐标系旋转角度θ到红色坐标系下,两坐标系的坐标轴向定义不同,产生类似左右手系问题,在这类转换中,首先将目标坐标系的轴向假设与原坐标系轴向定义为一类,然后更换坐标符号获得两坐标系的转换。

    第一步:假设X’与Y’轴互换,此时原坐标系与目标坐标系定义类似,相差角度θ,定义目标坐标系与原坐标系之间逆时针旋转角度为正,得到:

     

    根据假设坐标与真实坐标关系获得两坐标系真实关系:

    按顺序排放整理:

    即,进行左右系的坐标系转换时的旋转矩阵为:

    以情况i作为验证示例:

    依然定义目标(红)坐标系转到原(蓝)坐标系时,目标坐标系相对原坐标系旋转角度为逆时针时为正。

    假设原坐标系的坐标轴向与目标坐标系的轴向类似定义,为x(伪),y(伪)。

     

     

     

    按顺序整理得到:

    得由目标坐标系转回原坐标系的旋转矩阵为:

    得该转换过程成立。

     

    小结:在处理坐标系向量的顺序整理时需要进行公式的元素调换。

    (1)    针对等号左边结果的调换如

    要变为

     

    时,只需等号右面矩阵的行进行相应对调:

     

    (2)    只针对等号右面最后原坐标值向量内容调换时,等式的左右都需要变化。如

    但是要保持等号左边的向量顺序不变时需要两步:

    第一步:首先利用(1)将等号左边向量调换为:

    验证,变换后的结果与初始状态一致。

     

    基础四 三维空间直角坐标系的正转换问题

    三维空间直角坐标的坐标转换可由二维平面直角坐标转换扩展来,在二维坐标系中的坐标转换只有一个角度的旋转,也就产生一个旋转矩阵。在三维空间直角坐标系中存在三个方向的角度旋转问题,因此产生三个旋转矩阵相乘的结果。但是针对沿某一坐标轴旋转某一角度时,又回归到二维坐标旋转问题。因此,三维空间直角坐标的坐标旋转问题是三个二维平面直角坐标旋转问题的顺序操作问题。(但是由于某一角度旋转后,后一角度的旋转是否对前者有耦合效应,应该深入研究探讨)

    下面首先讨论三维空间直角坐标系的坐标转换问题。

    以右手坐标系为例,研究原坐标系到新坐标系经过首摇,纵摇,横摇角度的转换过程以及逆过程。

    A 原坐标系转换到新坐标系

    首先定义坐标系以及旋转角度的正负定义

    定义右手坐标系如图,沿各坐标轴正向的反方向看,另外两坐标平面沿逆时针旋转时,定义为沿该坐标轴正角度旋转。

    由此定义沿X,Y,Z轴逆时针旋转角分别为α,β,γ。

    从X->Y->Z轴的顺序,分别分析坐标转换矩阵的形式。

    沿X轴方向旋转α角度时对应的关系图

    根据图中关系可以得到第一次转换后的坐标,由于沿X轴旋转,所以新坐标中X信息不变。根据以上基础问题的讨论可以得到:

     

    沿Y轴方向旋转β角度时对应的关系图

    根据图中关系可以得到第二次转换后的坐标,由于沿Y轴旋转,所以新坐标中Y信息不变。根据以上基础问题的讨论可以得到:

     

    注:沿Y的旋转矩阵与沿X轴的旋转矩阵形式出现不同,原因在于,当沿X轴旋转时,沿正旋转角度的第一条边为Y轴,即Y值变大。而沿Y轴进行旋转时,第一条边Z轴的对应值变大,而在向量摆放时Z值放在最下方,因此利用基础问题三中的等号右边最后向量重现摆放时需要整体变换,变换结果为以上所示。

     

    沿Z轴方向旋转γ角度时对应的关系图

    根据图中关系可以得到第三次转换后的坐标,由于沿Z轴旋转,所以新坐标中Z信息不变。根据以上基础问题的讨论可以得到:

     

    注:沿Z轴与沿X轴的旋转矩阵类似,因为这两种情况下按旋转方向得到的坐标轴顺序与XYZ顺序一致,因此不需要进行顺序重排,而沿Y轴旋转时,Z轴在X轴前面,因此需要重排顺序,重排后,矩阵形式发生变化。从另一个角度说,当沿Z轴和X轴旋转时,坐标变大的分别为X值和Y值,因此其对应的矩阵行都为正,沿Y轴旋转时,坐标变大的为Z值,因此Z坐标对应的行矩阵系数为正。

     

    如果知道原坐标系通过沿X、Y、Z轴的顺序进行旋转到新坐标系,则新坐标系下坐标为:

    基础五 三维空间直角坐标系的逆转换问题

    若已知从原坐标系到新坐标系的角度旋转关系,如原坐标系首先沿X轴旋转α,然后沿Y轴旋转β,最后沿Z轴旋转γ。则坐标正转换时(即)的公式:

     

    进行三维坐标逆转换时,一致新坐标系下坐标,以及新旧坐标系的角度旋转顺序和信息。

    则由以上信息可推测坐标逆转换为:

     

    R(α)与R’(α),R(β)与R’(β),R(γ)与R’(γ)互为逆矩阵。旋转顺序为沿Z轴、Y轴和X轴进行转换。

    1.首先从Z轴转换:

    定义的沿Z轴逆时针旋转时角度为正,此时进行的坐标转换为从红色坐标系到原坐标系的旋转,即旋转角度为(-γ)。针对从新坐标系(0-X’Y’Z’)到原坐标系的逆转换有两种方式:

    (1)    采用原坐标系到新坐标系的旋转角度正负定义获取坐标转换公式,然后将(-γ)代入公式即可:

    根据前面所讲,确定旋转矩阵时,根据旋转角θ正方向和第一个坐标轴X’可快速确定旋转公式: 

    将实际旋转角度(-γ)代入得:

     

    (2)    不考虑整个系统定义的角度正负(此时适应条件中只给出两坐标系间的相差的角度,没有正负定义时),按给出的角度(数值应为一个正值)和两坐标系的实际旋转关系确定旋转矩阵。此时,由新坐标系(0-X’Y’Z’)顺时针方向旋转角度γ得到原坐标系下坐标,则在沿旋转方向中第一条坐标轴为Y轴(即数值变大轴):

    方法(1)和方法(2)的结果完全相同。但是方法(1)存在角度的正负定义问题,并且前后连贯一致,多在测绘中的姿态仪中出现,对于姿态仪中给出的姿态角度可以用一套公式表示(如方法1中结果的第一种表达方法),而方法(2)只存在一种结果形式,因此不适用存在整体性角度正负定义的问题。

    则沿Z轴的旋转矩阵

    2.沿Y轴转换

    沿Y轴方向旋转角度时对应的关系图

    根据图中关系可以得到沿Y轴顺时针旋转β角度到原坐标系下,从定义的沿Y轴逆时针方向旋转角度为正的角度确定旋转角度为(-β)。在该图中沿正旋转角度时,第一个坐标轴为Z轴,所以得到的基本旋转矩阵为: 

    3.沿X轴旋转

    沿X轴方向旋转α角度时对应的关系图

    由于沿X轴旋转,所以新坐标中X信息不变。沿X轴顺时针旋转角度α得到原坐标系下坐标。根据定义的角度旋转正负关系,定义逆时针旋转角度为正,因此旋转的角度为(-α)。沿X轴逆时针正旋转时,第一个坐标轴为Y轴,因此基本公式为:

     

    综上,经过沿Z-Y-X轴的坐标你旋转,将在新坐标系下坐标转回到原坐标系下:

     

    总结:从一个坐标系转到新坐标系,一般需要定义旋转角度的正负,一旦正负的方向定义后,从原坐标系到新坐标系的旋转和从新坐标系到原坐标系的旋转都可用这一个方向定义,此时需要考虑的是操作中出现了从原坐标系到新坐标的正转换和新坐标系到原坐标系的逆转换,逆转换时须将采集的原坐标系到新坐标系的旋转角度取反代入同一套公式。

    另一种方法,对于只使用从原坐标系到新坐标系或者只使用新坐标系到原坐标系的旋转过程时,可以单独对旋转过程定义一套旋转角度正负使用问题,比如姿态中的横摇一般定义为右舷下降为正值,那么假设当前横摇值为+10°,要从姿态传感器坐标系到水平坐标系,在XOZ平面,认为顺时针方向旋转为正值,则此时X轴坐标值应为旋转变大方,因此系数组合为Xcos+Zsin模式,旋转矩阵也就确定下来了。该例子中,旋转矩阵的确定存在一下2个条件:(1)直接使用了姿态仪给出的数值;(2)定义了顺时针方向为正方向(只有这样定义,才能直接用姿态仪给出的数值,否则要取反使用).

     

    展开全文
  • 坐标系的基本概念 坐标系分为地理坐标系和投影坐标系,以下是对这两种坐标系的解释: 地理坐标系:为球面坐标。...地理坐标转换到投影坐标的过程可理解为投影(投影:将不规则的地球曲面转换为平面) 常见的...

    坐标系的基本概念

    坐标系分为地理坐标系和投影坐标系,以下是对这两种坐标系的解释:

    • 地理坐标系:为球面坐标。参考平面地是椭球面,坐标单位:经纬度

    • 投影坐标系:为平面坐标。参考平面地是水平面,坐标单位:米、千米等

    地理坐标转换到投影坐标的过程可理解为投影(投影:将不规则的地球曲面转换为平面)

    常见的坐标系的种类及解释

    • WGS84:地理坐标系统,Google Earth和中国外的Google Map使用,另外,目前基本上所有定位空间位置的设备都使用这种坐标系统,例如手机的GPS系统

    • GCJ-02: 投影坐标系统,也就是我们平常所说的火星坐标系,Google Map中国、高德和腾讯好像使用,这个是中国自己在WGS84基础上加密而成,目的显而易见。

    • BD09:投影坐标系统,百度地图使用,在GCJ-02基础上二次加密而成。

    国内各API坐标系统比较

    API 坐标系
    百度地图API 百度坐标
    腾讯搜搜地图API 火星坐标
    搜狐搜狗地图API 搜狗坐标
    阿里云地图API 火星坐标
    图吧MapBar地图API 图吧坐标
    高德MapABC地图API 火星坐标
    灵图51ditu地图API 火星坐标

    WGS84坐标一般采用UTM投影,6度分带,我国横跨11个UTM投影,处于43-53带号

    带号 中央经线 经度范围
    43 75E 72E-78E
    44 81E 78E-84E
    45 87E 84E-90E
    46 93E 90E-96E
    47 99E 96E-102E
    48 105E 102E-108E
    49 111E 108E-114E
    50 117E 114E-120E
    51 123E 120E-126E
    52 129E 126E-132E
    53 135E 132E-138E

    坐标纠偏

    把火星坐标系、百度坐标系转化为WGS1984坐标就叫坐标纠偏

    要偏移坐标:火星坐标系,百度坐标系;

    火星坐标系,百度坐标系是为了国家安全,相对部门对WGS1984进行偏移,加密产生的

    这里提供了在线进行坐标转换的工具,上传对应的EXCEL文件即可进行转换,支持BD09、GCJ20、WGS84三种坐标系的互转,地址:

    http://www.mapboxx.cn/tool/coord_view/

    当然,要是需要代码,往下看即可。

    坐标纠偏,坐标系的整体认识

    RUNOOB 图标

    个人网站: http://www.mapboxx.cn
    已上线,里面有许多在线工具以及地图相关知识分享,工具包括人流量数据爬取、POI数据爬取、以及地图数据可视化、坐标转换等,欢迎访问。

    常用地图坐标系转换代码(python版本)

    支持BD09坐标系、GCJ20坐标系、WGS84坐标系互转。

    #! /usr/bin/env python3
    # -*- coding:utf-8 -*-
    
    __author = "Brady_Hu"
    
    import math
    
    x_pi = 3.14159265358979324 * 3000.0 / 180.0
    pi = 3.1415926535897932384626  # π
    a = 6378245.0  # 长半轴
    ee = 0.00669342162296594323  # 扁率
    
    
    def gcj02_to_bd09(lng, lat):
        """
        火星坐标系(GCJ-02)转百度坐标系(BD-09)
        谷歌、高德——>百度
        :param lng:火星坐标经度
        :param lat:火星坐标纬度
        :return:
        """
        z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)
        theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)
        bd_lng = z * math.cos(theta) + 0.0065
        bd_lat = z * math.sin(theta) + 0.006
        return [bd_lng, bd_lat]
    
    
    def bd09_to_gcj02(bd_lon, bd_lat):
        """
        百度坐标系(BD-09)转火星坐标系(GCJ-02)
        百度——>谷歌、高德
        :param bd_lat:百度坐标纬度
        :param bd_lon:百度坐标经度
        :return:转换后的坐标列表形式
        """
        x = bd_lon - 0.0065
        y = bd_lat - 0.006
        z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
        theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
        gg_lng = z * math.cos(theta)
        gg_lat = z * math.sin(theta)
        return [gg_lng, gg_lat]
    
    
    def wgs84_to_gcj02(lng, lat):
        """
        WGS84转GCJ02(火星坐标系)
        :param lng:WGS84坐标系的经度
        :param lat:WGS84坐标系的纬度
        :return:
        """
        if out_of_china(lng, lat):  # 判断是否在国内
            return lng, lat
        dlat = _transformlat(lng - 105.0, lat - 35.0)
        dlng = _transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * pi
        magic = math.sin(radlat)
        magic = 1 - ee * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
        dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
        mglat = lat + dlat
        mglng = lng + dlng
        return [mglng, mglat]
    
    
    def gcj02_to_wgs84(lng, lat):
        """
        GCJ02(火星坐标系)转GPS84
        :param lng:火星坐标系的经度
        :param lat:火星坐标系纬度
        :return:
        """
        if out_of_china(lng, lat):
            return lng, lat
        dlat = _transformlat(lng - 105.0, lat - 35.0)
        dlng = _transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * pi
        magic = math.sin(radlat)
        magic = 1 - ee * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
        dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
        mglat = lat + dlat
        mglng = lng + dlng
        return [lng * 2 - mglng, lat * 2 - mglat]
    
    
    def bd09_to_wgs84(bd_lon, bd_lat):
        lon, lat = bd09_to_gcj02(bd_lon, bd_lat)
        return gcj02_to_wgs84(lon, lat)
    
    
    def wgs84_to_bd09(lon, lat):
        lon, lat = wgs84_to_gcj02(lon, lat)
        return gcj02_to_bd09(lon, lat)
    
    
    def _transformlat(lng, lat):
        ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
              0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
        ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
                math.sin(2.0 * lng * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lat * pi) + 40.0 *
                math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
        ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
                math.sin(lat * pi / 30.0)) * 2.0 / 3.0
        return ret
    
    
    def _transformlng(lng, lat):
        ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
              0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
        ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
                math.sin(2.0 * lng * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lng * pi) + 40.0 *
                math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
        ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
                math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
        return ret
    
    
    def out_of_china(lng, lat):
        """
        判断是否在国内,不在国内不做偏移
        :param lng:
        :param lat:
        :return:
        """
        return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)
    
    if __name__ == '__main__':
        lng = 128.543
        lat = 37.065
        result1 = gcj02_to_bd09(lng, lat)
        result2 = bd09_to_gcj02(lng, lat)
        result3 = wgs84_to_gcj02(lng, lat)
        result4 = gcj02_to_wgs84(lng, lat)
        result5 = bd09_to_wgs84(lng, lat)
        result6 = wgs84_to_bd09(lng, lat)
    
        print(result1, result2, result3, result4, result5, result6)
    
    展开全文
  • 由于工作需要,编写了大地测量方面坐标转换的程序,主要实现以下功能: 投影正反算 布尔沙七参数计算 七参数坐标转换 投影换带 大地坐标系、投影坐标系、空间直角坐标系的任意互转 程序特点: 支持任意...

    由于工作需要,编写了大地测量方面坐标转换的程序,主要实现以下功能:

    1. 投影正反算
    2. 布尔沙七参数计算
    3. 七参数坐标转换
    4. 投影换带
    5. 大地坐标系、投影坐标系、空间直角坐标系的任意互转

    程序特点:

    1. 支持任意椭球参数
      程序内定义了北京54、西安80、WGS84、CGCS2000等常用椭球基准,并且可以采用自定义椭球,只需要输入椭球长轴半径和扁率的倒数两个最常用的参数,即可完成椭球的定义。方便快捷。
    2. 支持单点转换和文件转换两种方式
      两种方式共用一个按键,两种方式同时执行。单点转换可以可视化的观察坐标转换的结果,文件转换可以大批量的进行数据转换,无数量限制。
    3. 支持多种角度单位
      无论是“度”或者dd.mmss的经纬度格式,均可支持。也可以用来进行“度”和dd.mmss格式的转换。

    经过大量的实验数据验证,程序稳定可靠。精度可达到亚毫米级别。

    程序的可执行文件可以免费分享和使用。在CSDN博客我的下载中有。
    源代码有偿提供。
    联系GeoPhoto@126.com

    软件中的基本坐标转换都是通过以下几个核心函数组合实现的。

    //度数和弧度的转换
    double Deg2Rad(double deg);
    double Rad2Deg(double rad);
    
    //度转度分秒
    double Deg2DMS(double deg);
    //度分秒转度
    double DMS2Deg(double DMS);
    
    //高斯投影正反算
    void GaussForward(double a,double f,double B,double L,double L0,double &x,double &y,double east_plus);
    void GaussBackword(double a,double f,double x,double y,double L0,double &B,double &L,double east_plus);
    
    //UTM投影正反算
    void UTMForward(double a,double f,double B,double L,double L0,double &x,double &y,double east_plus);
    void UTMBackword(double a,double f,double x,double y,double L0,double &B,double &L,double east_plus);
    
    //大地坐标系和空间直角坐标系的相互转换
    void BLH2XYZ(double a,double f,double B,double L,double H, double &X,double &Y,double &Z);
    void XYZ2BLH(double a,double f,double X,double Y,double Z, double &B,double &L,double &H);```
    
    

    以上代码每次只能转换一个点的坐标,为了实现点的批量转换,构建下面的类:
    单点类

    /******************坐标系坐标****************
    成员变量有点号、北、东、高
    可以用来表示空间直角坐标系坐标,对应为XYZ
    可以用来表示投影坐标系坐标,对应为北东高
    可以用来表示大地坐标,对应为纬度、经度、椭球高
    ********************************************/
    class Coor
    {
    public:
    	string ID;
    	double east;
    	double north;
    	double h;
    public:
    	Coor();
    	Coor(string ID, double east,double north, double h);
    	void PrintData();
    }
    

    点集类
    通过该类进行批量坐标的转换

    /******************点位坐标的集合****************
    
    ************************************************/
    class CoorVector
    {
    public:
    	vector <Coor> v_coor;
    public:
    	CoorVector();
    	//将上面的单点转换写成批量转换
    	void GaussForward_cv(double a,double f,double L0,double east_plus = 500000);
    	void GaussBackword_cv(double a,double f,double L0,double east_plus = 500000);
    	void UTMBackword_cv(double a,double f,double L0,double east_plus = 500000);
    	void UTMForward_cv(double a,double f,double L0,double east_plus = 500000);
    	void Deg2Rad_cv();
    	void Rad2Deg_cv();
    	void BLH2XYZ_cv(double a,double f);
    	void XYZ2BLH_cv(double a,double f);
    	void DMS2Deg_cv();
    	void Deg2DMS_cv();
    	//读文件
    	bool ReadData(string fileName);
    	//打印数据到屏幕
    	void PrintData();
    	//数据写入文件
    	void WriteData(string fileName);
    };
    

    到此为止,软件可以进行单点和批量的坐标转换,包括大地坐标、高斯投影、UTM投影坐标,空间直角坐标系之间的任意转换,涉及北京54、西安80、WGS84、CGCS2000和自定义坐标系。
    那么给定两组坐标,如何进行布尔沙七参数的反算呢?以及如何进行不同椭球之家附带七参数转换关系的坐标转换呢?下面一个新的类可以解决问题:
    七参数模型类:

    /*****************布尔沙七参数模型*******************
    平移参数DX,DY,DZ 单位米
    旋转参数WX,WY,WZ 单位秒
    尺度参数K,单位ppm
    初值为0,这样即使进行了七参数转换,依然不改变坐标值
    ****************************************************/
    class Brusa
    {
    public:
    	double DX;
    	double DY;
    	double DZ;
    	double WX;
    	double WY;
    	double WZ;
    	double K;
    public:
    	Brusa();
    	
    	/**************根据七参数进行坐标计算****************
    	输入为两组坐标变量,一组转换前,一组转换后
    	坐标系为空间直角坐标系
    	****************************************************/
    	void TransCoor(double X_befor,double Y_befor,double Z_befor,double &X_after,double &Y_after,double &Z_after);
    
    	/*****************布尔沙七参数反算*******************
    	平移参数DX,DY,DZ 单位米
    	旋转参数WX,WY,WZ 单位秒
    	尺度参数K,单位ppm
    	运用最小二乘计算七参数,公式为Ax=B,无需迭代
    	输入为两组点坐标,坐标系为空间直角坐标系,计算完更新
    	单位为米、弧度、单位1
    	两组点数量不一致或者数量少于3对,返回false
    	不进行点名的匹配,同名点按照顺序匹配
    	****************************************************/
    	bool CalBrusa(CoorVector vc_befor, CoorVector vc_after);
    	
    	void PrintData();
    };
    

    该类中一个函数进行七参数反算,一个函数进行使用七参数的坐标转换。下面只贴出最核心的七参数反算代码,该代码进行最小二乘计算,无需迭代。涉及矩阵运算,矩阵运算有自己写的类库,但是太水了,后面改成Engin类库。使用方法自行百度,很简单,类库源代码代码包中有。

    //参数为转换前点集、转换后点集,该函数其实就是解一个Ax=B的矩阵。
    //在代码中A=MA,x=Mx,B=MB.
    bool CalBrusa(CoorVector vc_befor, CoorVector vc_after)
    {
    		//两组坐标点数量不同,不进行计算
    		if (vc_befor.v_coor.size() != vc_after.v_coor.size())
    			return false;
    
    		//点集数量少于3组,无法计算
    		if (vc_befor.v_coor.size() < 3)
    			return false;
    
    		int num = vc_befor.v_coor.size();
    
    		MatrixXd MB(num*3,1);
    		MatrixXd MA(num*3,7);
    
    		for (int i=0;i<num;i++)
    		{
    
    			MB(i*3 + 0, 0) = vc_after.v_coor[i].north - vc_befor.v_coor[i].north;
    			MB(i*3 + 1, 0) = vc_after.v_coor[i].east - vc_befor.v_coor[i].east;
    			MB(i*3 + 2, 0) = vc_after.v_coor[i].h - vc_befor.v_coor[i].h;
    			
    			MA(i*3 + 0, 0) = 1;
    			MA(i*3 + 0, 1) = 0;
    			MA(i*3 + 0, 2) = 0;
    			MA(i*3 + 0, 3) = 0;
    			MA(i*3 + 0, 4) = 0 - vc_befor.v_coor[i].h;
    			MA(i*3 + 0, 5) = vc_befor.v_coor[i].east;
    			MA(i*3 + 0, 6) = vc_befor.v_coor[i].north;
    
    			MA(i*3 + 1, 0) = 0;
    			MA(i*3 + 1, 1) = 1;
    			MA(i*3 + 1, 2) = 0;
    			MA(i*3 + 1, 3) = vc_befor.v_coor[i].h;
    			MA(i*3 + 1, 4) = 0;
    			MA(i*3 + 1, 5) = 0 - vc_befor.v_coor[i].north;
    			MA(i*3 + 1, 6) = vc_befor.v_coor[i].east;
    
    			MA(i*3 + 2, 0) = 0;
    			MA(i*3 + 2, 1) = 0;
    			MA(i*3 + 2, 2) = 1;
    			MA(i*3 + 2, 3) = 0 - vc_befor.v_coor[i].east;
    			MA(i*3 + 2, 4) = vc_befor.v_coor[i].north;
    			MA(i*3 + 2, 5) = 0;
    			MA(i*3 + 2, 6) = vc_befor.v_coor[i].h;
    
    		}
    
    		//double **x = LeastSquare(A,num*3,7,B,num*3,1);
    		MatrixXd Mx(7,1);
    		Mx = MA.colPivHouseholderQr().solve(MB);
    		//Mx = MA.jacobiSvd(ComputeThinU|ComputeThinV).solve(MB);
    
    		DX = Mx(0,0);
    		DY = Mx(1,0);
    		DZ = Mx(2,0);
    		WX = Mx(3,0);
    		WY = Mx(4,0);
    		WZ = Mx(5,0);
    		K  = Mx(6,0);
    	}
    

    软件截图如下:
    在这里插入图片描述
    测试数据:
    下面简单介绍软件使用:
    下面三个点是WGS84坐标系下大地坐标
    坐标排列方式在软件面板上写着:
    p1 30.0 120.0 1000
    p1 30.5 120.5 1000
    p3 30.8 120.8 1000


    选取源坐标,选取源数据的坐标系,选取目标坐标系,选取写入文件,点击坐标转换按钮,即可完成计算。如果批量计算,可以采用文件方式,如果单点计算,面板上的数据框也可以进行单点计算,而不用采用文件方式。点击转换按钮,可以同时计算单点和文件。如果没有文件或者没有单点,也没有关系,忽略即可。

    转换后坐标,UTM投影,中央经线120度。
    p1 3318785.352607667900 500000.000000000000 999.999999991618
    p1 3374297.773515739000 547980.561370084410 999.999999989755
    p3 3407710.849772922700 576532.969669877670 999.999999989755

    下面有刚才的两种数据进行七参数计算。
    在这里插入图片描述
    1选取源数据,2选取转换后数据,34选取数据对应的坐标系,5进行计算。计算完成后,如果需要使用该七参数进行坐标转,需要按6启用七参,再通过坐标转换按钮进行计算。
    七参计算后,在程序文件夹下回生成一个report报告:
    在这里插入图片描述
    包含七参数的值,以及三个方向的误差,以及按照七参数将源数据进行转换,和转换后的数据进行比较,很直观看出来点位的精度和偏差。

    注意:
    七参计算和坐标转换共享一套坐标系选项。七参数只是表示连个椭球之间的空间关系,和坐标系,投影方式以及分度带无关。七参计算完毕后,只要椭球没变,可以任意改变投影的方式。
    另外:
    如果你有七参数,可以填到七参数文本框中,点击启用,计算的时候会将七参数加入计算过程。依然可以得到正确的结果。
    由于数据保密原因,随手写了几个坐标进行转换,读者可以使用真实数据进行验证。该软件进行过大量数据验证,请放心使用。

    展开全文
  • 坐标转换原理

    千次阅读 2019-06-22 08:42:01
    一、坐标转换描述 坐标转换是空间实体的位置描述,是从一种坐标系统变换到另一种坐标系统的过程。通过建立两个坐标系统之间一一对应关系来实现。通常坐标转换有平移、缩放、旋转三个方面的转换。本文只详细讲述关于...

    一、坐标转换描述

    坐标转换是空间实体的位置描述,是从一种坐标系统变换到另一种坐标系统的过程。通过建立两个坐标系统之间一一对应关系来实现。通常坐标转换有平移、缩放、旋转三个方面的转换。本文只详细讲述关于旋转部分的内容。

    二、二维坐标旋转

    一个二维坐标系O-XY绕原点O旋转$\varphi $后变为另一个坐标系O-X'Y'。假设有一点PO-XY坐标系下的坐标为(x,y),经旋转后在O-X'Y'坐标系下的坐标为(x',y'),则两套坐标系下的坐标的对应关系为

     $\left\{\begin{matrix} x^{'}=xcos\varphi-ysin\varphi\\y^{'}=xsin\varphi+ycos\varphi \end{matrix}\right.$

    将其写成矩阵形式为

    $\begin{bmatrix}x^{'}\\ y^{'}\end{bmatrix}=\begin{bmatrix}cos\varphi & -sin\varphi\\ sin\varphi & cos\varphi \end{bmatrix}\begin{bmatrix}x\\ y\end{bmatrix}$ 

    三、三维坐标旋转

    三维坐标转换主要分为右手系(笛卡尔坐标系)和左手系(测量坐标系)两种,其分别绕Z、Y、X顺时针旋转$\kappa,\omega,\varphi $角度。现在来看一看各轴旋转后坐标的变化。

    1、绕Z轴旋转

                  

    右:$\begin{bmatrix}x^{'}\\ y^{'}\\ z^{'}\end{bmatrix}=\begin{bmatrix} cos\kappa&sin\kappa&0\\-sin\kappa&cos\kappa&0\\0&0&1\\ \end{bmatrix}\begin{bmatrix}x\\ y\\ z\end{bmatrix}$ 左:$\begin{bmatrix}x^{'}\\ y^{'}\\ z^{'}\end{bmatrix}=\begin{bmatrix} cos\kappa  & -sin\kappa  & 0\\sin\kappa  & cos\kappa & 0\\ 0 & 0 &1\\ \end{bmatrix}\begin{bmatrix}x\\ y\\ z\end{bmatrix}$ 

    2、绕Y轴旋转

              

    右:$\begin{bmatrix}x^{''}\\ y^{''}\\ z^{''}\end{bmatrix}=\begin{bmatrix} cos\omega &0&-sin\omega \\0&1&0\\sin\omega&0 &cos\omega \\ \end{bmatrix}\begin{bmatrix}x^{'}\\ y^{'}\\ z^{'}\end{bmatrix}$ 左:$\begin{bmatrix}x^{''}\\ y^{''}\\ z^{''}\end{bmatrix}=\begin{bmatrix} cos\omega &0&sin\omega \\0&1&0\\-sin\omega&0 &cos\omega\end{bmatrix}\begin{bmatrix}x^{'}\\ y^{'}\\ z^{'}\end{bmatrix}$

    3、绕X轴旋转

              

     右:$\begin{bmatrix}x^{'''}\\ y^{'''}\\ z^{'''}\end{bmatrix}=\begin{bmatrix}1 & 0 & 0\\ 0 & cos\varphi  & sin\varphi\\0 & -sin\varphi & cos\varphi\\ \end{bmatrix}\begin{bmatrix}x^{''}\\ y^{''}\\ z^{''}\end{bmatrix}$左:$\begin{bmatrix}x^{'''}\\ y^{'''}\\ z^{'''}\end{bmatrix}=\begin{bmatrix}1 & 0 & 0\\ 0 & cos\varphi  & -sin\varphi\\0 & sin\varphi & cos\varphi\\ \end{bmatrix}\begin{bmatrix}x^{''}\\ y^{''}\\ z^{''}\end{bmatrix}$

    4、旋转矩阵融合

    将三轴的旋转融合为一个旋转矩阵R

    右:$\begin{bmatrix}x^{'''}\\ y^{'''}\\ z^{'''}\end{bmatrix}=\begin{bmatrix}1 & 0 & 0\\ 0 & cos\varphi  & sin\varphi\\0 & -sin\varphi & cos\varphi\\ \end{bmatrix}\begin{bmatrix} cos\omega &0&-sin\omega \\0&1&0\\sin\omega&0 &cos\omega \\ \end{bmatrix}\begin{bmatrix} cos\kappa&sin\kappa&0\\-sin\kappa&cos\kappa&0\\0&0&1\\ \end{bmatrix}\begin{bmatrix}x\\ y\\ z\end{bmatrix}=\begin{bmatrix}r_{11} & r_{12} & r_{13}\\ r_{21} & r_{22} & r_{23}\\ r_{31} & r_{32} & r_{33}\end{bmatrix}\begin{bmatrix}x\\ y\\ z\end{bmatrix}$

    左:$\begin{bmatrix}x^{'''}\\ y^{'''}\\ z^{'''}\end{bmatrix}=\begin{bmatrix}1 & 0 & 0\\ 0 & cos\varphi  & -sin\varphi\\0 & sin\varphi & cos\varphi\\ \end{bmatrix}\begin{bmatrix} cos\omega &0&sin\omega \\0&1&0\\-sin\omega&0 &cos\omega\end{bmatrix}\begin{bmatrix} cos\kappa  & -sin\kappa  & 0\\sin\kappa  & cos\kappa & 0\\ 0 & 0 &1\\ \end{bmatrix}\begin{bmatrix}x\\ y\\ z\end{bmatrix}=\begin{bmatrix}r_{11} & r_{12} & r_{13}\\ r_{21} & r_{22} & r_{23}\\ r_{31} & r_{32} & r_{33}\end{bmatrix}\begin{bmatrix}x\\ y\\ z\end{bmatrix}$

     右手坐标系得旋转矩阵R的各个元素为

    $\left\{\begin{matrix}r_{11}=cos\omega cos\kappa &r_{12}=cos\omega sin\kappa &r_{13}=-sin\omega \\ r_{21}=-cos\varphi sin\kappa +sin\varphi sin\omega cos\kappa & r_{22}=cos\varphi cos\kappa +sin\varphi sin\omega sin\kappa &r_{23}=sin\varphi cos\omega \\ r_{31}=sin\varphi sin\kappa +cos\varphi sin\omega cos\kappa&r_{32}=-sin\varphi cos\kappa +cos\varphi sin\omega sin\kappa&r_{33}=cos\varphi cos\omega \end{matrix}\right.$

     左手坐标系得旋转矩阵R的各个元素为

    $\left\{\begin{matrix}r_{11}=cos\omega cos\kappa &r_{12}=-cos\omega sin\kappa &r_{13}=sin\omega \\ r_{21}=cos\varphi sin\kappa +sin\varphi sin\omega cos\kappa & r_{22}=cos\varphi cos\kappa -sin\varphi sin\omega sin\kappa &r_{23}=-sin\varphi cos\omega \\ r_{31}=sin\varphi sin\kappa -cos\varphi sin\omega cos\kappa&r_{32}=sin\varphi cos\kappa +cos\varphi sin\omega sin\kappa&r_{33}=cos\varphi cos\omega \end{matrix}\right.$

    转载于:https://www.cnblogs.com/ambition921009/p/10794413.html

    展开全文
  • 坐标转换

    2019-06-14 21:46:16
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 坐标转换系统

    千次阅读 2018-06-05 20:20:32
    在测绘工作中,涉及到各种坐标转换时人们用得最多的软件是武大的科傻软件,但是科傻软件任然存在许多不足的地方,比如科傻的软件不具有高斯投影换带计算以及大转角三维坐标基准转换的功能等。为了开发出一款功能比科...
  • Unity中的坐标转换

    千次阅读 多人点赞 2020-07-17 16:53:54
    坐标系的概念是由法国数学家笛卡尔提出的。坐标系通常分为左手坐标系和右手坐标系。数学里面采用的是右手坐标系,而Unity采用的是左手坐标系 一:Unity中有四种坐标 ——世界坐标(World Space) 世界坐标很好理解...
  • 坐标转换

    千次阅读 2019-07-26 11:23:22
    根据此图: 1.已知P在XY坐标系下的坐标,X0,Y0,θ的值,可以...2.已知P在XY和X0Y0下的坐标,根据多组值便可算出两个坐标系之间的转换关系 double x0 = 281.321; double y0 = 440.215; double rz = -1.583; ...
  • 经纬度、平面坐标转换方法

    万次阅读 2016-11-13 16:28:57
    使用工具:经纬度与我国54、80大地坐标转换的小工具 我们经常需要进行坐标系之间、经纬度和XY之间的转换,我们使用这个小工具,做一个介绍。 这里以从XY到经纬度的转换为例:首要要明确 XY使用的坐标系XY点...
  • 不同坐标系之间的转换

    万次阅读 2017-06-09 11:22:58
    用户经常会遇到这样的情况,现有的数据坐标不符合要求,... 首先,用户需要明白一点,由于不同的坐标系对应不同的旋转椭球体,所以转换坐标系又包括两种情况:同一基准面下的坐标转换和不同基准面下的坐标转换。 1.同
  • 坐标转换流程与公式 七参数 四参数

    万次阅读 多人点赞 2017-08-18 17:28:23
    简述空间直角坐标系 大地坐标系 平面直角坐标系的相互转换流程与公式
  • 在线坐标系经纬度转换工具

    万次阅读 2019-10-26 22:13:33
    各种坐标体系之间的经纬度如何转换?到底有哪些坐标体系?什么是火星坐标?为什么我的坐标,在地图上显示会有偏移?本工具可以转换国测局坐标(火星坐标,比如高德地图在用),百度坐标,wgs84坐标(谷歌国外以及绝大部分...
  • 转载于:http://www.ab126.com/Geography/3753.html原文博主只让引用链接。
  • 一、各坐标系介绍图像处理、立体视觉经常涉及到世界坐标系、相机坐标系、图像坐标系和像素坐标系。如下图所示:世界坐标系是为了确定相机的位置,在双目视觉中一般将世界坐标系原点定在左相机、右相机或两者X轴方向...
  • 平面坐标转大地坐标(经纬度)

    万次阅读 2016-09-30 16:05:45
    1.网上下载COORD坐标转换工具。1.2M 2.设置   源坐标类型选择“平面坐标” 目标坐标类型选择“大地坐标”,椭球基准,根据自己源文件坐标类型来选,我的文件类型是 西安80坐标系,所以选择 国家-80坐标。 3.投影...
  • 1.单纯移轴.  设Oxy,O'x'y'是两个直角坐标系,坐标轴有相同的...在移轴下,坐标转换公式是   x=x'+x0, y=y'+y0. 2.单纯转轴. 设新旧坐标系有相同的坐标原点O,由Ox到Ox'的角度为t,坐标转换公式是   x=x'cost-y'
  • Cocos Creator 节点的坐标转化

    万次阅读 2018-10-23 10:16:19
    //将世界坐标转换为模型坐标。 convertToNodeSpaceAR(worldPoint);//将世界坐标转换为模型坐标。AR表示相对于锚点。 convertTouchToNodeSpace(touch);//将世界坐标中触摸点转换为模型坐标。 ...
  • unity 屏幕坐标&世界坐标相互转换

    万次阅读 2018-02-11 21:04:53
    世界坐标转屏幕坐标:Vector3 screenPos = Camera.main.WorldToScreenPoint(pos); 屏幕坐标转世界坐标:Vector3 worldPos = Camera.main.ScreenToWorldPoint(pos);
  • 本篇微信图文主要介绍Matlab数据可视化方面的内容。polar、pol2cart、cart2pol
1 2 3 4 5 ... 20
收藏数 213,663
精华内容 85,465
关键字:

坐标转换