Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中从DMS转换为Lat Long_C - Fatal编程技术网

在C中从DMS转换为Lat Long

在C中从DMS转换为Lat Long,c,C,我有一个坐标对的输入文件(比如说10行),每行看起来像这样: (1653408W,503223N)(1651614W,502806N) 这些是以DMS格式给出的Lat-Long值。我想将其转换为更人性化的格式,如: 1931259W-->193d 12m 59s W 我找到了一种使用fscanf遍历文件中每一行的方法,但我不知道如何转换表格。因此,您的坐标似乎是以dddmms格式给出的,其中DDD是一个(最多)三位数的度数,MM是两位数的分钟数,SS是两位数的秒数,两者之间没有分隔符 从技术上讲

我有一个坐标对的输入文件(比如说10行),每行看起来像这样:

(1653408W,503223N)(1651614W,502806N)

这些是以DMS格式给出的Lat-Long值。我想将其转换为更人性化的格式,如: 1931259W-->193d 12m 59s W


我找到了一种使用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度,让它看起来不那么“痛苦”。