Из геопространственного столбца в 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.
Я думаю, что проще и удобнее обслуживать только explode и array_map в строке координат:
$coordString = $matches[3]; $coordinates = array_map(function($e) { return explode(' ', $e); }, explode(',', $coordString));
Лучше всего решать это поэтапно. Только первый этап должен использовать регулярное выражение:
Найдите всю строку координат как один глобус, например:
"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+)+)?
который находит по крайней мере одну пару координат в формате xy
с координатными парами, разделенными запятыми. Вы можете видеть регулярное выражение в действии на regexr .