Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java生成.ov2文件_Java_Php_Tomtom - Fatal编程技术网

用Java生成.ov2文件

用Java生成.ov2文件,java,php,tomtom,Java,Php,Tomtom,我想知道如何创建一个.ov2文件,将POI数据添加到TomTom GPS设备。数据格式需要如下所示: OV2文件由POI记录组成。每个记录具有以下数据格式 1字节、字符、POI状态('0'或'2') 4字节长,表示POI记录的长度 4字节,长,经度*100000 4字节,长,纬度*100000 x字节,字符串,POI标签,x=3D=3D总长度=96(1+3*4) 终止空字节 我发现下面的PHP代码应该是一个.csv文件,逐行检查,分割每条记录,然后以正确的格式将其写入一个新文件。我希望有人能

我想知道如何创建一个.ov2文件,将POI数据添加到TomTom GPS设备。数据格式需要如下所示:

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

  • 1字节、字符、POI状态('0'或'2')
  • 4字节长,表示POI记录的长度
  • 4字节,长,经度*100000
  • 4字节,长,纬度*100000
  • x字节,字符串,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);
?>

将文件加载到数组中,其中每个元素都是文件中的一行

$csv = file("File.csv"); 
    @fwrite($fp, "$TT"); 
} 
fclose($fp);
计算数组中的元素数

$nbcsv = count($csv); 
打开输出文件进行写入

$file = "POI.ov2"; 
$fp = fopen($file, "w"); 
$i
<数组项的数量,
$i++

for ($i = 0; $i < $nbcsv; $i++) { 
通过数字索引将表的组成部分分配给它们自己的变量

    $lon = $table[0]; 
    $lat = $table[1]; 
    $des = $table[2];
棘手的一点

chr(02)字面上是字符代码2。
pack
是一个二进制处理函数。它需要一种格式和一些数据。
V
=无符号长(总是32位,字节顺序)

我相信你可以算出数学位,但你需要把它们转换成32位的顺序值

是字符串concat运算符

最后,它以chr(0)终止。空字符

$TT = chr(0x02).
  pack("V",strlen($des)+14).
  pack("V",round($lon*100000)).
  pack("V",round($lat*100000)).
  $des.chr(0x00); 
写出来并关闭文件

$csv = file("File.csv"); 
    @fwrite($fp, "$TT"); 
} 
fclose($fp);

JAVA中的关键是对ByteBuffer应用正确的字节顺序ByteOrder.LITTLE_ENDIAN

整个功能:

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;
}


}
专用静态布尔getWaypoints(ArrayList地理点,文件f)
{
试一试{
FileOutputStream fs=新的FileOutputStream(f);

对于(int i=0;我已经在谷歌上搜索过这些方法的功能了吗?谢谢,这真是太棒了。我有一个想法,pack函数就是这样的,但是我完全被用来表示字符串的点
符号弄糊涂了。我太习惯了
被用来调用方法或函数。当我看到我在想它是以某种方式递归调用pack函数,而不是按顺序调用。谢谢您的解释。@kei23th FYI,PHP的“对象运算符”(它相当于Java的
)PHP中的is
->
+
进行算术加法并计算数组系数,但在字符串上使用时可能会产生奇数结果,因为它试图将字符串转换为数字(PHP的类型极为混乱)并执行算术加法。大多数情况下,结果将是
int(0)