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