在C中从DMS转换为Lat Long
我有一个坐标对的输入文件(比如说10行),每行看起来像这样: (1653408W,503223N)(1651614W,502806N) 这些是以DMS格式给出的Lat-Long值。我想将其转换为更人性化的格式,如: 1931259W-->193d 12m 59s W在C中从DMS转换为Lat Long,c,C,我有一个坐标对的输入文件(比如说10行),每行看起来像这样: (1653408W,503223N)(1651614W,502806N) 这些是以DMS格式给出的Lat-Long值。我想将其转换为更人性化的格式,如: 1931259W-->193d 12m 59s W 我找到了一种使用fscanf遍历文件中每一行的方法,但我不知道如何转换表格。因此,您的坐标似乎是以dddmms格式给出的,其中DDD是一个(最多)三位数的度数,MM是两位数的分钟数,SS是两位数的秒数,两者之间没有分隔符 从技术上讲
我找到了一种使用fscanf遍历文件中每一行的方法,但我不知道如何转换表格。因此,您的坐标似乎是以
dddmms
格式给出的,其中DDD
是一个(最多)三位数的度数,MM
是两位数的分钟数,SS
是两位数的秒数,两者之间没有分隔符
从技术上讲,解析这样一种格式的“正确”方法是将字符串分成若干段,然后将每一段分别转换为一个整数。但是,由于您已经将整个坐标值读入一个整数,就好像它是一个十进制数一样,因此我们可以使用它并使用简单的数学提取度、分和秒:
int dddmmss = 1631259; /* hardcoded input value for testing */
int degrees = dddmmss / 10000; /* drop the lowest 4 digits */
int minutes = (dddmmss / 100) % 100; /* drop the lowest 2 digits, then keep the next 2 */
int seconds = dddmmss % 100; /* just keep the lowest 2 digits */
printf("%03d° %02d' %02d''", degrees, minutes, seconds);
因此,您的坐标似乎是以
dddmms
格式给出的,其中DDD
是(最多)三位数的度数,MM
是两位数的分钟,SS
是两位数的秒,它们之间没有分隔符
从技术上讲,解析这样一种格式的“正确”方法是将字符串分成若干段,然后将每一段分别转换为一个整数。但是,由于您已经将整个坐标值读入一个整数,就好像它是一个十进制数一样,因此我们可以使用它并使用简单的数学提取度、分和秒:
int dddmmss = 1631259; /* hardcoded input value for testing */
int degrees = dddmmss / 10000; /* drop the lowest 4 digits */
int minutes = (dddmmss / 100) % 100; /* drop the lowest 2 digits, then keep the next 2 */
int seconds = dddmmss % 100; /* just keep the lowest 2 digits */
printf("%03d° %02d' %02d''", degrees, minutes, seconds);
我无法以人类可读的方式打印DMS值。我不知道如何转换:1931259W-->193d 12m 59s W,C格式。如果使用
strtol
(推荐)将字符串转换为数字,它将为您提供一个指向它转换的数字结尾的指针,该指针将指向象限后缀N、E、W或S。此外,如果方向为“S”,则该值必须转换为负数。当方向为“E”时,类似的考虑也适用。顺便说一句:在世界范围内,193的值大于180度,因此即使方向为“W”,也需要将该值调整为360-193。。N/S也有类似的考虑,但限制为90度。我无法以人可读的方式打印DMS值。我不知道如何转换:1931259W-->193d 12m 59s W,C格式。如果使用strtol
(推荐)将字符串转换为数字,它将为您提供一个指向它转换的数字结尾的指针,该指针将指向象限后缀N、E、W或S。此外,如果方向为“S”,则该值必须转换为负数。当方向为“E”时,类似的考虑也适用。顺便说一句:在世界范围内,193的值大于180度,因此即使方向为“W”,也需要将该值调整为360-193。。对于N/S也有类似的考虑,但限制是90度尼斯技术,尽管作为每天都这么做的人,我发现这个例子非常痛苦,因为在我的工作中,经度从来都不大于180!此外,分钟从不大于59,秒从不大于59,因此“%”后面的值不应为100@user3629249:fscanf()
(或atoi()
或strtol()
等)不知道,只需解析整个DDDMMSS
数字字符串,就好像它是一个十进制数字一样。这意味着,要从这个数字中提取最后两位数字,我们需要使用%100
。当然你是对的,对于有效的输入,这个模运算的结果不能大于59。如果您想格外小心,可以检查是否存在这种情况,如果出现这种情况,可以输出错误消息。@IlmariKaronen,OP发布的示例数据已经显示了193度的值。这意味着它超过了世界的1/2,实际允许值为-180+180所以这些值需要converted@user3629249当前位置我怀疑这只是OP示例中的一个输入错误。我想我可以在我的答案中把它改成,比如说,163度,让它看起来不那么“痛苦”。这是一个很好的技巧,尽管作为一个每天都这么做的人,我发现这个例子很痛苦,因为在我做的工作中,经度从来没有超过180度!此外,分钟从不大于59,秒从不大于59,因此“%”后面的值不应为100@user3629249:fscanf()
(或atoi()
或strtol()
等)不知道,只需解析整个DDDMMSS
数字字符串,就好像它是一个十进制数字一样。这意味着,要从这个数字中提取最后两位数字,我们需要使用%100
。当然你是对的,对于有效的输入,这个模运算的结果不能大于59。如果您想格外小心,可以检查是否存在这种情况,如果出现这种情况,可以输出错误消息。@IlmariKaronen,OP发布的示例数据已经显示了193度的值。这意味着它超过了世界的1/2,实际允许值为-180+180所以这些值需要converted@user3629249当前位置我怀疑这只是OP示例中的一个输入错误。我想我可以在我的答案中把它改成,比如说,163度,让它看起来不那么“痛苦”。