2012-05-14 4 views
3

À partir d'une colonne géospatiale dans mysql, j'obtiens la valeur de chaîne suivante que je veux convertir en tableau. L'objectif ultime est de le convertir en geoJSON.Quelle expression régulière utiliser pour convertir cette chaîne en tableau?

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

Cette chaîne a 3 paires de coordonnées avec les coordonnées x et y séparées par un espace et les paires séparées par une virgule. Le nombre exact n'est pas connu et variable. Le POLYGON peut également différer selon trois paramètres différents.

Avec ma petite connaissance de reg. expressions je suis venu avec ceci:

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

Avec la partie des coordonnées avec les doubles parenthèses comme partie incertaine.

Quelqu'un peut-il m'aider avec ceci?

modifier En fin de compte le tableau résultant devrait ressembler à ceci:

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

À quoi devrait ressembler le tableau? – Joey

+0

Ajout d'un exemple de tableau de résultats. Merci d'avoir regardé ça! – stUrb

Répondre

0

Je pense qu'il est plus facile et plus maintenable simplement utiliser explode et array_map sur la chaîne de coordonnées:

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

Vous » Il vaut mieux s'attaquer à cela par étapes. Seule la première étape doit utiliser regex:

  1. Trouver la chaîne entière de coordonnées comme l'un glob, par exemple:

    "4.885838 52.388063,4.891061 52.388381,4.890973 52.382909"

  2. de Split cette chaîne jusqu'à en paires de coordonnées séparées par des virgules. En Python, nous utiliserions str.split(','). Je crois que votre équivalent PHP est appelé explode().

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

  3. de Split chaque paire de coordonnées en deux nombres séparés par un espace: str.split(' ').

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

  4. Convertir en flotte. En python, nous utilisons float(): votre équivalent local peut s'appeler str2float() ou similaire.

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

Pour trouver la chaîne de chiffres pour l'étape 1, essayer l'expression rationnelle

([-]?\d+.\d+ [-]?\d+.\d+)((,[-]?\d+.\d+ [-]?\d+.\d+)+)? 

qui trouve au moins une paire de coordonnées en format x y, avec des paires de coordonnées séparées par des virgules . Vous pouvez voir l'expression régulière en action sur regexr.

+0

Merci pour votre réponse. J'ai utilisé la méthode que vous avez décrite mais la fonction d'emil Vikström. – stUrb

Questions connexes