2

ここで別の座標関連のクエリに行き詰まっています。私はいくつかのCSVファイルを持っており、それらにはすべて座標が記載されていますが、座標は次のように示されているファイルのように異なる形式になっています。

40.0873°N 20.1531°E

いくつかはそのように持っていますが:

27°50′21″N 00°11′07″W

PHP で次の関数を設定する方法が必要です。

まず、座標の形式を推測します

次に、座標を緯度と経度に次のように変換します。

37.235
-115.811111

さらに、2 番目の形式は時間、分、秒であることを理解しています。問題は、この種の文字列から時間、分、秒を抽出する方法です。

どんな助けでも大歓迎です...

4

3 に答える 3

4

コード:

print_r(parse("40.0873°N 20.1531°E"));
print_r(parse("27°50′21″N 00°11′07″W"));
function parse($coord)
{
    $strings = split(' ',$coord);
    $ret['lat'] = degree2decimal($strings[0]);
    $ret['lon'] = degree2decimal($strings[1]);
    return $ret;
}
function degree2decimal($deg_coord="")
{
    $dpos=strpos($deg_coord,'°');
    $mpos=strpos($deg_coord,'‘');
    $spos=strpos($deg_coord,'"');
    $mlen=(($mpos-$dpos)-1);
    $slen=(($spos-$mpos)-1);
    $direction=substr(strrev($deg_coord),0,1);
    $degrees=substr($deg_coord,0,$dpos);
    $minutes=substr($deg_coord,$dpos+1,$mlen);
    $seconds=substr($deg_coord,$mpos+1,$slen);
    $seconds=($seconds/60);
    $minutes=($minutes+$seconds);
    $minutes=($minutes/60);
    $decimal=($degrees+$minutes);
    if (($direction=="S") or ($direction=="W"))
        { $decimal=$decimal*(-1);}
    return $decimal;
}

出力:

Array
(
    [lat] => 40.08732425
    [lon] => 20.153142527778
)
Array
(
    [lat] => 27.835277777778
    [lon] => -0.18333333333333
)
于 2009-11-09T09:24:48.233 に答える
1

必要なのは正規表現です。正規表現を php の関数と組み合わせて使用​​して、特定の文字列から必要なものを抽出できます。私がおそらく行うことは、正規表現を使用して特定のファイルの形式を確認し、正規表現を使用して関連情報を抽出して、ファイルの各行を反復処理することです。たとえば、次のような正規表現を使用して、[0-9]{1,3}\.[0-9]{1,4}°(N|W|E|S)何かが最初のタイプに一致するかどうかを確認できます。次に、入力の各行を([0-9]{1,3})\.([0-9]{1,4})°(N|W|E|S)withのようなものとpreg_match_all照合し、関連するデータをmatches配列。ここから、変換に必要なすべてのデータが得られます。他のタイプについても同様のことができます。これらの正規表現をテストするための php インストールがないことに注意してください。したがって、それらを読み取るときに php が爆発するのを避けるために、若干の微調整が必​​要になる場合があります (ほとんどの場合、°文字は別の方法でエンコードする必要があるかもしれませんが、おそらく.スペース以外の任意の 1 文字と一致するため、メタ文字を使用します)。

正規表現に関するいくつかの優れたリソース:

上記の SO リンクで述べたように、ある種のテスターを持つことは、それがRegEx BuddyReggy、またはKodosのようなものであろうと、正規表現を生成するのに非常に役立ちます。

于 2009-11-09T09:44:25.147 に答える
1

これらが 2 つの形式のみであると仮定すると、' または " を検索することで、文字列がどの形式であったかを見つけることができます (これにはstrposを使用できます)。

フォーマットが最初のタイプの場合、変換はほとんど必要ありません。N/S と E/W を使用して、値を負にする必要があるかどうかを判断してください。

度、分、秒がある場合は、sscanfを使用して文字列から値を取得できます。個々の値を取得したら、度 + 分 / 60 + 秒 / (60 * 60) として 10 進度を見つけることができます。

于 2009-11-09T09:13:30.753 に答える