从mysql中的地理空间列我得到以下字符串值,我想将其转换为数组。最终目标是将其转换为geoJSON。
POLYGON((4.885838 52.388063,4.891061 52.388381,4.890973 52.382909))
此字符串有3个坐标对,x和y坐标用空格分隔,对用逗号分隔。确切的数字是未知的和可变的。此外,POLYGON
可以有三种不同的设置。
凭借我对reg的一点知识。表达我想出了这个:
$pat = '/^(POLYGON|LINESTRING|POINT)(\(\() (.....) (\)\))$/';
preg_match($pat, $str, $matches);
将带有双括号的坐标部分作为不确定部分。
有人可以帮我吗?
编辑最终生成的数组应如下所示:
$array['type'] = POLYGON | LINESTRING ....
$array['coordinates'] = array of all the coordinates.
答案 0 :(得分:2)
你最好分阶段解决这个问题。只有第一阶段需要使用正则表达式:
将整个坐标字符串查找为一个glob,例如:
"4.885838 52.388063,4.891061 52.388381,4.890973 52.382909"
将该字符串拆分为以逗号分隔的坐标对。在Python中,我们将使用str.split(',')
。我相信你的PHP等价物称为explode()
。
[ "4.885838 52.388063" , "4.891061 52.388381" , "4.890973 52.382909" ]
将每个坐标对拆分为两个以空格分隔的数字:str.split(' ')
。
[ ["4.885838","52.388063"] , ["4.891061","52.388381"] , ["4.890973","52.382909"] ]
转换为浮点数。在python中,我们使用float()
:您的本地等效项可能被称为str2float()
或类似。
[ [4.885838,52.388063] , [4.891061,52.388381] , [4.890973,52.382909] ]
要查找步骤1的数字字符串,请尝试使用正则表达式
([-]?\d+.\d+ [-]?\d+.\d+)((,[-]?\d+.\d+ [-]?\d+.\d+)+)?
以x y
格式查找至少一对坐标,坐标对以逗号分隔。您可以在regexr上看到正则表达式。
答案 1 :(得分:0)
我认为在坐标字符串上使用explode和array_map更简单,更易于维护:
$coordString = $matches[3];
$coordinates = array_map(function($e) { return explode(' ', $e); },
explode(',', $coordString));
答案 2 :(得分:0)
我偶然遇到了一个同样的问题,但是在我的情况下,我发现了诸如POLYGON ((-1.23 2.34, 3.45 4.56), (3.21 4.32, 5.43 6.54))
之类的模式,上面的正则表达式对我来说无法执行步骤1。 :/(((([-]?\d+\.\d+) ([-]?\d+\.\d+))[, ]?)+[, ]?)+/
。然后,您将遍历以逗号分隔的匹配项,最后以空格分隔。我不是正则表达式专家,所以也许有人有更好的解决方案。