2012-05-14 61 views
3

從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

該陣列應該如何? – Joey

+0

添加了一個示例結果數組。感謝您的關注! – stUrb

回答

0

我認爲這是更簡單,更易於維護,只需使用explodearray_map的座標串:

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

你」最好在分階段解決這個問題。只有第一個階段需要使用正則表達式:

  1. 找到座標的整個字符串作爲一個水珠,例如:

    "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上看到正在使用的正則表達式。

+0

謝謝你的回答。我使用了你描述的方法,但使用了emilVikström的功能。 – stUrb

相關問題