3

mysqlの地理空間列から、配列に変換したい次の文字列値を取得しています。最終的な目標は、それをgeoJSONに変換することです。

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

この文字列には、スペースで区切られたx座標とy座標、およびコンマで区切られたペアを持つ3つの座標ペアがあります。正確な数は不明であり、変動します。また、POLYGON3つの異なる設定に異なる場合があります。

regの私の少しの知識で。私がこれを思いついた表現:

$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. 座標の文字列全体を 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. 各座標ペアをスペースで区切られた 2 つの数値に分割しますstr.split(' ')

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

  4. float に変換します。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これは、コンマで区切られた座標ペアを使用して、フォーマット内の座標のペアを少なくとも 1 つ見つけます。regexrで正規表現の動作を確認できます。

于 2012-05-14T08:44:54.180 に答える
0

座標文字列でexplodeとarray_mapを使用する簡単で保守しやすいと思います:

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