Php 需要转换一组坐标
我被另一个坐标相关的查询卡住了。我有许多CSV文件,它们都有一组提到的坐标,但是坐标的格式不同,就像一些文件的坐标显示为: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 另外,我知道第二种格式是小时-分-秒-问题是如何从这种字符串中提取小时-分和秒 如果您能提供任何帮助,我们将不胜感激……假设这是仅
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链接中所提到的,拥有某种类型的测试仪对于生成正则表达式非常有用,无论是类似,还是。感谢大家的帮助:)这可能是一个优雅的解决方案。