Lire un fichier .ov2

Résolu
Gutt_V - 9 sept. 2015 à 17:53
Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 - 13 sept. 2015 à 21:25
Bonjour,
Utilisateur très amateur et autodidacte de visual studio 2013, je cherche à lire (et à terme écrire aussi) des fichiers .ov2
Ces fichiers sont des listes de coordonnées GPS avec un libellé.
Je connais la structure de ces fichiers :
1 byte T: type (always 2)
4 bytes L: length of this record in bytes (including the T and L fields)
4 bytes X: longitude coordinate of the POI
4 bytes Y: latitude coordinate of the POI
L?13 bytes Name: zero?terminated ASCII string specifying the name
of the POI


N'ayant jamais utilisé ce genre de fichier, j'ai recherché de l'aide sur les forums mais rien de concluant.
Quelqu'un peut-il m'aiguiller avant de m'arracher mes derniers cheveux ?

Merci

3 réponses

Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 655
9 sept. 2015 à 20:32
Bonsoir ce que tu décris est un fichier binaire.
Voir cet article.
https://msdn.microsoft.com/fr-fr/library/9tk3bdxw.aspx

si tu veux avoir un aperçu de ton fichier pour travailler à ton programme, je te conseille xvi32.
0
Gutt_V Messages postés 5 Date d'inscription mercredi 9 septembre 2015 Statut Membre Dernière intervention 17 septembre 2015
9 sept. 2015 à 21:08
Merci de cette réponse rapide.
J'avais consulté la page de Microsoft, mais cela ne me renseigne pas sur la manière de récupérer les différents enregistrements contenus dans les différentes lignes du fichier.
En gros, j'aimerais récupérer chaque donnée et la stocker dans un tableau, mais je n'arrive pas récupérer ces données.
0
Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 655
9 sept. 2015 à 21:56
Déjà ça va dépendre si tu passes par file.readallbyte ou par le stream, donc en gros de la taille de tes fichiers.

Avec la première méthode tu vas avoir en ram le contenu complet de ton fichier et ensuite la même quantité de données retranscrites. Donc pour un fichier de 500mo tu as besoin de 1 go de ram.

Dans le second cas tu vas piquer morceau par morceau le contenu du fichier, et donc en gros diviser par deux la ram nécessaire.

Ensuite tout stocker en vrac dans un tableau n'est pas judicieux, d'une par il va te falloir parcourir une fois le fichier pour connaître la taille a appliquer à ton tableau avant de le remplir et d'autre part si tu veux ajouter ou supprimer des éléments c'est galère. Les List sont beaucoup plus simples et souples à utiliser.

Ce que je ferais, c'est écrire une classe Poi avec comme propriétés au moins les coordonnées et le nom.
Je mettrais en paramètre du contructeur un tableau de byte qui correspond à une entrée, celui-ci se chargeant de convertir en données utilisables, voir ici pour un double https://msdn.microsoft.com/fr-fr/library/system.bitconverter.todouble(v=vs.110).aspx

Quand à la façon de fournir le bon tableau de byte au constructeur et bien, il faut que tu choisisses la méthode de lecture
0
Gutt_V Messages postés 5 Date d'inscription mercredi 9 septembre 2015 Statut Membre Dernière intervention 17 septembre 2015
9 sept. 2015 à 23:13
Wouaw... Je sens qu'il va me falloir franchir un nouveau cap en programmation !
Mais, maintenant j'ai une piste avec ton post et BitConverter.
Je vais la suivre et voir où ça me mène.
Je reviendrais plus tard si je coince.

