3

从 mysql 中的地理空间列中,我得到以下字符串值,我想将其转换为数组。最终目标是将其转换为 geoJSON。

POLYGON((4.885838 52.388063,4.891061 52.388381,4.890973 52.382909))

该字符串有 3 个坐标对,x 和 y 坐标用空格分隔,坐标对用逗号分隔。确切的数字是未知的和可变的。也POLYGON可以不同于三种不同的设置。

以我对注册的一点了解。表达我想出了这个:

$pat = '/^(POLYGON|LINESTRING|POINT)(\(\() (.....) (\)\))$/';
preg_match($pat, $str, $matches);

用双括号的坐标部分作为不确定部分。

谁能帮我解决这个问题?

编辑最终生成的数组应如下所示:

$array['type'] = POLYGON | LINESTRING ....
$array['coordinates'] = array of all the coordinates.
4

3 回答 3

2

你最好分阶段解决这个问题。只有第一阶段需要使用正则表达式:

  1. 将整个坐标字符串作为一个 glob 查找,例如:

    "4.885838 52.388063,4.891061 52.388381,4.890973 52.382909"

  2. 将该字符串拆分为以逗号分隔的坐标对。在 Python 中,我们将使用str.split(','). 我相信您的 PHP 等效项称为explode().

    [ "4.885838 52.388063" , "4.891061 52.388381" , "4.890973 52.382909" ]

  3. 将每个坐标对分成两个用空格分隔的数字:str.split(' ').

    [ ["4.885838","52.388063"] , ["4.891061","52.388381"] , ["4.890973","52.382909"] ]

  4. 转换为浮点数。在 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上看到正则表达式。

于 2012-05-14T08:44:54.180 回答
0

我认为在坐标字符串上使用explodearray_map更容易,更易于维护:

$coordString = $matches[3];
$coordinates = array_map(function($e) { return explode(' ', $e); },
                         explode(',', $coordString));
于 2012-05-14T08:42:12.987 回答
0

我偶然发现了同样的问题,但是在我的情况下,我发现诸如POLYGON ((-1.23 2.34, 3.45 4.56), (3.21 4.32, 5.43 6.54))上述正则表达式之类的模式对我执行第 1 步不起作用。经过一番挠头后,我得到了以下模式:/(((([-]?\d+\.\d+) ([-]?\d+\.\d+))[, ]?)+[, ]?)+/. 然后,您将遍历以逗号分隔的匹配项,最后以空格分隔。我不是正则表达式大师,所以也许有人有更好的解决方案。

于 2020-04-07T13:37:05.407 回答