2012-05-14 5 views
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. 
+0

Как должен выглядеть массив? – Joey

+0

Добавлен пример массива результатов. Спасибо, что посмотрели! – stUrb

ответ

0

Я думаю, что это проще и ремонтопригодны просто использовать explode и array_map на координатной строке:

$coordString = $matches[3]; 
$coordinates = array_map(function($e) { return explode(' ', $e); }, 
         explode(',', $coordString)); 
2

You» Лучше всего это решать поэтапно. Только первый этап должен использовать регулярное выражение:

  1. Найти всю строку координат в качестве одного из Glob, например:

    "4.885838 52.388063,4.891061 52.388381,4.890973 52.382909"

  2. Split что поднапрячься в пары координат, разделенные запятой. В Python мы будем использовать str.split(','). Я считаю, что ваш эквивалент PHP называется explode().

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

  3. Split каждая пара координат в двух чисел, разделенных пробелом: 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.

+0

Благодарим вас за ответ. Я использовал метод, который вы описали, но функцию Эмиля Викстрема. – stUrb

 Смежные вопросы

  • Нет связанных вопросов^_^