2

TomTom GPS デバイスに POI データを追加する .ov2 ファイルを作成する方法を見つけようとしています。データの形式は次のようにする必要があります。

OV2 ファイルは、POI レコードで構成されています。各レコードのデータ形式は次のとおりです。

  • 1 バイト、文字、POI ステータス ('0' または '2')
  • 4 BYTES (ロング) は、POI レコードの長さを示します。
  • 4 バイト、ロング、経度 * 100000
  • 4 バイト、ロング、緯度 * 100000
  • x BYTES、文字列、POI のラベル、x =3D=3D 全長 =96 (1 + 3 * 4)
  • ヌルバイトの終了。

.csv ファイルを取得し、1 行ずつ調べて、各レコードを分割し、適切な形式で新しいファイルに書き込む次の PHP コードを見つけました。誰かがこれをJavaに翻訳するのを手伝ってくれることを望んでいました. 「--->」矢印でマークした行だけが本当に必要です。私はPHPをまったく知りませんが、その1行以外はすべて基本的なもので、それを見て翻訳することはできますが、その1行でPHP関数が何をしているのかわかりません。誰かがそれを十分に説明できたとしても、Javaで理解できるかもしれません。直訳できるならお願いしますが、説明だけでも助かります。ありがとう。

<?php 
$csv = file("File.csv"); 
$nbcsv = count($csv); 
$file = "POI.ov2"; 
$fp = fopen($file, "w"); 
for ($i = 0; $i < $nbcsv; $i++) { 
    $table = split(",", chop($csv[$i])); 
    $lon = $table[0]; 
    $lat = $table[1]; 
    $des = $table[2]; 
    --->$TT = chr(0x02).pack("V",strlen($des)+14).pack("V",round($lon*100000)).pack("V",round($lat*100000)).$des.chr(0x00); 
    @fwrite($fp, "$TT"); 
} 
fclose($fp);
?>
4

2 に答える 2

2

ファイルを配列にロードします。各要素はファイルからの行です。

$csv = file("File.csv"); 

配列内の要素の数を数えます。

$nbcsv = count($csv); 

書き込み用に出力ファイルを開きます。

$file = "POI.ov2"; 
$fp = fopen($file, "w"); 

$i<配列アイテムの数の間、$i++

for ($i = 0; $i < $nbcsv; $i++) { 

行を右にトリミングし(すべての空白を削除)、文字列を「、」で分割します。$tablecsv行の値の配列です。

    $table = split(",", chop($csv[$i])); 

テーブルの構成要素を数値インデックスによって独自の変数に割り当てます。

    $lon = $table[0]; 
    $lat = $table[1]; 
    $des = $table[2];

トリッキーなビット。

chr(02)は、文字通り文字コード番号2 packです。バイナリ処理関数です。フォーマットといくつかのデータが必要です。 V= unsigned long(常に32ビット、リトルエンディアンのバイトオーダー)。

数学ビットを計算できると確信していますが、それらをリトルエンディアンの32ビット値に変換する必要があります。

.文字列連結演算子です。

最後に、chr(0)で終了します。ヌル文字。

$TT = chr(0x02).
  pack("V",strlen($des)+14).
  pack("V",round($lon*100000)).
  pack("V",round($lat*100000)).
  $des.chr(0x00); 

それを書き出してファイルを閉じます。

    @fwrite($fp, "$TT"); 
} 
fclose($fp);
于 2012-08-03T13:43:13.813 に答える
0

JAVA で重要なのは、適切なバイト オーダー ByteOrder.LITTLE_ENDIAN を ByteBuffer に適用することです。

関数全体:

private static boolean getWaypoints(ArrayList<Waypoint> geopoints, File f)
{
try{
FileOutputStream fs = new FileOutputStream(f);

for (int i=0;i<geopoints.size();i++)
{

     fs.write((byte)0x02);
     String desc = geopoints.get(i).getName();

     int poiLength = desc.toString().length()+14;
     fs.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(poiLength).array());

     int lon = (int)Math.round((geopoints.get(i).getLongitudeE6()/1E6)*100000);
     fs.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(lon).array());        

     int lat = (int)Math.round((geopoints.get(i).getLatitudeE6()/1E6)*100000);
     fs.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(lat).array());


     fs.write(desc.toString().getBytes());

     fs.write((byte)0x00);

}


    fs.close();

    return true;

}
catch (Exception e)
{
    return false;
}


}
于 2014-08-21T10:51:19.797 に答える