Lire un fichier .ov2 [Résolu]

- 9 sept. 2015 à 17:53 - Dernière réponse :
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 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
Afficher la suite 

Votre réponse

11 réponses

Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 9 sept. 2015 à 20:32
0
Merci
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.
Messages postés
5
Date d'inscription
mercredi 9 septembre 2015
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.
Commenter la réponse de Whismeril
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 9 sept. 2015 à 21:56
0
Merci
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
Messages postés
5
Date d'inscription
mercredi 9 septembre 2015
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
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
>
Messages postés
5
Date d'inscription
mercredi 9 septembre 2015
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/
Commenter la réponse de Whismeril
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
- 10 sept. 2015 à 09:55
Messages postés
5
Date d'inscription
mercredi 9 septembre 2015
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 !
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
>
Messages postés
5
Date d'inscription
mercredi 9 septembre 2015
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.
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
>
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 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
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
>
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
- 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
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 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.
Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.