encore merci
0
Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 655 > Gutt_V Messages postés 5 Date d'inscription mercredi 9 septembre 2015 Statut Membre Dernière intervention 17 septembre 2015
10 sept. 2015 à 07:57
Bonjour tu trouveras tout ce qu'il te faut pour bien appréhender vb.net ici
http://plasserre.developpez.com/cours/vb-net/
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 sept. 2015 à 09:55
0
Gutt_V Messages postés 5 Date d'inscription mercredi 9 septembre 2015 Statut Membre Dernière intervention 17 septembre 2015
10 sept. 2015 à 10:23
Génial ! MERCI.
C'est exactement ce que je voulais faire.
D'un coté, c'est pas marrant, ça tombe tout cuit... d'un autre côté, je comprends plein de trucs et je vais pouvoir progresser.
Un grand merci à tous !
0
Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 655 > Gutt_V Messages postés 5 Date d'inscription mercredi 9 septembre 2015 Statut Membre Dernière intervention 17 septembre 2015
10 sept. 2015 à 13:43
Et bien tu peux t'amuser à le refaire, ce code n'utilise pas grand chose de .Net.
Il a écrit un module de conversion alors que les classes existent déjà.
Ca mériterait un petit rafraîchissement.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024
13 sept. 2015 à 00:59
Bonjour ! Regarde là
http://codes-sources.commentcamarche.net/source/34322-net2-lecteur-de-fichier-tomtom-binary-ov2

Pour rendre cette source plus NET
1) supprimer les 2 modules
2) garder la feuille principale avec son design et y mettre ce code

Voici le petit rafraichissement bien mérité

Imports System.IO
Imports System.Runtime.InteropServices

Public Class frmPOI

Private Sub ButtonLoadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonLoadFile.Click

Dim fDialog As New OpenFileDialog
Dim sFilename As String
Dim j As Integer = 1

fDialog.Filter = "Fichier TomTom Binary (*.ov2)|*.ov2"

'si ok sur boite de dialogue
If fDialog.ShowDialog = Windows.Forms.DialogResult.OK Then

sFilename = fDialog.FileName
Me.Text = "Editeur POI pour TomTom" & " - [" & sFilename & "]"

'variables
Dim Octets() As Byte = Nothing
Dim c As Integer = 0 'compteur
Dim sName As String
Dim cWatch As New Stopwatch
Dim sValue As Integer
Dim iLength As Integer

cWatch.Start() 'démarre le chrono

'lecture du fichier en hexa
Octets = My.Computer.FileSystem.ReadAllBytes(sFilename)

ListView1.Items.Clear()
ListView1.SuspendLayout()

'------------------------------
'traitement...."
'------------------------------
While (Not Octets.Length <= c + 1)

ListView1.Items.Add(j.ToString)
'récupération de la longeur du POI
iLength = Marshal.ReadInt32(Octets, c + 1)

'recuperation de la description
sName = ""
For i As Integer = (c + 13) To (c + iLength - 2)
sName += Convert.ToChar(Octets(i))
Next
ListView1.Items(j - 1).SubItems.Add(sName)

'récuperation de la longitude (4 octets; position du 6ième au 9ième octets dans chaque POI)
sValue = Marshal.ReadInt32(Octets, c + 5)
ListView1.Items(j - 1).SubItems.Add((Convert.ToDouble(sValue) / 100000).ToString)

'recuperation de la latitude (idem pour la latitude sur 4 octets; du 10ième au 13ième)
sValue = Marshal.ReadInt32(Octets, c + 9)
ListView1.Items(j - 1).SubItems.Add((Convert.ToDouble(sValue) / 100000).ToString)

'compteurs
c += iLength 'du pointeur dans le fichier
j += 1 'nombre de points
End While

'affichage des resultats
ListView1.ResumeLayout()
StatusStrip1.Items(0).Text = "Durée du chargement: " & cWatch.ElapsedMilliseconds.ToString & " millisecondes"
StatusStrip1.Items(1).Text = ListView1.Items.Count & " points trouvés"

End If

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'dimension des colonnes
ListView1.Columns(0).Width = 30
ListView1.Columns(1).Width = 390
ListView1.Columns(2).Width = 70
ListView1.Columns(3).Width = 70

End Sub

End Class
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
13 sept. 2015 à 18:42
Pour ceux qui veulent la source complète avec zip c'est ici :http://codes-sources.commentcamarche.net/source/101163-lecteur-fichier-ov2-en-vb-net
0
Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 655
13 sept. 2015 à 21:25
Bonsoir, j'ai mis la mienne ici
http://codes-sources.commentcamarche.net/source/101162-lecteur-ov2

Je finaliserai un peu plus tard, mais j'ai opté pour un principe différent, lecture avec filestream et binaryreader, stockage dans une d'une classe métier et binding sur un datagridview.

C'est codé vite fait, j'y reviendrais un peu plus tard.
0
Rejoignez-nous