2

我试图弄清楚如何创建一个 .ov2 文件以将 POI 数据添加到 TomTom GPS 设备。数据的格式需要如下:

OV2 文件由 POI 记录组成。每条记录具有以下数据格式。

  • 1 BYTE、char、POI 状态('0' 或 '2')
  • 4 BYTES,长,表示 POI 记录的长度。
  • 4 BYTES, long, 经度 * 100000
  • 4 字节,长,纬度 * 100000
  • x BYTES,字符串,POI 的标签,x =3D=3D 总长度 =96 (1 + 3 * 4)
  • 终止空字节。

我发现以下 PHP 代码应该采用 .csv 文件,逐行浏览它,拆分每条记录,然后以适当的格式将其写入一个新文件。我希望有人能帮我把它翻译成 Java。我真的只需要我用'--->'箭头标记的行。我根本不了解 PHP,但除了这一行之外的所有内容都足够基本,我可以查看并翻译它,但我不知道 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++) { 

右修剪行(删除所有空格),并用','分割字符串。$table是来自 csv 行的值数组。

    $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 回答