Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.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
Php 需要转换一组坐标_Php_Coordinate Systems - Fatal编程技术网

Php 需要转换一组坐标

Php 需要转换一组坐标,php,coordinate-systems,Php,Coordinate Systems,我被另一个坐标相关的查询卡住了。我有许多CSV文件,它们都有一组提到的坐标,但是坐标的格式不同,就像一些文件的坐标显示为: 40.0873°N 20.1531°E 而有些则是这样: 27°50′21″N 00°11′07″W 我需要一种在PHP中设置函数的方法: 首先推导出坐标的格式 然后将坐标转换为纬度和经度,如下所示: 37.235 -115.811111 另外,我知道第二种格式是小时-分-秒-问题是如何从这种字符串中提取小时-分和秒 如果您能提供任何帮助,我们将不胜感激……假设这是仅

我被另一个坐标相关的查询卡住了。我有许多CSV文件,它们都有一组提到的坐标,但是坐标的格式不同,就像一些文件的坐标显示为:

40.0873°N 20.1531°E
而有些则是这样:

27°50′21″N 00°11′07″W
我需要一种在PHP中设置函数的方法:

首先推导出坐标的格式

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

37.235
-115.811111
另外,我知道第二种格式是小时-分-秒-问题是如何从这种字符串中提取小时-分和秒


如果您能提供任何帮助,我们将不胜感激……

假设这是仅有的两种格式,您可以通过在字符串中搜索“或”(您可以用于此)来找到字符串的格式

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

如果有度数、分和秒,则可以使用从字符串中获取值。一旦有了单个值,则可以将十进制度数作为度数+分/60+秒/(60*60)。

代码:

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
)

您需要的是一些正则表达式。您可以将正则表达式与php中的函数结合使用,从给定字符串中提取您想要的任何内容。我可能要做的是使用正则表达式检查给定文件的格式,然后我将迭代文件的每一行,使用正则表达式提取相关信息n、 例如,您可以使用像
[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\u match\u all
并从
matches
数组中提取相关数据。从这里,您将获得转换所需的所有数据。对于其他类型,也可以执行类似的操作。请注意,我没有php安装来测试这些正则表达式,因此它们可能需要一些细微的调整来避免php在读取它们时会爆炸(很可能
°
字符需要不同的编码,尽管您可能只使用
元字符,因为它将匹配任何单个非空格字符)

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


正如上面的SO链接中所提到的,拥有某种类型的测试仪对于生成正则表达式非常有用,无论是类似,还是。

感谢大家的帮助:)这可能是一个优雅的解决方案。