2

我在这里遇到了另一个与坐标相关的查询。我有许多 CSV 文件,它们都提到了一堆坐标,但是坐标格式不同,例如某些文件的坐标如下所示:

40.0873°N 20.1531°E

虽然有些人是这样的:

27°50′21″N 00°11′07″W

我需要一种在 PHP 中设置函数的方法:

首先推断出坐标的格式

然后将坐标转换为纬度和经度,如下所示:

37.235
-115.811111

另外,我了解第二种格式是 Hours Minutes Seconds - 问题是我如何从这种字符串中提取小时分钟和秒。

任何帮助将不胜感激...

4

3 回答 3

4

代码:

print_r(parse("40.0873°N 20.1531°E"));
print_r(parse("27°50′21″N 00°11′07″W"));
function parse($coord)
{
    $strings = split(' ',$coord);
    $ret['lat'] = degree2decimal($strings[0]);
    $ret['lon'] = degree2decimal($strings[1]);
    return $ret;
}
function degree2decimal($deg_coord="")
{
    $dpos=strpos($deg_coord,'°');
    $mpos=strpos($deg_coord,'‘');
    $spos=strpos($deg_coord,'"');
    $mlen=(($mpos-$dpos)-1);
    $slen=(($spos-$mpos)-1);
    $direction=substr(strrev($deg_coord),0,1);
    $degrees=substr($deg_coord,0,$dpos);
    $minutes=substr($deg_coord,$dpos+1,$mlen);
    $seconds=substr($deg_coord,$mpos+1,$slen);
    $seconds=($seconds/60);
    $minutes=($minutes+$seconds);
    $minutes=($minutes/60);
    $decimal=($degrees+$minutes);
    if (($direction=="S") or ($direction=="W"))
        { $decimal=$decimal*(-1);}
    return $decimal;
}

输出:

Array
(
    [lat] => 40.08732425
    [lon] => 20.153142527778
)
Array
(
    [lat] => 27.835277777778
    [lon] => -0.18333333333333
)
于 2009-11-09T09:24:48.233 回答
1

假设这些是仅有的两种格式,您可以通过在字符串中搜索 ' 或 " 来找到字符串的格式(您可以使用strpos)。

如果格式是第一种类型,则几乎不需要转换 - 使用 N/S 和 E/W 来确定是否需要将值设为负数。

如果您有度数、分钟数和秒数,则可以使用sscanf从字符串中获取值。一旦你有了单独的值,你就可以找到十进制度数为度 + 分钟 / 60 + 秒 / (60 * 60)。

于 2009-11-09T09:13:30.753 回答
1

你需要的是一些正则表达式。您可以将正则表达式与 php 中的函数结合使用,以从给定字符串中提取您想要的任何内容。我可能会做的是使用正则表达式来检查给定文件的格式,然后我会遍历文件的每一行,使用正则表达式来提取相关信息。例如,您可以使用正则表达式[0-9]{1,3}\.[0-9]{1,4}°(N|W|E|S)来检查某些内容是否与第一种类型匹配。然后,您可以将输入的每一行与类似的内容进行匹配([0-9]{1,3})\.([0-9]{1,4})°(N|W|E|S)preg_match_all并从中提取相关数据matches大批。从这里,您将获得转换所需的所有数据。可以为其他类型做类似的事情。请注意,我没有安装 php 来测试这些正则表达式,因此它们可能需要一些细微的调整以避免 php 在读取它们时爆炸(很可能°字符可能需要以不同的方式编码,尽管您可能只是使用.元字符,因为它将匹配任何单个非空格字符)。

一些正则表达式的好资源:

正如上面的 SO 链接中提到的,拥有某种测试器对于生成正则表达式非常有用,无论是RegEx BuddyReggy还是Kodos

于 2009-11-09T09:44:25.147 回答