加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

常用的经纬度格式的转换

(2017-12-15 10:07:36)
分类: 经验之谈
一、问题的提出
测量中,常用的经纬度格式主要有三种:
a.小数度,ddd.ddddddddd,如39.723890912°
b.度分秒,ddd.mmsssssss,这是一种非正式的简略写法,如120.561290721,等价于120°56′12.90721″
c.带符号的度分秒,ddd°mm′ss.sssss″,如89°23′41.02091″
实际应用中,常常混用这些格式,导致很多不便。
实现这三种格式的转换非常简单,a与b的互相转换,使用EXCEL,通过简单的算术加减乘除和字符串加减就可实现;b和c的互相转换,在EXCEL中进行简单的字符替换和字符串加减就可实现。但是面对一些极端情况,EXCEL会出现一些意想不到的问题。
例如从b转换到c:
http://s15/mw690/0025fJtpzy7gAMdaNJQ5e&690
本例中,我使用LEFT和MID函数来提取指定位置和长度的字符串,提取出度、分、秒,最后再拼接。第三行出现了问题,其秒数为整数40,提取函数为MID(B3,6,2),提取结果是4,导致最终的秒数变成了4,偏差达到了36″,这个错误是无法容忍的。而且最终的格式也不规整,很不美观。一旦字符串中含有0,LEFT和MID函数会自动忽略。
我曾经用这个方法将8000多个点从格式b转到c,放在报告上。事后才发现错误,幸好报告尚未提交,还能修改,否则后果不堪设想。
也许EXCEL中有方法可以避免这种情况,但我没查到。久闻EXCEL强大的宏的大名,但我对EXCEL的宏操作一窍不通。所以说只能自己编程实现了。

二、程序设计
这是我通过VS2017 WPF实现的程序。
http://s13/mw690/0025fJtpzy7gAMgb3zK5c&690
结合实际经验,我的程序有以下一些特点,以方便实际应用:
(1)支持多种字段格式输入:
a.No,B,L,H
b.No,B,L
c.B,L,H
d.B,L
其中,No是点名,B是纬度,L是经度,H是大地高。
(2)支持输入文本中的多种分隔符
实际应用中,各字段之间的分隔符往往是不规则的。本程序能识别Tab、空格(单个或多个)、逗号(中文和英文)、换行符、回车,将文本分割提取。
(3)可设置输出文本的分隔符
输出文本中,可将分隔符设置为Tab,空格,英文逗号。默认是Tab,便于直接复制粘贴到EXCEL。
(4)输入方式和输出方式的多样性
文本的输入有两种方式:
a.打开已有文本文件
b.直接粘贴至textBox,或直接在textBox手动输入
文本的输出有两种方式:
a.另存为文本文件
b.直接复制textBox中的结果

三、注意事项
总结一下编程中的注意事项:
(1)注意度分秒为负值的情况
若直接使用Floor函数提取度、分、秒的整数值,在经纬度为负值(南纬,西经)的情况下,会出错。解决方法是用一个变量记录正负号,再使用Abs函数获取经纬度的绝对值,再使用Floor函数提取度、分、秒的整数值。虽然短期内中国领土不会涉及到南纬和西经,但本着科学的态度,还是尽量考虑。
(2)注意细节错误
虽然程序算法很简单,但是经常有意想不到的错误,需经过大量数据的测试才能发现。比如,23.4°,在转换过程中,经过乘除60的操作,可能会产生小数,比如59.99999999999972″,最后结果经四舍五入输出可能会出现23°23′60.00000″的情况。解决方法是,四舍五入后还需再判断一次结果是否有意义,才可输出。
(3)textBox和文本文件的换行符不同
textBox的换行符是\n,而txt文本的换行符是\r\n,读取和写入时要注意。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有