<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Digital Divide &#187; POI</title>
	<atom:link href="http://www.simonecampora.com/blog/tag/poi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.simonecampora.com/blog</link>
	<description>Simone Campora's Blog: about Databases, GIS, RIA and more...</description>
	<lastBuildDate>Tue, 13 Jul 2010 10:15:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Reading .OV2 TomTom POI Files using Java or C#</title>
		<link>http://www.simonecampora.com/blog/2009/12/31/reading-ov2-tomtom-poi-files-using-java/</link>
		<comments>http://www.simonecampora.com/blog/2009/12/31/reading-ov2-tomtom-poi-files-using-java/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 10:20:35 +0000</pubDate>
		<dc:creator>simonecampora</dc:creator>
				<category><![CDATA[GIS]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[free sofware]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[OV2]]></category>
		<category><![CDATA[POI]]></category>
		<category><![CDATA[TomTom One]]></category>

		<guid isPermaLink="false">http://www.simonecampora.com/blog/?p=159</guid>
		<description><![CDATA[
I&#8217;m posting today some source code about the famous TomTom One .OV2 file formats. These files are the one used by TomTom to store Point of Interest information within their navigation systems. However such format is proprietary, the data specs can be found in the TomTom website (see this PDF at section 2.4). I wrote [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.simonecampora.com/blog/wp-content/uploads/2009/12/tom-tom-one.png"><img class="aligncenter size-thumbnail wp-image-171" title="tom-tom-one" src="http://www.simonecampora.com/blog/wp-content/uploads/2009/12/tom-tom-one-150x150.png" alt="" width="150" height="150" /></a></p>
<p style="text-align: justify;">I&#8217;m posting today some source code about the famous TomTom One .OV2 file formats. These files are the one used by TomTom to store Point of Interest information within their navigation systems. However such format is proprietary, the data specs can be found in the TomTom website (<a href="http://www.tomtom.com/support/ce/downloads/ttnavsdk_manual.pdf">see this PDF</a> at section 2.4). I wrote down a simple procedure that gathers record by record only the simple POI records. Actually the OV2 format is a little bit more complicated than a simple list of POIs and it can be subjected to changes and version incompatibilities. I tested it with POIs taken from my TomTom ONE XL and ti worked great, however if the OV2 files contains proprietary or special record types (not specified in TomTom data sheets) these procedures will simply stop since it is not possible for this format to distinguish between a corrupted file or non standard encoding.</p>
<p style="text-align: justify;">I hope you&#8217;ll find it interesting.</p>
<p style="text-align: justify;">Java version:</p>
<pre class="brush: java;">
package readers;

import java.io.FileInputStream;
import java.io.IOException;

public class OV2RecordReader {

	public static String[] readOV2Record(FileInputStream inputStream){
		String[] record = null;
		int b = -1;
		try{
			if ((b = inputStream.read())&gt; -1) {
				// if it is a simple POI record
				if (b == 2) {
					record = new String[3];
		    	    long total = readLong(inputStream);

		    	    double longitude = (double) readLong(inputStream) / 100000.0;
		    	    double latitude = (double) readLong(inputStream) / 100000.0;

		    	    byte[] r = new byte[(int) total - 13];
		    	    inputStream.read(r);

		    	    record[0] = new String(r);
		    	    record[0] = record[0].substring(0,record[0].length()-1);
		    	    record[1] = Double.toString(latitude);
		    	    record[2] = Double.toString(longitude);
		    	}
				//if it is a deleted record
				else if(b == 0){
					byte[] r = new byte[9];
		    	    inputStream.read(r);
				}
				//if it is a skipper record
				else if(b == 1){
					byte[] r = new byte[20];
		    	    inputStream.read(r);
				}
				else{
					throw new IOException(&quot;wrong record type&quot;);
				}
			}
			else{
				return null;
			}
		}
		catch(IOException e){
			e.printStackTrace();
		}
		return record;
	}

	private static long readLong(FileInputStream is){
		long res = 0;
		try{
			res = is.read();
			res += is.read() &lt;&lt;8;
			res += is.read() &lt;&lt;16;
			res += is.read() &lt;&lt;24;
		}
		catch(IOException e){
			e.printStackTrace();
		}
		return res;
	}
}
</pre>
<p>C# Version</p>
<pre class="brush: csharp;">

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace OV2Reader
{
 class Program
 {
 static void Main(string[] args)
 {
 string filename = @&quot;C:\test.ov2&quot;;
 FileStream infile = new FileStream(filename, FileMode.Open, FileAccess.Read);

 while (infile.Length != infile.Position)
 {
 string[] data = readOV2Record(infile);
 if (data != null)
 {
 for (int i = 0; i &lt; data.Length; i++)
 {
 Console.WriteLine(data[i]);
 }
 }
 }

 Console.WriteLine(&quot;exiting....&quot;);
 Console.ReadKey();
 }

 static string[] readOV2Record(FileStream inputStream)
 {
 String[] record = null;
 int b = -1;

 if ((b = inputStream.ReadByte()) &gt; -1)
 {
 // if it is a simple POI record
 if (b == 2)
 {

 long total = readLong(inputStream);

 double longitude = (double)readLong(inputStream) / 100000.0;
 double latitude = (double)readLong(inputStream) / 100000.0;

 byte[] r = new byte[(int)total - 13];
 inputStream.Read(r, 0, (int)total - 13);

 record = new String[3];
 string s = System.Text.ASCIIEncoding.ASCII.GetString(r);
 record[0] = s;
 record[0] = record[0].Substring(0, record[0].Length - 1);
 record[1] = latitude.ToString();
 record[2] = longitude.ToString();
 }
 //if it is a deleted record
 else if (b == 0)
 {
 byte[] r = new byte[9];
 inputStream.Read(r, 0, 9);
 }
 //if it is a skipper record
 else if (b == 1)
 {
 byte[] r = new byte[20];
 inputStream.Read(r, 0, 20);
 }
 else
 {
 //
 return null;
 }
 }
 else
 {
 return null;
 }

 return record;
 }

 private static long readLong(FileStream fis)
 {
 long res = 0;

 res = fis.ReadByte();
 res += fis.ReadByte() &lt;&lt; 8;
 res += fis.ReadByte() &lt;&lt; 16;
 res += fis.ReadByte() &lt;&lt; 24;
 return res;
 }
 }
}
</pre>
<p><a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Facebook" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Digg" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/myspace?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="MySpace" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/myspace.png" width="16" height="16" alt="MySpace"/></a> <a href="http://www.addtoany.com/add_to/hotmail?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Hotmail" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/live.png" width="16" height="16" alt="Hotmail"/></a> <a href="http://www.addtoany.com/add_to/msdn?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="MSDN" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/msdn.png" width="16" height="16" alt="MSDN"/></a> <a href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="WordPress" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a> <a href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Orkut" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a> <a href="http://www.addtoany.com/add_to/yahoo_bookmarks?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Yahoo Bookmarks" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/yahoo.png" width="16" height="16" alt="Yahoo Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Twitter" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/technorati_favorites?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23" title="Technorati Favorites" rel="nofollow" target="_blank"><img src="http://www.simonecampora.com/blog/wp-content/plugins/add-to-any/icons/technorati.png" width="16" height="16" alt="Technorati Favorites"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.simonecampora.com%2Fblog%2F2009%2F12%2F31%2Freading-ov2-tomtom-poi-files-using-java%2F&amp;linkname=Reading%20.OV2%20TomTom%20POI%20Files%20using%20Java%20or%20C%23">Share/Bookmark</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.simonecampora.com/blog/2009/12/31/reading-ov2-tomtom-poi-files-using-java/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>
